Python 获取金融数据
Python 获取金融数据 数据是量化交易的原材料,一切分析与策略都建立在可靠的历史行情数据之上。 Python 中有多个库可以获取金融市场数据,本篇以最常用的 yfinance 为主,同时介绍获取 A 股数据的 AKS
数据是量化交易的原材料,一切分析与策略都建立在可靠的历史行情数据之上。
Python 中有多个库可以获取金融市场数据,本篇以最常用的 yfinance 为主,同时介绍获取 A 股数据的 AKShare。
用 yfinance 获取数据
yfinance 是一个从 Yahoo Finance 获取金融数据的库,支持股票、指数、基金、外汇、加密货币等,免费且无需注册。
安装如下:
pip install yfinance
download 函数与参数说明
yfinance 获取批量历史数据的核心函数是 yf.download(),基本语法格式:
yf.download(tickers, start=None, end=None, period=None, interval="1d",
auto_adjust=True, multi_level_index=True, progress=True, threads=True)
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tickers | 字符串或列表 | 必填 | 要下载的股票、指数代码,单个代码用字符串,多个代码用列表或空格分隔的字符串 |
| start / end | 字符串 | None | 下载数据的开始与结束日期,格式 "YYYY-MM-DD",默认取能获取的最早/最新日期 |
| period | 字符串 | None | 直接指定时间跨度,如 "1mo"(一个月)、"1y"(一年)、"max",与 start/end 二选一 |
| interval | 字符串 | "1d" | K 线周期,如 "1m"、"1h"、"1d"、"1wk"、"1mo" |
| auto_adjust | 布尔值 | True | 是否自动复权。True 时价格已复权且不返回 Adj Close 列 |
| multi_level_index | 布尔值 | True | 是否返回多级列名。下载单只股票时设为 False 可得到更简单的单层列 |
| progress | 布尔值 | True | 是否显示下载进度条 |
| actions | 布尔值 | False | 是否包含分红、拆股等公司行动数据 |
| threads | 布尔值 | True | 是否使用多线程下载,批量下载多只股票时更快 |
重要:新版 yfinance(0.2.51 及以上)把 auto_adjust 的默认值改成了 True,下载的价格是复权后的价格,且不再返回 Adj Close 列。老教程里直接用 Close 列做分析的代码,在新版下分析的其实是复权价,这一点阅读旧代码时要特别留意。
股票代码规则
不同市场的代码在 Yahoo Finance 中的写法不同,中国 A 股需要加交易所后缀:
| 市场 | 后缀 | 示例 |
|---|---|---|
| 上海证券交易所(A 股) | .SS | 600519.SS(贵州茅台) |
| 深圳证券交易所(A 股) | .SZ | 000568.SZ(泸州老窖) |
| 港股 | .HK | 0700.HK(腾讯控股) |
| 美股 | 无后缀 | AAPL(苹果)、MSFT(微软) |
获取贵州茅台历史数据
以下实例获取贵州茅台(600519.SS)的股票数据:
实例
# 上海证券交易所,贵州茅台的股票代码
symbol = "600519.SS"
# auto_adjust=False:返回未复权价格 Close 和复权因子调整后的价格 Adj Close 两列
# multi_level_index=False:单只股票下载时返回单层列名,操作更简单
maotai_data = yf.download(symbol, start="2022-01-01", end="2023-11-01",
auto_adjust=False, progress=False,
multi_level_index=False)
# 打印数据的前几行
print(maotai_data.head())
返回的是一张 Pandas DataFrame,包含日期(Date)、开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)、复权收盘价(Adj Close)和成交量(Volume)。
Pandas DataFrame 的用法可以参考:Pandas 数据结构 - DataFrame
执行以上代码,输出结果如下:
Adj Close Close High Low Open Volume
Date
2022-01-04 1772.844604 2051.229980 2068.949951 2014.000000 2055.00000 3384262
2022-01-05 1749.310059 2024.000000 2065.000000 2018.000000 2045.00000 2839551
2022-01-06 1713.200317 1982.219971 2036.000000 1938.510010 2022.01001 5179475
2022-01-07 1678.438721 1942.000000 1988.880005 1939.319946 1975.00000 2962670
2022-01-10 1699.181641 1966.000000 1977.000000 1917.550049 1928.01001 2962670
注意对比 Close 与 Adj Close 两列:茅台在区间内有过分红,复权价低于未复权价。
计算收益率和做回测时应使用复权价格,否则分红造成的价格跳空会被误判为暴跌。
关于复权的详细概念,会在数据清洗的相关内容中进一步展开。
Ticker 类:获取单只股票详情
除了批量下载,yfinance 还提供 Ticker 类,用于获取特定金融工具的信息和实时数据。
通过 yf.Ticker('代码') 创建对象后,可以访问丰富的属性和方法:
| 属性 / 方法 | 用法 | 说明 |
|---|---|---|
| history() | ticker.history(period="1mo", interval="1d") | 获取历史行情,period 指定跨度,interval 指定周期 |
| info | ticker.info | 公司基本信息:名称、行业、市值等 |
| dividends | ticker.dividends | 分红数据 |
| splits | ticker.splits | 拆股数据 |
| actions | ticker.actions | 公司行动汇总(拆股、分红等) |
| major_holders | ticker.major_holders | 主要持有者持股比例 |
| institutional_holders | ticker.institutional_holders | 机构持股信息 |
| income_stmt | ticker.income_stmt | 年度利润表 |
| balance_sheet | ticker.balance_sheet | 资产负债表 |
| cashflow | ticker.cashflow | 现金流量表 |
| calendar | ticker.calendar | 财务日历,如财报发布日期 |
| news | ticker.news | 相关新闻 |
以下代码以微软(MSFT)为例,演示 Ticker 类的常用操作:
实例
# 创建 Ticker 对象,代表微软公司的股票
msft = yf.Ticker("MSFT")
# 获取过去 5 个交易日的行情数据
hist = msft.history(period="5d")
print(hist.head())
执行以上代码,输出结果如下:
Open High Low Close Volume Dividends Stock Splits
Date
2026-10-16 00:00:00-04:00 541.309998 543.820007 524.429993 529.049988 24845700 0.0 0.0
2026-10-19 00:00:00-04:00 528.700012 535.570007 528.059998 533.520020 17994900 0.0 0.0
2026-10-20 00:00:00-04:00 533.909973 534.210022 525.840027 531.869995 14576000 0.0 0.0
与 download 不同,history() 返回的表格自带 Dividends(分红)和 Stock Splits(拆股)两列。
同时获取多只股票
批量研究时经常需要同时获取多只股票的数据,有两种方式:
实例
# 方式一:Tickers 对象,适合分别访问每只股票的详细信息
tickers = yf.Tickers("msft aapl goog")
tickers.tickers["MSFT"].info # 微软的基本信息
tickers.tickers["AAPL"].history(period="1mo") # 苹果近一个月行情
tickers.tickers["GOOG"].actions # 谷歌的公司行动
# 方式二:download 一次下载多只,适合批量取行情
# 返回的 DataFrame 列为多级结构(价格类型, 股票代码)
data = yf.download(["SPY", "AAPL"], period="1mo",
progress=False, multi_level_index=False)
用 AKShare 获取 A 股数据
yfinance 的 A 股数据来自 Yahoo Finance,存在更新延迟,做 A 股研究更推荐使用国内数据源。
AKShare 是一个免费开源的财经数据接口库,覆盖股票、期货、期权、基金、债券、宏观等数据,无需注册 token。
安装如下:
pip install akshare
实例
# 获取贵州茅台的 A 股日线行情
# symbol:A 股代码(不带市场后缀)
# adjust="qfq":前复权,"hfq" 为后复权,"" 为不复权
df = ak.stock_zh_a_hist(symbol="600519", period="daily",
start_date="20240101", end_date="20240115",
adjust="qfq")
print(df.head(3))
执行以上代码,输出结果如下(列名为中文,直接可读):
日期 股票代码 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率
0 2024-01-02 600519 1580.66 1550.67 1583.85 1543.76 32156 5.440083e+09 2.52 -2.58 -40.99 0.26
1 2024-01-03 600519 1546.77 1559.66 1560.88 1541.99 20229 3.411401e+09 1.22 0.58 8.99 0.16
2 2024-01-04 600519 1558.66 1534.66 1558.66 1528.59 21551 3.603970e+09 1.93 -1.60 -25.00 0.17
与 yfinance 相比,AKShare 直接提供涨跌幅、换手率等衍生指标,还支持板块资金流、龙虎榜等 A 股特色数据。
常用金融数据库对比
除了 yfinance 和 AKShare,还有不少优秀的金融数据库,按市场和研究需求选择:
| 库 | 主要覆盖 | 特点 | 安装命令 |
|---|---|---|---|
| yfinance | 美股、A 股、港股、全球指数、加密货币 | 免费无需注册,国际市场首选 | pip install yfinance |
| AKShare | A 股、期货、基金、债券、宏观 | 免费开源,接口丰富,无需 token | pip install akshare |
| Tushare | A 股为主 | 需注册获取 token,积分制,数据质量高 | pip install tushare |
| baostock | A 股、港股、期权 | 免费,适合获取证券基本信息与日线数据 | pip install baostock |
| pandas-datareader | 聚合多个在线数据源 | 老牌工具,部分数据源已失效,谨慎选用 | pip install pandas-datareader |
| alpha_vantage | 美股、外汇、加密货币 | 需注册免费 API key,自带技术指标计算 | pip install alpha_vantage |
| Quandl | 金融与经济数据 | 已并入 Nasdaq Data Link,需注册 | pip install quandl |
| ccxt | 加密货币交易所 | 统一接口连接上百家交易所,支持行情与交易 | pip install ccxt |
选型建议:研究美股和全球市场用 yfinance;研究 A 股用 AKShare 或 Tushare;做加密货币用 ccxt。数据源只是工具,重要性远低于后面的策略研究本身。
拿到数据后,下一步是用图表看清它,进入数据可视化一章。
