教程 / Python3 / Python 获取金融数据

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)的股票数据:

实例

import yfinance as yf

# 上海证券交易所,贵州茅台的股票代码
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 类的常用操作:

实例

import yfinance as yf

# 创建 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(拆股)两列。

同时获取多只股票

批量研究时经常需要同时获取多只股票的数据,有两种方式:

实例

import yfinance as yf

# 方式一: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

实例

import akshare as ak

# 获取贵州茅台的 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。数据源只是工具,重要性远低于后面的策略研究本身。

拿到数据后,下一步是用图表看清它,进入数据可视化一章。