3、数据获取入门:用 yfinance 下载历史 K 线

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

我个人习惯用 yfinance 这个库。它免费、简单,而且直接对接雅虎财经。说白了,几行代码就能把纳斯达克的历史 K 线拉下来。我刚开始做回测的时候,就是靠它快速验证想法的。

3.1 安装与导入:别踩坑

先装库。打开终端,敲一行:

pip install yfinance pandas

嗯,这里要注意。如果你用的是国内网络,可能会遇到下载慢的问题。我建议加个国内镜像源,比如清华的:

pip install yfinance pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

装好之后,在代码里导入:

import yfinance as yf
import pandas as pd

搞定。就这么简单。

3.2 下载历史 K 线:核心操作

我们拿纳斯达克综合指数(^IXIC)举个例子。你想下载最近 1 年的日线数据:

# 定义股票代码
ticker = "^IXIC"

# 下载数据
data = yf.download(ticker, start="2023-01-01", end="2024-01-01")

# 看一眼
print(data.head())

运行之后,你会看到类似这样的输出:

Date Open High Low Close Volume Adj Close
2023-01-03 10442.10 10619.68 10385.64 10619.68 4850000000 10619.68
2023-01-04 10619.68 10710.52 10511.78 10619.68 4720000000 10619.68

你看,日期、开盘、最高、最低、收盘、成交量、复权收盘价,全都有了。这就是标准的 OHLCV 数据。

小技巧: 如果你只想下载最近 1 个月的数据,可以用 period="1mo" 参数,省得算日期。比如 yf.download(ticker, period="1mo")

3.3 理解 DataFrame 结构

返回的 data 是一个 Pandas DataFrame。这东西是量化分析的核心数据结构。你想想看,它就像一个电子表格,有行有列。

  • 行(Row): 每一行代表一个交易日。索引是日期。
  • 列(Column): 每一列代表一个字段。比如 Open、Close、Volume。

我经常用 data.info() 来快速查看数据概况:

data.info()

输出:

DatetimeIndex: 251 entries, 2023-01-03 to 2023-12-29
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Open       251 non-null    float64
 1   High       251 non-null    float64
 2   Low        251 non-null    float64
 3   Close      251 non-null    float64
 4   Volume     251 non-null    int64  
 5   Adj Close  251 non-null    float64
dtypes: float64(6), int64(1)
memory usage: 15.7 KB

看到没?251 个交易日,没有缺失值。数据类型都是 float64 和 int64,非常适合做数学运算。

注意: 我曾经遇到过一个问题——下载的数据里,某些日期是空的。比如节假日、周末。yfinance 默认只返回交易日数据,所以不用担心。但如果你自己拼接数据,一定要检查索引是否连续。

3.4 导出数据:to_csv 与 to_excel

数据拿到手,总不能每次都重新下载吧?我习惯把它存成本地文件。这样下次直接读取,省时间。

3.4.1 导出为 CSV

CSV 是最通用的格式。任何软件都能打开。

# 导出为 CSV
data.to_csv("nasdaq_ixic_2023.csv")

# 如果你不想保留索引(日期),可以加参数
data.to_csv("nasdaq_ixic_2023.csv", index=True)

我个人建议保留索引。因为日期是时间序列分析的关键字段。丢了日期,数据就废了一半。

3.4.2 导出为 Excel

有些同事喜欢用 Excel 看数据。那就导出为 .xlsx 文件。

# 导出为 Excel
data.to_excel("nasdaq_ixic_2023.xlsx", sheet_name="IXIC_Data")

注意,导出 Excel 需要安装 openpyxl 库。如果没装,会报错。装一下:

pip install openpyxl
避坑指南: 我曾经在导出 Excel 时,发现中文列名乱码。后来发现是编码问题。建议列名用英文,或者导出 CSV 时指定 encoding="utf-8-sig"

3.5 知识体系:一张图看懂

下面这张 SVG 图,帮你梳理本章的核心逻辑。从数据源到最终存储,一目了然。

数据获取流程 雅虎财经 (yfinance) 下载历史K线 Pandas DataFrame to_csv() to_excel() .csv 文件 .xlsx 文件

3.6 完整示例:一条龙搞定

最后,给你一个完整的代码示例。从下载到导出,一步到位。

import yfinance as yf
import pandas as pd

# 1. 下载数据
ticker = "^IXIC"
data = yf.download(ticker, start="2023-01-01", end="2024-01-01")

# 2. 查看数据概况
print("数据形状:", data.shape)
print("前5行:\n", data.head())

# 3. 导出为 CSV
data.to_csv("nasdaq_ixic_2023.csv")
print("已导出为 CSV 文件")

# 4. 导出为 Excel
data.to_excel("nasdaq_ixic_2023.xlsx", sheet_name="IXIC_Data")
print("已导出为 Excel 文件")

运行这段代码,你会在当前目录下看到两个文件。一个 .csv,一个 .xlsx。以后做分析,直接读取就行,不用每次都联网下载。

核心要点:
  • yfinance 是获取美股历史 K 线的最简单方式
  • 返回的 DataFrame 是量化分析的基础数据结构
  • to_csv 和 to_excel 是两种最常用的数据持久化方法
  • 导出时注意编码和索引问题,避免踩坑

专注资料整理