目前实盘主要用到的是A股的日线数据,在BaoStock、Tushare、AKShare等平台上,均能免费下载日线数据,我们先选择BaoStock作为数据源。本文记录从BaoStock下载A股股票列表的过程。
BaoStock安装
打开PyCharm,在下方Terminal窗口输入以下命令,完成安装:
pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
新建源文件
首先,新建源文件,鼠标右键点击PyCharm下Project窗口下的项目目录,例如我的项目目录是mnj,然后依次选择New->Python File:
输入新建文件的文件名,例如data_center_v1,在下方选择文件类型为Python file(默认):
主要代码分析
data_center_v1.py的全部内容见文末,代码主要定义了函数get_stock_codes:
def get_stock_codes(date=None):
该函数用于获取指定日期的A股代码列表。其中:
- 参数date为指定日期,默认为空
- 返回值为A股代码的列表
不同的date设置,会有3种情况:
- 若参数date为空,则返回最近1个交易日的A股代码列表
- 若参数date不为空,且为交易日,则返回date当日的A股代码列表
- 若参数date不为空,但不为交易日,则打印提示非交易日信息,程序退出
bs.login()
登录BaoStock,每次从BaoStock查询数据前,都需要先登录。
stock_df = bs.query_all_stock(date).get_data()
调用baostock的query_all_stock函数查询股票数据,该函数官方文档说明如下:
证券代码查询:query_all_stock()
方法说明:获取指定交易日期所有股票列表。通过API接口获取证券代码及股票交易状态信息,与日K线数据同时更新。可以通过参数‘某交易日’获取数据(包括:A股、指数),数据范围同接口query_history_k_data_plus()。
返回类型:pandas的DataFrame类型。
更新时间:与日K线同时更新。
其中返回类型经过测试存在问题,通过下面代码测试:
print(type(bs.query_all_stock())) # test code
打印结果为:
<class 'baostock.data.resultset.ResultData'>
该函数的返回类型为baostock自定义的数据类型,通过get_data函数可以获取Pandas DataFrame类型的返回结果:
print(type(bs.query_all_stock().get_data())) # test code
打印结果为:
<class 'pandas.core.frame.DataFrame'>
我们打印get_data返回的全部数据,部分结果如下,更多DataFrame打印设置可参考链接。
code tradeStatus code_name
0 sh.000001 1 上证综合指数
1 sh.000002 1 上证A股指数
2 sh.000003 1 上证B股指数
3 sh.000004 1 上证工业类指数
4 sh.000005 1 上证商业类指数
...
218 sh.600000 1 浦发银行
219 sh.600004 1 白云机场
220 sh.600006 1 东风汽车
221 sh.600007 1 中国国贸
222 sh.600008 1 首创环保
...
2189 sz.000001 1 平安银行
2190 sz.000002 1 万科A
2191 sz.000004 1 国华网安
2192 sz.000005 1 ST星源
2193 sz.000006 1 深振业A
...
4960 sz.399994 1 中证信息安全主题指数
4961 sz.399995 1 中证基建工程指数
4962 sz.399996 1 中证智能家居指数
4963 sz.399997 1 中证白酒指数
4964 sz.399998 1 中证煤炭指数
可以看到,结果中既包含股票代码,也包括一些指数的代码。其中,上证的代码以“sh.”开头,深证的代码以“sz.”开头。代码的命名方式在不同数据源的形式可能不同,例如在ptrade中,上证股票的代码以“.SS”结尾(如600000.SS),深证股票的代码以“.SZ”结尾(如000001.SZ)。
if 0 == len(stock_df):
如果获取数据长度为0,表示日期date非交易日。
if date is not None:
print('当前选择日期为非交易日或尚无交易数据,请设置date为历史某交易日日期')
sys.exit(0)
如果设置了参数date,则打印信息提示date为非交易日。例如,假如调用程序的当天为非交易日,调用函数时使用了如下代码:
stock_codes = get_stock_codes(datetime.datetime.today()) # test code
那么程序就会提示非交易日,并退出。如果想获取最近交易日的数据,不设置参数直接调用即可:
stock_codes = get_stock_codes() # test code
delta = 1
while 0 == len(stock_df):
stock_df = bs.query_all_stock(datetime.date.today() - datetime.timedelta(days=delta)).get_data()
delta += 1
如果没有设置参数date,则向历史查找最近的交易日,当获取股票数据长度非0时,即找到最近交易日。
bs.logout()
注销BaoStock登录。
stock_df = stock_df[(stock_df['code'] >= 'sh.600000') & (stock_df['code'] < 'sz.399000')]
筛选股票数据,上证和深证股票代码在sh.600000与sz.39900之间,更多DataFrame筛选的方法可参考链接。
return stock_df['code'].tolist()
返回股票列表。
当打印该函数返回值时,部分输出结果为:
['sh.600000', 'sh.600004', 'sh.600006', 'sh.600007', 'sh.600008', ...,'sz.301049', 'sz.301050', 'sz.301051', 'sz.301052', 'sz.301053']
小结
至此,A股股票列表获取完毕,下一篇文章记录从BaoStock下载这些股票的日线数据的方法。
data_center_v1.py的全部代码如下:
import baostock as bs
import datetime
import sys
def get_stock_codes(date=None):
"""
获取指定日期的A股代码列表
若参数date为空,则返回最近1个交易日的A股代码列表
若参数date不为空,且为交易日,则返回date当日的A股代码列表
若参数date不为空,但不为交易日,则打印提示非交易日信息,程序退出
:param date: 日期
:return: A股代码的列表
"""
# 登录baostock
bs.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 = 1
while 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()
if __name__ == '__main__':
stock_codes = get_stock_codes()
print(stock_codes)
博客内容只用于交流学习,不构成投资建议,盈亏自负!
个人博客:http://coderx.com.cn/(优先更新)
项目最新代码:https://gitee.com/sl/quant_from_scratch
欢迎大家转发、留言。有微信群用于学习交流,感兴趣的读者请扫码加微信!
如果认为博客对您有帮助,可以扫码进行捐赠,感谢!
微信二维码 | 微信捐赠二维码 |
---|---|
![]() | ![]() |