第1章:yfinance入门——从零开始拉取美股数据

做量化交易,第一步就是搞定数据。没有数据,再牛的策略也是纸上谈兵。

今天咱们聊聊 yfinance 这个库。说实话,我入行那会儿,拉美股数据还得手动爬雅虎财经的页面,又慢又容易挂。后来发现 yfinance 这个神器,简直像捡到宝一样。

1.1 yfinance 是什么?

yfinance 是一个 Python 库,专门用来从 Yahoo Finance 获取金融数据。它免费、轻量、API 设计得很人性化。

我个人习惯把它叫做「数据水龙头」——拧开就有水,不用自己打井。

核心特点:

  • 免费开源,社区活跃
  • 支持美股、港股、A股(部分)
  • 一行代码就能拿到历史行情
  • 自动处理股票分割、分红调整

安装也很简单:

pip install yfinance

嗯,就这一句。我当年第一次跑通的时候,还愣了几秒——就这么简单?

1.2 获取单只股票历史数据

先拿苹果公司(AAPL)练手。这是最基础的操作,也是你以后每天都会用到的。

import yfinance as yf

# 创建股票对象
aapl = yf.Ticker("AAPL")

# 获取历史数据
hist = aapl.history(period="1y")
print(hist.head())

跑完你会看到这样的输出:

Date Open High Low Close Volume
2024-01-02 185.64 188.93 184.28 185.64 82488700
2024-01-03 184.22 185.88 183.43 184.25 67820400

这里有个坑,我踩过。第一次用的时候,我直接打印了 aapl.history() 没加参数,结果只拿到最近5天的数据。为什么?因为默认参数就是 period="5d"

小技巧: 如果你想要全部历史数据,用 period="max"。但小心,苹果这种老牌公司数据量很大,第一次拉可能要等十几秒。

1.3 获取多只股票数据

单只股票不够看,咱们做量化通常要对比多只。yfinance 支持批量操作,效率高很多。

# 方法一:循环拉取(简单但慢)
tickers = ["AAPL", "MSFT", "GOOGL", "AMZN"]
data = {}
for t in tickers:
    data[t] = yf.download(t, period="1y")

# 方法二:批量下载(推荐)
data = yf.download(tickers, period="1y")

方法二返回的是一个 MultiIndex DataFrame,列名是 (Price, Ticker) 的元组。我第一次看到这个结构有点懵,后来习惯了就觉得真香。

你想想看,如果手动去雅虎财经一个个下载CSV,再合并,得花多少时间?yfinance 几秒钟搞定。

1.4 设置数据获取参数

实际项目中,很少直接用 period 参数。更多时候我们需要精确控制起止日期。

# 指定起止日期
start_date = "2023-01-01"
end_date = "2024-12-31"

data = yf.download("AAPL", start=start_date, end=end_date)

这里有个细节:end_date 默认是今天。如果你不传,就拿到从 start 到今天的数据。

关于周期参数,我整理了一张表:

参数值 含义 适用场景
1d 日线数据 日常分析、回测
1wk 周线数据 中期趋势判断
1mo 月线数据 长期投资分析
1m 分钟数据(仅最近7天) 高频交易研究

注意: 分钟数据只能获取最近7天的,这是雅虎的限制。我曾经想拉一年的分钟数据做回测,结果发现根本拿不到。后来改用其他数据源才解决。

1.5 核心流程一览

为了让你更直观地理解整个数据获取流程,我画了一张图:

yfinance 数据获取核心流程 1. 导入库 import yfinance as yf 2. 选择股票 Ticker("AAPL") 3. 设置参数 period / start/end 4. 获取 .history() 参数组合方式 方式一:period period="1y" 方式二:start + end start="2023-01-01" 方式三:interval interval="1wk" 三种方式可以组合使用,灵活控制数据粒度

这张图把整个流程串起来了。你从左边开始,一步步走到右边,就能拿到数据。

1.6 实战小贴士

最后分享几个我在项目中积累的经验:

  • 网络问题: 国内访问雅虎偶尔会超时。我建议加个重试机制,或者用代理。
  • 数据缓存: 每次拉取都请求网络很慢。我习惯把数据存成 CSV,下次直接读本地。
  • 股票代码格式: 美股直接写代码,港股要加后缀 .HK,比如 0700.HK。

我的习惯: 写一个 get_data() 函数,把下载、缓存、异常处理都封装进去。这样每次调用就一行代码,清爽得很。

好了,yfinance 的基础用法就这些。别看内容不多,但这是你整个量化生涯的基石。把这一章练熟,后面讲数据清洗、策略回测的时候,你才能游刃有余。


专注资料整理