雅虎财经Python库安装与基础配置
雅虎财经提供免费金融数据接口,Python生态中最常用的库是yfinance。通过pip安装:
pip install yfinance pandas
安装完成后,导入库并创建Ticker对象即可获取股票或期货数据。雅虎财经的期货代码通常带有后缀,如原油期货CL=F,黄金期货GC=F,标普500指数期货ES=F。
import yfinance as yf
# 获取苹果股票数据
apple = yf.Ticker("AAPL")
# 获取原油期货数据
crude_oil = yf.Ticker("CL=F")
获取股票与期货历史K线数据
yfinance的history方法支持日线、周线、月线、分钟级数据。参数period控制时间范围,interval控制K线周期。
# 获取特斯拉股票最近一年的日线数据
tsla = yf.Ticker("TSLA")
df = tsla.history(period="1y", interval="1d")
print(df.head())
# 获取黄金期货最近5天的分钟级数据
gold = yf.Ticker("GC=F")
df_min = gold.history(period="5d", interval="1m")
print(df_min.tail())
返回的DataFrame包含Open、High、Low、Close、Volume、Dividends、Stock Splits列。期货数据无Dividends和Stock Splits列。

获取多只股票或期货数据可使用download函数:
tickers = ["AAPL", "MSFT", "CL=F", "GC=F"]
data = yf.download(tickers, start="2023-01-01", end="2023-12-31", group_by="ticker")
print(data["AAPL"].head())
实时行情与期权数据
yfinance提供fast_info属性获取实时价格、市值、成交量等。期货实时数据延迟约15分钟。
# 获取苹果股票实时信息
info = apple.fast_info
print(info["lastPrice"])
print(info["marketCap"])
# 获取原油期货实时价格
print(crude_oil.fast_info["lastPrice"])
期权数据通过option_chain方法获取,需指定到期日。期货期权需使用期货代码,部分合约支持有限。
# 获取苹果股票期权链
options = apple.option_chain("2024-12-20")
print(options.calls.head())
print(options.puts.head())
财务指标与基本面数据
股票可通过info属性获取市盈率、每股收益、股息率等。期货无财务指标,但可获取持仓量、结算价。
# 股票财务指标
print(apple.info["trailingPE"])
print(apple.info["dividendYield"])
# 期货持仓量
print(crude_oil.info.get("openInterest"))
季度财务报表可通过quarterly_income_stmt、quarterly_balance_sheet获取。
income = apple.quarterly_income_stmt
print(income.loc["Total Revenue"])
期货连续合约与展期处理
雅虎财经期货代码对应特定到期合约,连续合约需拼接。使用yfinance获取多个到期合约,按成交量或持仓量选择主力合约。
import pandas as pd
# 获取不同到期月份的原油期货
contracts = ["CL=F", "CLG24.NYM", "CLJ24.NYM", "CLK24.NYM"]
data = {}
for c in contracts:
try:
data[c] = yf.Ticker(c).history(period="1mo")
except:
pass
# 拼接连续合约
continuous = pd.concat(data.values()).sort_index()
print(continuous.head())
展期时注意价格跳跃,可使用复权价格或价差调整。
量化策略回测数据准备
将雅虎财经数据导入回测框架前需清洗:处理缺失值、对齐时间戳、计算收益率。
import numpy as np
# 获取股票数据
stock = yf.download("SPY", start="2020-01-01", end="2023-12-31")
# 计算日收益率
stock["Return"] = stock["Close"].pct_change()
# 计算20日移动平均
stock["MA20"] = stock["Close"].rolling(20).mean()
# 生成交易信号
stock["Signal"] = np.where(stock["Close"] > stock["MA20"], 1, 0)
print(stock.tail())
期货策略需注意保证金、杠杆、交割日。雅虎财经数据适合日线级别回测,分钟级数据有限且延迟。
常见问题与数据限制
雅虎财经免费接口有频率限制,频繁请求可能被封IP。建议添加间隔或使用缓存。历史分钟数据仅保留最近30天。期货数据部分合约不完整,需交叉验证。
import time
# 批量获取数据时添加延迟
for ticker in ["AAPL", "MSFT", "GOOG"]:
df = yf.Ticker(ticker).history(period="1mo")
time.sleep(1)
数据准确性方面,雅虎财经偶有错误,实盘交易前需与交易所数据核对。股票拆股和分红自动调整,期货无复权。
替代方案与进阶工具
yfinance之外,pandas_datareader支持雅虎财经旧接口但已失效。alpha_vantage提供更稳定期货数据,需API key。IBKR TWS API可获取实时期货行情,适合自动化交易。
# alpha_vantage示例
from alpha_vantage.timeseries import TimeSeries
ts = TimeSeries(key="YOUR_KEY")
data, meta = ts.get_daily("AAPL")
量化交易中,雅虎财经数据用于策略原型验证,实盘需付费数据源。结合backtrader或zipline可快速回测。
import backtrader as bt
class SmaCross(bt.Strategy):
params = dict(period=20)
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.period)
def next(self):
if self.data.close[0] > self.sma[0] and not self.position:
self.buy()
elif self.data.close[0] < self.sma[0] and self.position:
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=stock)
cerebro.adddata(data)
cerebro.addstrategy(SmaCross)
cerebro.run()
以上代码展示了从雅虎财经获取数据到简单回测的完整流程。期货交易需额外处理合约乘数和保证金。