您当前的位置:首页 > 计算机 > 编程开发 > Python

A股股票基础日K线数据

时间:11-10来源:作者:点击数:

Python获取全部A股股票日K线基础数据,来自某财。

看到网站上很多人在找,曾经因为自己也为此苦恼过, 所以希望能提供一点点帮助。

数据格式如下:

名称 类型 描述
日期 object 交易日
股票代码 object 不带市场标识的股票代码
开盘 float64 开盘价
收盘 float64 收盘价
最高 float64 最高价
最低 float64 最低价
成交量 int64 注意单位: 手
成交额 float64 注意单位: 元
振幅 float64 注意单位: %
涨跌幅 float64 注意单位: %
涨跌额 float64 注意单位: 元
换手率 float64 注意单位: %

以下是Python代码,网站封IP是肯定的,和程序没关系,自个调整吧。 

# !/usr/bin/env python
# coding=utf-8
 
import gc
import random
import time
from urllib.parse import urlencode
 
import akshare as ak
import pandas as pd
import requests
 
 
def get_k_history(stock_code):
    """
    功能获取k线数据
    Parameters
    ----------
    code : 6 位股票代码
    beg: 开始日期 例如 20200101
    end: 结束日期 例如 20200201
    klt: k线间距 默认为 101 即日k
        klt:1 1 分钟
        klt:5 5 分钟
        klt:101 日
        klt:102 周
    fqt: 复权方式
        不复权 : 0
        前复权 : 1
        后复权 : 2
    Return
    ------
    DateFrame : 包含股票k线数据
    """
    # 开始和结束时间设置的比较夸张,为了下全数据
    beg = '19700101'
    end = "22240101"
    klt = 101  # 日线数据
    fqt = 1    # 前复权
    EastmoneyKlines = {'f51': 'date', 'f52': 'open', 'f53': 'close', 'f54': 'high', 'f55': 'low', 'f56': 'volume',
                       'f57': 'amount', 'f58': 'AMP', 'f59': 'pctChg', 'f60': 'prcChg', 'f61': 'turn', }
    EastmoneyHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko',
                        'Accept': '*/*',
                        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                        'Referer': 'http://quote.eastmoney.com/center/gridlist.html', }
    fields = list(EastmoneyKlines.keys())
    columns = list(EastmoneyKlines.values())
    fields2 = ",".join(fields)
    market_code = 1 if stock_code.startswith("6") else 0
    params = (
        ('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'), ('fields2', fields2), ('beg', beg), ('end', end),
        ('rtntype', '6'), ('secid', f"{market_code}.{stock_code}"), ('klt', f'{klt}'), ('fqt', f'{fqt}'),)
    base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get'
    url = base_url + '?' + urlencode(params)
    while True:
        try:
            response = requests.get(url, headers=EastmoneyHeaders, timeout=50)
            if response.status_code == 200:
                print("Stock Base Data Requested successfully.")
                break
            else:
                print(f"Unexpected status code: {response.status_code}")
                time.sleep(random.randint(1, 3))
        except (requests.exceptions.ReadTimeout, requests.exceptions.ConnectTimeout) as e:
            print("Error:", e)
            time.sleep(random.randint(1, 3))
 
    json_response = response.json()
    if json_response is None:
        print("JSON响应为空")
        return
    else:
        data = json_response.get('data')
        if data is None:
            print("未找到 'data' 键")
            return
        else:
            name = data.get('name')
            if name is None:
                print("未找到 'name' 键")
                return
 
    klines = data['klines']
    rows = []
    for _kline in klines:
        kline = _kline.split(',')
        rows.append(kline)
 
    df_dk = pd.DataFrame(rows, columns=columns)
    if len(df_dk) < 1:
        print(stock_code, name, "没有数据。。。。。。")
        return
 
    code_column_data = pd.Series(stock_code, index=df_dk.index)
    df_dk.insert(loc=1, column='code', value=code_column_data)
    name_column_data = pd.Series(name, index=df_dk.index)
    df_dk.insert(loc=2, column='name', value=name_column_data)
 
    # 保存文件的路径, 自行调整
    file_name = f"D:\\stockdata\\stockbase\\{stock_code}.csv"
    df_dk.to_csv(file_name, mode="w", header=True, encoding="gbk", index=False)
 
    # 小内存机器,建议保留以下两行,减少内存占用
    del df_dk
    # 手动触发垃圾回收
    gc.collect()
 
    # time.sleep(random.randint(1, 3))
 
    return
 
 
if __name__ == '__main__':
 
    start_time = time.time()
    # 获取上市A股清单
    df_list = ak.stock_info_a_code_name()
    for cnt in range(len(df_list)):
        code = df_list.iloc[cnt]['code']
        name = df_list.iloc[cnt]['name']
 
        print(cnt, code, name)
        get_k_history(code)
 
    end_time = time.time()
    # 计算运行时长
    duration = end_time - start_time
    print("运行时长:", duration)

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐