A股股票列表下载——从零到实盘2

目前实盘主要用到的是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
欢迎大家转发、留言。有微信群用于学习交流,感兴趣的读者请扫码加微信!
如果认为博客对您有帮助,可以扫码进行捐赠,感谢!

微信二维码微信捐赠二维码
在这里插入图片描述在这里插入图片描述
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值