3、金融数据获取:使用yfinance库获取历史股票数据

做量化交易,第一步就是搞数据。没有数据,再牛的模型也是空中楼阁。

我个人习惯把数据获取比作「做饭前的买菜」。菜买不好,厨艺再高也白搭。金融数据也一样,源头的质量直接决定了后续分析的可靠性。

这一章,咱们就聊聊怎么把「菜」买回来。重点讲两个主流数据源:Yahoo Finance 和 Alpha Vantage。我会结合自己踩过的坑,给你讲明白。

3.1 数据源介绍:Yahoo Finance vs Alpha Vantage

先说说这两个数据源的区别。你想想看,选数据源就像选工具,得知道各自的脾气。

特性 Yahoo Finance Alpha Vantage
免费额度 无限制(但可能不稳定) 每分钟5次,每天500次
数据范围 全球主要交易所 全球主要交易所
历史深度 最多30年 最多20年
实时数据 延迟15-20分钟 有实时API(付费)
Python库支持 yfinance(第三方) alpha_vantage(官方)
稳定性 中等(偶尔断连) 较高(有API Key管控)

Yahoo Finance 是我最常用的。为什么?因为它免费、数据全、用起来简单。用 yfinance 库几行代码就能拉数据,特别适合快速验证想法。

但注意,它有个毛病——偶尔会抽风。我在项目中遇到过几次,早上跑策略时突然报错,发现是 Yahoo 那边接口变了。嗯,这就是免费午餐的代价。

Alpha Vantage 则更「正规」一些。你需要申请 API Key,有频率限制。但它数据质量更稳定,而且提供一些技术指标的计算结果,省得自己算。

我个人建议:做原型验证用 Yahoo Finance,做生产环境用 Alpha Vantage 或者付费数据源。

3.2 使用 yfinance 获取历史数据

好,咱们直接上手。先装库:

pip install yfinance

然后拉数据。以苹果公司(AAPL)为例:

import yfinance as yf

# 下载苹果公司2023年全年的日线数据
aapl = yf.download('AAPL', start='2023-01-01', end='2023-12-31')

print(aapl.head())

输出长这样:

                  Open        High         Low       Close   Volume
Date
2023-01-03  129.929993  130.990005  124.169998  125.070000  74629900
2023-01-04  126.889999  128.660004  125.080002  126.360001  58457400
2023-01-05  126.139999  127.129997  124.480003  125.019997  64850800
2023-01-06  124.339996  130.470001  123.830002  129.619995  79355700
2023-01-09  130.470001  132.410004  129.889999  130.149994  70509100

你看,返回的是一个 DataFrame,索引是日期,列包括开盘价、最高价、最低价、收盘价、成交量。这就是标准的 OHLCV 格式。

小技巧: 如果你想要多个股票的数据,可以传一个列表。比如 yf.download(['AAPL', 'MSFT', 'GOOGL'], start='2023-01-01', end='2023-12-31')。返回的 DataFrame 会多一层列索引,用 .xs() 方法可以提取单只股票的数据。

3.3 数据格式理解

拿到数据后,咱们得知道每一列代表什么。说白了,就是理解「股票数据长什么样」。

  • Open(开盘价):当天第一笔成交的价格。注意,不是9:30整的价格,而是第一笔实际成交价。
  • High(最高价):当天最高成交价。
  • Low(最低价):当天最低成交价。
  • Close(收盘价):当天最后一笔成交价。这是最常用的价格,很多技术指标都基于它计算。
  • Volume(成交量):当天成交的股票数量。单位是股,不是手。

这里有个坑,我必须要提醒你:

避坑指南: 我曾经在回测时发现收益曲线特别漂亮,后来一查,原来是用了「未来数据」。怎么回事?我用的是当天的收盘价来生成交易信号,但收盘价是在交易结束后才确定的。你想想看,如果你在盘中用收盘价做决策,那不就是作弊吗?所以,做策略时一定要用「滞后」的数据,比如用昨天的收盘价来决定今天的操作。

另外,yfinance 返回的数据默认是按日期升序排列的(从早到晚)。但有些数据源可能是降序的。我建议你拿到数据后先检查一下:

# 检查数据是否按日期升序排列
print(aapl.index.is_monotonic_increasing)

如果不是,用 sort_index() 排一下序。

3.4 使用 Alpha Vantage 获取数据

如果你需要更稳定的数据源,可以试试 Alpha Vantage。先装库:

pip install alpha_vantage

然后去 Alpha Vantage 官网 申请一个免费的 API Key。拿到 Key 后,就可以拉数据了:

from alpha_vantage.timeseries import TimeSeries

# 替换成你自己的 API Key
api_key = 'YOUR_API_KEY'
ts = TimeSeries(key=api_key, output_format='pandas')

# 获取苹果公司的日线数据
data, meta_data = ts.get_daily(symbol='AAPL', outputsize='full')

print(data.head())

输出格式和 yfinance 类似,但列名略有不同:

                1. open  2. high   3. low  4. close  5. volume
date
2023-12-29  193.6100  194.40  191.7200  192.5300   42946600
2023-12-28  193.0000  194.49  192.9000  193.5800   32720600
2023-12-27  192.4900  193.50  191.8900  193.1500   31680800
2023-12-26  192.6700  193.92  192.1100  193.0500   29528400
2023-12-22  194.3000  195.99  192.3500  193.6200   45332600

注意,Alpha Vantage 的列名带数字前缀,比如 1. open。你可以重命名一下,方便后续处理:

data.columns = ['open', 'high', 'low', 'close', 'volume']
核心要点: 无论用哪个数据源,最终拿到的数据格式都是 OHLCV。这是金融数据的「通用语言」。你只要掌握了这个格式,换数据源只是换几行代码的事。

3.5 本章知识体系

为了让你更直观地理解本章内容,我画了一张图:

金融数据获取知识体系 数据源 Yahoo Finance / Alpha Vantage 获取方式 yfinance / alpha_vantage 库 OHLCV 标准格式 注意事项:API限制 / 数据延迟 / 未来数据陷阱 回测验证 实时监控 模型训练 核心:数据质量决定模型上限,获取方式决定开发效率

这张图把本章的核心逻辑串起来了。从数据源到获取方式,再到数据格式,最后落到应用场景。你跟着这个脉络走,就不会乱。

3.6 实战小贴士

最后,分享几个我自己的经验:

  • 数据缓存:别每次都从网络拉数据。我习惯把数据存到本地 CSV 文件,每天更新一次。这样既快又稳。
  • 异常处理:网络请求总会出问题。用 try-except 包一下,失败了就重试三次。
  • 数据对齐:如果你拉多只股票的数据,注意它们的交易日可能不同。比如 A 股和美股节假日不一样。用 pd.merge() 时记得指定 how='inner'how='outer'

嗯,数据获取这部分就讲到这里。记住,数据是量化交易的基石。花时间把数据搞明白,后面的路会顺很多。

专注资料整理