发布时间:2025-12-10 19:36:35 浏览次数:5
股票日线数据下载——从零到实盘3「终于解决」前文介绍了从BaoStock下载股票代码,本文记录利用这些股票代码下载股票日线数据的过程。源代码参考前文,新建源文件,新文件命名为download_data_v2.py,源代码如下:importbaostockasbsimportdatetimeimportsys”’功能:返回指定日期的A股代码列表若参数date为空,则返回最近1个交易日的A股代码列表若参数date不为空,且为交易日,则返回date当日的A股代码列表若参数date不为空,但不为交易日,则打印提示非交易日.
前文介绍了从BaoStock下载股票代码,本文记录利用这些股票代码下载股票日线数据的过程。参考前文,新建源文件,新文件命名为data_center_v2.py,全部内容见文末,v2比v1新增了函数create_data:
def create_data(stock_codes, from_date='1990-12-19', to_date=datetime.date.today().strftime('%Y-%m-%d'), adjustflag='2'): 是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…
该函数用于下载指定日期内,指定股票的日线数据。其中:
参数stock_codes为待下载数据的股票代码 参数from_date为日线开始日期,默认为1990-12-19 参数to_date为日线结束日期,默认为函数调用当日 参数adjustflag为复权选项,为1时表示后复权,为2时表示前复权,为3时表示不复权,默认为前复权 返回值为空 for code in stock_codes: 下载股票循环。
bs.login() 登录BaoStock,每次从BaoStock查询数据前,都需要先登录。
out_df = bs.query_history_k_data_plus(code, g_baostock_data_fields, start_date=from_date, end_date=to_date, frequency='d', adjustflag=adjustflag).get_data() 调用BaoStock的query_history_k_data_plus函数,该函数官方文档说明如下:
方法说明:通过API接口获取A股历史交易数据,可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据,适合搭配均线数据进行选股和分析。
返回类型:pandas的DataFrame类型。
能获取1990-12-19至当前时间的数据;
可查询不复权、前复权、后复权数据。
这里我们定义了全局变量g_baostock_data_fields来记录需要下载的日线数据字段:
g_baostock_data_fields = 'date,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ, psTTM,pcfNcfTTM,isST' 更多说明参见可参考官方链接。
将下载数据转为DataFrame。同query_all_stock函数一样,query_history_k_data_plus的返回值类型也是<class ‘baostock.data.resultset.ResultData’>,而非DataFrame,也通过get_data函数返回DataFrame类型的数据。
bs.logout() 注销BaoStock登录。
if out_df.shape[0]: out_df = out_df[(out_df['volume'] != '0') & (out_df['volume'] != '')] 剔除停盘数据并打印最终下载数据结果。在回测过程中,通常不需要停盘数据对回测造成干扰,这里选择直接将这些数据删除。当out_df不为空时,筛选出成交量为非’0’或者空字符’’的行,即剔除了停盘数据。这里需要注意的是,从BaoStock下载的日线数据元素类型均为object,因此这里要使用str类型’0’作判断,而非整形0。
以603016新宏泰为例,该股票在2017-12-21至2017-12-28停盘,我们截取2017-12-20至2017-12-29之间的数据打印,只选择打印列date、open、close、volume
print(out_df[(out_df['date'] >= '2017-12-20') & (out_df['date'] <= '2017-12-29')][['date', 'open', 'close', 'volume']]) # test code 打印结果为:
date open close volume360 2017-12-20 37.2596538300 37.0382545500 438502367 2017-12-29 33.3390415800 33.3390415800 101000 如果不剔除停盘数据,打印结果为:
date open close volume360 2017-12-20 37.2596538300 37.0382545500 438502361 2017-12-21 37.0382545500 37.0382545500 0362 2017-12-22 37.0382545500 37.0382545500 0363 2017-12-25 37.0382545500 37.0382545500 0364 2017-12-26 37.0382545500 37.0382545500 0365 2017-12-27 37.0382545500 37.0382545500 0366 2017-12-28 37.0382545500 37.0382545500 0367 2017-12-29 33.3390415800 33.3390415800 101000 可以看到,2017-12-21至2017-12-28停盘期间volume的值均为’0’(也有时空字符’’的情况),open、close值与停盘前相同(low、high与停盘前也相同)。在后续使用数据时,如果不剔除停盘数据,这些点需要注意。
至此,程序能够打印下载的所有数据。data_center_v2.py是一个临时版本,不需要等待程序都执行完毕,只要确保程序能正常运行即可。这里只对数据进行了打印,没有存储数据,后续会使用下载的数据计算扩展指标,改为多进程,最后再将数据存入MySQL。
data_center_v2.py的全部代码如下:
import baostock as bsimport datetimeimport sys# BaoStock日线数据字段g_baostock_data_fields = 'date,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ, psTTM,pcfNcfTTM,isST'def get_stock_codes(date=None):""" 获取指定日期的A股代码列表 若参数date为空,则返回最近1个交易日的A股代码列表 若参数date不为空,且为交易日,则返回date当日的A股代码列表 若参数date不为空,但不为交易日,则打印提示非交易日信息,程序退出 :param date: 日期 :return: A股代码的列表 """# 登录baostockbs.login()# 从BaoStock查询股票数据stock_df = bs.query_all_stock(date).get_data()# 如果获取数据长度为0,表示日期date非交易日if 0 == len(stock_df):# 如果设置了参数date,则打印信息提示date为非交易日if date is not None:print('当前选择日期为非交易日或尚无交易数据,请设置date为历史某交易日日期')sys.exit(0)# 未设置参数date,则向历史查找最近的交易日,当获取股票数据长度非0时,即找到最近交易日delta = 1while 0 == len(stock_df):stock_df = bs.query_all_stock(datetime.date.today() - datetime.timedelta(days=delta)).get_data()delta += 1# 注销登录bs.logout()# 筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]# 返回股票列表return stock_df['code'].tolist()def create_data(stock_codes, from_date='1990-12-19', to_date=datetime.date.today().strftime('%Y-%m-%d'), adjustflag='2'):""" 下载指定日期内,指定股票的日线数据 :param stock_codes: 待下载数据的股票代码 :param from_date: 日线开始日期 :param to_date: 日线结束日期 :param adjustflag: 复权选项 1:后复权 2:前复权 3:不复权 默认为前复权 :return: None """# 下载股票循环for code in stock_codes:print('正在下载{}...'.format(code))# 登录BaoStockbs.login()# 下载日线数据out_df = bs.query_history_k_data_plus(code, g_baostock_data_fields, start_date=from_date, end_date=to_date,frequency='d', adjustflag=adjustflag).get_data()# 注销登录bs.logout()# 剔除停盘数据if out_df.shape[0]:out_df = out_df[(out_df['volume'] != '0') & (out_df['volume'] != '')]print(out_df)if __name__ == '__main__':stock_codes = get_stock_codes()create_data(stock_codes) 博客内容只用于交流学习,不构成投资建议,盈亏自负!
个人博客:https://coderx.com.cn/(优先更新)
欢迎大家转发、留言。已建微信群用于学习交流,群1已满,群2已创建,感兴趣的读者请扫码加微信!