当前位置: 首页 > article >正文

通过 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 提供的数据丰富,是收集公开数据的一个利器,免去了我们自行寻找数据的时间。


http://www.kler.cn/a/457315.html

相关文章:

  • 记录一个我在idea启动时的报错
  • YK人工智能(三)——万字长文学会torch深度学习
  • 2025决战智驾:从中阶卷到L3,车企需要抓好一个数据闭环
  • STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
  • 深度学习在图像识别中的最新进展与实践案例
  • 深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
  • ESP32_H2(IDF)学习系列-ADC模数转换(单次转换)
  • 将 ASP.NET Core 应用程序的日志保存到 D 盘的文件中 (如 Serilog)
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue体育资讯系统(可定制,项目包括源码、文档、远程调试、免费答疑至毕业】
  • 12.28作业
  • Etcd静态分布式集群搭建
  • 深度学习在数据库运维中的作用与实现
  • 解决GPT公式复制到Word之后乱码问题
  • SPI机制
  • YOLO11全解析:从原理到实战,全流程体验下一代目标检测
  • Spring Boot使用多线程
  • JVM(Java虚拟机)的组成部分详解
  • Redis 在小型项目中的实战运用
  • 单纯形法Simplex Method
  • 零跑汽车一路狂飙
  • 基于Qt的qss登录界面优化
  • 深入解析Spring Boot中的@ConfigurationProperties注解
  • 深入理解 LeetCode 978:最长湍流子数组
  • FPGA随记---时序约束
  • API安全学习笔记
  • QML学习(三) QML 的基本语法介绍