
二级标题 用Python获取股票实时行情数据
获取股票实时行情是量化交易的第一步。Python生态提供了多种工具,其中yfinance库免费、易用,支持全球股票和期货数据。安装命令:
pip install yfinance pandas
二级标题 获取单只股票实时行情
使用yfinance的Ticker对象可以快速获取实时价格、成交量等字段。代码示例:
import yfinance as yf
ticker = yf.Ticker("AAPL")
data = ticker.history(period="1d", interval="1m")
print(data.tail())
history方法返回pandas DataFrame,包含Open、High、Low、Close、Volume列。实时数据延迟约15分钟,适合非高频策略。
二级标题 获取多只股票批量数据
yfinance支持一次下载多只股票。使用yf.download函数:

import yfinance as yf
df = yf.download(["AAPL", "MSFT", "GOOG"], period="5d", interval="5m")
print(df["Close"].head())
返回多级列索引,可通过df["Close"]提取收盘价矩阵。对于期货,代码类似:yf.download("ES=F", period="1mo")(ES=F为标普500期货)。
二级标题 获取盘口与实时报价
yfinance的fast_info属性提供最新价格、买卖价差等:
ticker = yf.Ticker("TSLA")
info = ticker.fast_info
print(info["lastPrice"], info["bid"], info["ask"])
fast_info是字典,键包括lastPrice、bid、ask、volume。期货合约如CL=F(原油期货)同样支持。
二级标题 处理实时数据流
yfinance不提供推送式实时流。若需要逐笔数据,可结合yf.Ticker的history轮询,或使用WebSocket库如websocket-client对接券商API。轮询示例:
import time
while True:
data = yf.Ticker("SPY").history(period="1d", interval="1m")
latest = data.iloc[-1]
print(f"最新价: {latest['Close']}, 时间: {data.index[-1]}")
time.sleep(10)
轮询间隔不宜过短,避免被限流。
二级标题 期货数据获取要点
期货代码需加后缀,如GC=F(黄金期货)、ZN=F(锌期货)。获取连续合约:
futures = yf.Ticker("GC=F")
futures_data = futures.history(period="1mo", interval="1h")
期货数据包含成交量与持仓量(部分合约)。注意主力合约换月时价格跳空,需复权处理或使用连续调整合约。
二级标题 数据存储与清洗
获取的数据应存入本地数据库或CSV。使用pandas清洗:
df = yf.download("AAPL", start="2024-01-01", end="2024-12-31")
df.dropna(inplace=True)
df.to_csv("aapl.csv")
dropna移除停牌日空缺。若需要分钟级数据,注意yfinance最多提供最近7天的1分钟数据,30天内的5分钟数据,以及更长期限的日线。
二级标题 错误处理与限流
网络请求可能失败。使用try-except:
try:
data = yf.download("AAPL", period="1d")
except Exception as e:
print(f"获取失败: {e}")
yfinance没有官方限流文档,请求频率过高会返回429错误。建议每秒不超过5次请求,或使用time.sleep控制。
二级标题 替代方案简介
若yfinance不满足需求,可考虑pandas_datareader(需API密钥)、Alpha Vantage(免费限额)、IBKR API(盈透证券,支持实时期货)。对于A股,akshare和tushare更合适。
import akshare as ak
stock_zh_a_spot_df = ak.stock_zh_a_spot_em()
print(stock_zh_a_spot_df.head())
akshare无需密钥,直接返回A股实时行情。期货数据通过ak.futures_zh_spot获取。
二级标题 整合到量化策略
获取数据后,可计算指标并生成信号。移动平均交叉:
data["MA5"] = data["Close"].rolling(5).mean()
data["MA20"] = data["Close"].rolling(20).mean()
data["Signal"] = 0
data.loc[data["MA5"] > data["MA20"], "Signal"] = 1
data.loc[data["MA5"] < data["MA20"], "Signal"] = -1
print(data[["Close", "MA5", "MA20", "Signal"]].tail())
结合定时任务,每5分钟获取一次数据并更新信号,即可驱动交易。
二级标题 注意事项
yfinance免费但数据非官方,可能存在误差。实盘交易前需用券商数据验证。期货合约的乘数、保证金规则不同,yfinance不提供这些字段,需单独查询。实时性要求高的策略应使用专业数据源如Polygon、CQG或交易所直连。
Python获取股票和期货数据是量化基础设施。yfinance适合研究与回测,实盘需升级数据管道。掌握上述方法,可以快速构建数据采集模块。