通过 python 获取金融数据-akshare
研究交易策略时,高质量数据是分析和构建交易策略的根本。你可能会遇到如下的一些问题。
- 数据从哪找?
- 数据怎么清理?
- 数据又该如何维护?
本文将先开始介绍第一个主题,即 “数据从哪里找?”,我将首先基于 Python 开源数据包 akshare 下载数据,为什么选择作为第一个数据源?因为它是完全免费的。
常见分类
在研究和构建策略时,基于目标不同,对数据的要求也不同。不同的数据适合不同的策略。找到合适的数据集,能显著提升策略。
市场价格数据,即开高低收和交易量数据,如果构建 CTA 策略,价格数据已经足够了;
公司财务数据,财务三大报表,如资产负债表、损益表,可助我们评估股票的长期投资价值,作为选股因子等;
宏观经济数据,比如 GDP、通胀率、就业情况或是针对不同行业的数据等,有助于评估整体经济、观周期或某个行业的前景等;
其他另类数据,也开始逐渐被重视,如像新闻、社交媒体信息等文本信息,重要人物的社交账号等,有助于我们及时抓住短期的波动;
这篇文章主要演示如上的这些数据的下载方法。
还想细化分类的话,不同角度还可以有不同分类,如:
从品种上,有股票、期货、期权、外汇、债券和基金的不同品种上的区别,如股票有财报数据,而期货可能更加关注供需分析;非场内基金的价格数据就没有了开高低收;期权还包含独特的衍生数据,即它的隐含波动率和各类希腊字母;如果你关注数字货币市场,还要关注一些链上的活动,如跟踪巨鲸的账户,识别链上地址的活跃度,大额转账。
从频率上,有小时线日线周线月线,还有高频数据,如分钟级、秒级甚至 tick 分笔的数据。对于如趋势追踪等 CTA 策略只要日线小时线级别即可,高频交易则要分析分钟或订单薄的分笔数据,这类高频数据的数据量会非常大,开源数据不会提供,购买的费用也相对贵一些。
注:我在淘宝上发现有卖高频数据,价格一般几百块,因为数据量巨大,还送硬盘,不过我没有买,也不知道真假。
数据的种类繁多,上面是一些常规分类。不同的交易策略,对数据的要求还是有很大区别,如你分析的是一些特殊事件对行业的影响,如美联储主席讲话对行情的实时影响,可能需要从视频提取字幕与行情相映射,还有如新冠疫情的影响,要收集每日的疫情数据,分析它和行情的关系。
选择数据源
对于数据源方面,我选择开源数据,如 akshare、tushare 和 yfinance。
akshare 是一个金融数据的 Python 包,数据种类繁多,主要是通过爬虫实时抓取网上的公开数据,提供国内股票、期货、外汇、宏观经济等多领域的金融数据接口,可以说,它的数据非常庞杂。
tushare,和 akshare 一样,是专注于国内市场,虽然它有积分要求,但积分的获取难度不高,如果是购买积分,500/年就能使用 90% 的数据。它的数据是单独维护管理的,毫无疑问,数据质量很高的,在性价比这块,没有其他数据源可比。
yfinance 是一个用于从 Yahoo Finance 获取金融数据的 Python 库。主要是国外市场,可下载如股票、期货、外汇等资产的历史市场数据,包括价格、交易量、公司财务数据等。
如果你已经有可用的 Python 环境,安装过程就非常简单,如下命令安装这三个 Python 包:
pip install akshare
pip install tushare
pip install yfinance
如果没有 Python 环境,可以去了解下 anaconda,用它安装我们的 Python 环境。
数据下载
本文目标是先通过 akshare 实现 Python 下载 A 股的数据,毕竟它是完全免费的,门槛最低。我会通过代码快速一览 akshare 获取这些数据的函数。而对于 tushare 和 yfinance,准备另外的篇章介绍。
还有,文中也不会提供数据样例,毕竟是太占用空间了。
先提前导入 Python 包:
import akshare as aks
市场价格
A 股股票:包括它的历史行情、实时行情和分笔数据的获取。
历史行情的接口示例:
# 日线/周线/月线
aks.stock_zh_a_hist(symbol="000001",
start_date="20200101",
end_date="20241201",
period="daily", # daily/weekly/monthly
adjust="qfq") # qfq-前复权/hfq-后复权/默认不复权
# 日线
aks.stock_zh_a_daily(symbol="sz000001",
start_date="20200101",
end_date="20241201",
adjust="qfq")
# 分钟线
aks.stock_zh_a_minute(symbol="sz000001",
period="1", # 1-1分钟/5-5分钟/15-15分钟/30-30分钟/60-1小时
adjust="qfq")
如上的代码演示了获取 A 股市场日线/周线/月线/小时/分钟级别的历史行情数据的函数。
日线数据示例:
日期 股票代码 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率
0 2020-01-02 000001 14.77 14.99 15.07 14.67 1530232 2.571196e+09 2.75 2.88 0.42 0.79
1 2020-01-03 000001 15.06 15.30 15.43 15.04 1116195 1.914495e+09 2.60 2.07 0.31 0.58
2 2020-01-06 000001 15.13 15.19 15.46 15.03 862084 1.477930e+09 2.81 -0.72 -0.11 0.44
3 2020-01-07 000001 15.25 15.27 15.40 15.07 728608 1.247047e+09 2.17 0.53 0.08 0.38
4 2020-01-08 000001 15.12 14.78 15.17 14.75 847824 1.423609e+09 2.75 -3.21 -0.49 0.44
因为 akshare 的数据是从直接财经网站拉取的,不同站的 symbol 规则有所差异,如 stock_zh_a_hist
是东方财富的接口,symbol 为 000001 即可,而其余两个接口是 sina 新浪财经,要加上交易所前缀:深交所-sz和上交所-sh。
还有一点,我测试发现,分钟到小时级别的数据接口只能返回有限的数据,不是全量。不过这个也还好,如果确有需求,可以通过其他渠道拿到历史全量数据,通过这个接口获取增量数据。
实时行情的接口示例:
aks.stock_zh_a_spot()
输出示例:
代码 名称 最新价 涨跌额 涨跌幅 买入 卖出 昨收 今开 最高 最低 成交量 成交额 时间戳
0 bj430017 星昊医药 15.35 -0.36 -2.292 15.32 15.35 15.71 15.86 15.87 15.28 1922319.0 29838001.0 15:30:01
1 bj430047 诺思兰德 13.57 -0.51 -3.622 13.56 13.57 14.08 14.12 14.18 13.44 3269916.0 45133670.0 15:30:01
2 bj430090 同辉信息 7.56 -0.27 -3.448 7.56 7.57 7.83 7.89 8.01 7.53 7122586.0 54781060.0 15:30:01
3 bj430139 华岭股份 28.69 -1.87 -6.119 28.68 28.69 30.56 30.26 30.59 28.52 8799534.0 258453787.0 15:30:01
4 bj430198 微创光电 13.38 -0.36 -2.620 13.37 13.38 13.74 13.62 14.08 13.00 4379609.0 59129424.0 15:30:01
这个接口返回的是全部股票的实时行情数据,请求耗时较长,确实在可用性不怎么好,tushare 上也有实时行情接口 realtime_quote
,同样是从各个财经站点上抓取的,不过封装的更好。
当日的分笔数据的接口示例:
aks.stock_zh_a_tick_tx_js(symbol="sz000001")
这个接口返回的是某个股票当日的每笔成交列表。
A 股指数: 以沪深 300 为例,演示 akshare 获取股票指数的历史和实时行情的函数。
历史行情的演示示例:
# 日线
aks.stock_zh_index_daily(symbol="sh000300") # sina
aks.stock_zh_index_daily_tx(symbol="sh000300") # tencent
aks.stock_zh_index_daily_em(symbol="sh000300") # 东方财富
这个接口会直接拉取指定指数的全部日线行情。
实时行情的演示示例:
aks.stock_zh_index_spot_sina() # sina
aks.stock_zh_index_spot_em() # 东方财富
这两个接口都是获取当前的实时行情,不过它返回的是一个全部数据的 pd.Dataframe
,没有提供 symbol 参数指定指数 Symbol,要简单过滤才能拿到指定的 symbol 数据。
搞到这里,你会发现 akshare 没有在易用性投入太多处理。如果你查看它的数据接口列表,它更多还是一个数据大杂烩,很多数据都能找到。但受限于全部来源于公开数据,没有存储下来,更像是给我提供了数据采集渠道,我们还有更多的工作要做。
财务数据
A 股三大报表:
aks.stock_financial_report_sina(stock="sz000001", symbol="资产负债表")
aks.stock_financial_report_sina(stock="sz000001", symbol="利润表")
aks.stock_financial_report_sina(stock="sz000001", symbol="现金流量表")
如资产负载表数据示例:
报告日 资产 现金及存放中央银行款项 其中:现金 存放中央银行款 结算准备金 ... 数据源 是否审计 公告日期 币种 类型 更新日期
0 20240930 NaN 281777000000.0 NaN NaN NaN ... 定期报告 未审计 20241019 CNY 合并期末 2024-10-18T18:20:11
1 20240630 NaN 305998000000.0 NaN NaN NaN ... 定期报告 未审计 20240816 CNY 合并期末 2024-08-15T20:35:13
2 20240331 NaN 322076000000.0 NaN NaN NaN ... 定期报告 未审计 20240420 CNY 合并期末 2024-04-19T19:15:02
3 20231231 NaN 274663000000.0 NaN NaN NaN ... 定期报告 是 20241019 CNY 合并期末 2024-03-14T19:05:04
4 20230930 NaN 350143000000.0 NaN NaN NaN ... 定期报告 未审计 20231025 CNY 合并期末 2023-10-24T20:40:01
[5 rows x 150 columns]
数据列非常的多,这里面只展示了部分。
这个接口通过 symbol 指定名称获取不同的财报,这也是挺奇怪。不得不吐槽下,易用性上和 tushare 不好比。
其它常用数据还有如业绩预告、分红送股等数据。
# 业绩预告
aks.stock_yjyg_em(date="20240930") # 从 20081231 开始,日期必须是 20200331 20200630 20200930 20201231
# 分红送股
aks.stock_history_dividend_detail("000001")
财务数据大概就找这么多吧。
一句题外话,akshare 有些数据有限,可以通过其他渠道下载全量数据,然后再用 akshare 维护增量数据。毕竟是免费更香,虽然要更多的时间成本。
宏观数据
宏观数据方面,主要看如何获取如 GDP、CPI、PMI、PPI、利率和就业数据等。
aks.macro_china_gdp() # GDP 国内生产总值
aks.macro_china_cpi() # CPI 居民消费价格指数
aks.macro_china_pmi() # PMI 采购经理人指数
aks.macro_china_ppi() # PPI 工业品出厂价格指数
aks.macro_china_lpr() # LRP 贷款报价利率
aks.macro_china_urban_unemployment() # 城镇调查失业率
如国内生产总值 GDP 的数据样例:
季度 国内生产总值-绝对值 国内生产总值-同比增长 第一产业-绝对值 第一产业-同比增长 第二产业-绝对值 第二产业-同比增长 第三产业-绝对值 第三产业-同比增长
0 2024年第1-3季度 949745.7 4.8 57733.1 3.4 361361.6 5.4 530651.1 4.7
1 2024年第1-2季度 616836.0 5.0 30660.0 3.5 236529.9 5.8 349646.1 4.6
2 2024年第1季度 296299.5 5.3 11538.4 3.3 109846.3 6.0 174914.7 5.0
3 2023年第1-4季度 1260582.1 5.2 89755.2 4.1 482588.5 4.7 688238.4 5.8
4 2023年第1-3季度 912692.0 5.2 56330.1 4.0 348885.6 4.4 507476.2 6.0
akshare 提供了各类宏观数据,相对更加丰富。除了国内的宏观经济数据,还有中国香港和其他不少国家的宏观数据,如美国、日本、欧洲等一些国家。
我本人不是专业金融出生,先整理下这些数据,等日后慢慢研究,以求为自己的交易增加更多理解。
总结
本文介绍了如何从 akshare 获取常用的数据,提供了使用代码。如果想查看它提供的其他接口函数,可查看 akshare 接口文档。
不得不说,akshare 提供的数据丰富,是收集公开数据的一个利器,免去了我们自行寻找数据的时间。