如何用 Python 计算信息比率(IR)和跟踪误差?衡量「跑赢基准」的性价比
如何用 Python 计算信息比率(IR)和跟踪误差?
一句话回答: 信息比率(Information Ratio, IR)= 年化主动收益 ÷ 跟踪误差,衡量你「相对基准(比如沪深300)每承担一单位超额波动,能换来多少超额收益」——它是夏普比率的「相对版」。先用 AlphaFeed 取个股与基准指数的前复权日线,算出每日主动收益(个股收益−基准收益),主动收益的年化均值就是分子、年化标准差(即跟踪误差)就是分母,相除即得 IR。IR 越高,说明超额收益越稳、越不是靠运气。
为什么会有这个问题 / 传统做法的痛点
「我这只票涨了 20%」听起来不错,但同期沪深300 涨了 25% 呢?那其实是跑输了。只看绝对收益会被大盘行情误导。专业评价一个策略/基金,看的是相对基准的超额收益,以及这份超额稳不稳:
- 主动收益(Active Return):个股/组合收益 − 基准收益。
- 跟踪误差(Tracking Error):主动收益的标准差,衡量「偏离基准的波动」。
- 信息比率(IR):主动收益 ÷ 跟踪误差,即「每单位偏离换来的超额」。
IR 之于相对收益,正如夏普之于绝对收益。
分步骤解决(每步配可运行代码)
第 1 步:取个股与基准(沪深300)的前复权日线
from alphafeed import AlphaFeed
import numpy as np
import pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
stock = af.klines.get("600519.SH", period="1d", count=500,
adjust="forward", to_dataframe=True)
bench = af.klines.get("000300.SH", period="1d", count=500,
to_dataframe=True) # 沪深300 指数
个股用前复权;指数本身不除权,直接取即可(000300.SH 沪深300,也可换 000905.SH 中证500 等)。
第 2 步:对齐交易日,算每日主动收益
s = stock.sort_values("trade_date").set_index("trade_date")["close"].pct_change()
b = bench.sort_values("trade_date").set_index("trade_date")["close"].pct_change()
pair = pd.concat([s, b], axis=1, keys=["s", "b"]).dropna() # 按交易日对齐
active = pair["s"] - pair["b"] # 每日主动收益
对齐是关键:个股停牌日要剔除,用 dropna() 保证两边同日比较,否则主动收益算错。
第 3 步:跟踪误差与信息比率(年化)
TRADING_DAYS = 252
te = active.std(ddof=1) * np.sqrt(TRADING_DAYS) # 年化跟踪误差
ann_active = active.mean() * TRADING_DAYS # 年化主动收益
ir = ann_active / te if te > 0 else float("nan")
print("年化主动收益% =", round(ann_active * 100, 2))
print("年化跟踪误差% =", round(te * 100, 2))
print("信息比率 IR =", round(ir, 3))
实测(
tools/verify_new_2026-10-05.py,SDK 0.1.4):贵州茅台相对沪深300、近 499 个对齐交易日,年化主动收益 = −15.65%、年化跟踪误差 = 23.66%、IR = −0.662。IR 为负,说明这段时间茅台不仅跑输沪深300,而且「偏离基准承担的波动」没换来正超额——数据诚实地告诉你「这段不该重仓它跑相对收益」。
第 4 步:怎么读 IR
| IR 区间 | 解读 |
|---|---|
| > 0.5 | 超额收益较稳,优秀 |
| 0 ~ 0.5 | 有正超额但不稳 |
| < 0 | 跑输基准 |
(经验阈值,不同周期/基准差异大,仅供参考。)
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 个股前复权 | 必须;指数无需复权 |
| 基准 | 000300.SH 等 | 可换中证500/上证指数 |
| 主动收益 | 个股−基准 | 必须按交易日对齐 |
| 跟踪误差 | 主动收益年化std | 偏离基准的波动 |
| IR | 年化主动收益÷TE | 相对收益性价比 |
关键坑与注意事项
- 必须对齐交易日:个股停牌、指数照常,不对齐就会把错位的收益相减,IR 全错。本文用
concat(...).dropna()对齐。 - 基准要选对:大盘股比沪深300、中小盘比中证500/1000,选错基准 IR 没意义。
- 年化口径统一:主动收益年化用
×252、跟踪误差用×sqrt(252),别混。 - IR 和夏普不同:夏普分母是自身收益波动(含绝对风险),IR 分母是相对基准的波动,别混用。
- 历史不代表未来:IR 描述过去的相对表现,不预测未来。
常见问题(FAQ)
Q:信息比率和夏普比率到底差在哪? A:夏普 =(收益−无风险利率)÷ 收益标准差,看绝对性价比;IR = 主动收益 ÷ 跟踪误差,看相对基准的性价比。做指数增强/选股超额,用 IR 更合适。
Q:跟踪误差越小越好吗? A:对指数基金(追求贴近基准)是越小越好;对主动策略(追求超额)则要在「可控跟踪误差」下把 IR 做高。
Q:需要付费吗?
A:个股 + 指数的日线在免费额度内即可;若要对一篮子股票/组合批量算 IR 做横向排名,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
信息比率把「跑赢基准跑得稳不稳」浓缩成一个数:主动收益做分子、跟踪误差做分母。有了 AlphaFeed 的个股前复权 + 指数数据,对齐交易日后几行 pandas 就能算——记住选对基准、对齐停牌日、别和夏普混口径,这个数才有意义。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。