
用 Python 揭秘均值回归策略:你的收益从何而来?
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
很多刚入门量化投资的 Python 学习者,都会被一堆「比率」绕晕:夏普比率、信息比率、特雷诺比率……它们看起来像是同一类东西,但背后的逻辑完全不同。
今天我们聊一个被很多人忽视、却被全球顶级对冲基金当作「建仓哲学」来用的指标 —— 特雷诺比率(Treynor Ratio)。它诞生于 1965 年,公式简单到一行就能写完,但理解透它的几何含义,你会突然看懂为什么有些基金能在市场暴跌时反而赚钱。
这篇文章我会用 Python 带你一步步算清楚它,并附上真实案例。哪怕你只学过基础的 NumPy,也能跟下来。
它的公式只有一行:
其中:
和夏普比率最大的区别在于分母:夏普用的是「总波动率」,而特雷诺用的是 beta,也就是只衡量「无法通过分散投资消除的系统性风险」。
换句话说,特雷诺比率回答的问题是:你每承担一单位「躲不掉的市场风险」,能换回多少超额收益?
我们先用 Python 写一个最简单的计算函数:
import numpy as np
def treynor_ratio(portfolio_returns, risk_free_rate, beta):
"""
计算特雷诺比率
portfolio_returns: 组合的平均收益率(年化)
risk_free_rate: 无风险利率(年化)
beta: 组合相对市场的 beta 值
"""
# 分子是超额收益,分母是系统性风险 beta
return (portfolio_returns - risk_free_rate) / beta
# 案例:一个组合年化收益 12%,无风险利率 3%,beta 为 1.2
ratio = treynor_ratio(0.12, 0.03, 1.2)
print(f"特雷诺比率为:{ratio:.4f}") # 输出 0.0750这里有个关键点:市场组合本身的 beta 恒等于 1。
所以市场的特雷诺比率就是 (Rm - Rf) / 1 = Rm - Rf。
这意味着,在那条著名的「证券市场线」(SML)上,所有点的特雷诺比率都等于市场组合的特雷诺比率,而这条线的斜率,正好就是市场的特雷诺比率。
由此推出一个非常直接的选股规则:
而资产到 SML 的垂直距离,就是另一个大名鼎鼎的指标 —— 詹森阿尔法(Jensen's Alpha)。所以特雷诺比率和阿尔法不是两个独立的东西,而是同一个几何关系的两种看法。
这给了基金经理两条、也只有两条路:
CAPM 理论预测:beta 越高,收益应该越高。但半个世纪的实证数据反复证明 —— 这条线几乎是平的。
低 beta 的股票,赚得比理论预测的多;高 beta 的股票,反而赚得少。原因在于:很多投资者没法用无风险利率借钱加杠杆,于是只能去买高 beta 股票来博收益,把高 beta 资产价格推高,压低了它们未来的特雷诺比率。
这就是著名的「Betting Against Beta」(押注低 beta)策略的理论基础:
历史回测中,这个因子在美股上的夏普比率约为 0.75,债券上约为 0.81,相当亮眼。
上面我们都是直接「给定」beta,但实际中 beta 要靠回归算出来。我们用最小二乘法演示:
import numpy as np
# 模拟数据:市场的月度超额收益 和 某组合的月度超额收益
np.random.seed(42)
market_excess = np.random.normal(0.01, 0.04, 60) # 市场超额收益(60 个月)
portfolio_excess = 0.8 * market_excess + np.random.normal(0.003, 0.02, 60) # 组合收益
def estimate_beta(portfolio_excess, market_excess):
"""
通过线性回归估计 beta
beta = 协方差(组合, 市场) / 方差(市场)
"""
cov = np.cov(portfolio_excess, market_excess)[0, 1] # 两者协方差
var = np.var(market_excess, ddof=1) # 市场收益方差
return cov / var
beta = estimate_beta(portfolio_excess, market_excess)
print(f"估计出的 beta 为:{beta:.4f}") # 接近设定的 0.8易错点提醒:beta 是用历史数据算的,会随时间漂移。一个用 36 个月数据算出来「beta 等于 0」的组合,在最近 1 个月可能实际跑出 0.30.4 的 beta。窗口长度不同,结果可能相差 0.30.5。所以特雷诺比率本质上是「向后看」的,使用时一定要注意这一点。
特雷诺比率有个致命软肋:分母可以是负数。
有一只在金融史上堪称传奇的基金,30 年的复合年化收益高达 63.3%,但它对市场的 beta 大约是 -1.0(负相关)。
问题来了:分子是正的(赚钱),分母是负的(负 beta),算出来的特雷诺比率竟然是 负数。如果按这个指标排名,这只史上最强的基金会被排到「最差」的位置!
我们用代码直观感受这个荒谬之处:
def treynor_ratio(rp, rf, beta):
return (rp - rf) / beta
# 一只赚翻天的基金:年化 63%,但 beta 为 -1.0
crazy_fund = treynor_ratio(0.63, 0.03, -1.0)
print(f"传奇基金的特雷诺比率:{crazy_fund:.4f}") # 输出 -0.6000(负数!)
# 一只平庸的基金:年化 8%,beta 为 1.0
normal_fund = treynor_ratio(0.08, 0.03, 1.0)
print(f"普通基金的特雷诺比率:{normal_fund:.4f}") # 输出 0.0500(正数)
# 结论:按特雷诺比率排名,传奇基金反而垫底,明显不合理这说明:特雷诺比率只适用于 beta 为正且稳定的「常规」组合。一旦组合做到了市场中性(beta ≈ 0)甚至负 beta,这个指标就会失真,必须换用詹森阿尔法、信息比率,或者直接看绝对收益和回撤表现。
1973 年还有一个延伸模型,回答了一个实战问题:如果我对几只股票有阿尔法预测,该怎么分配权重?
它的核心公式是:
翻译成大白话:每只股票的权重,正比于「预测阿尔法」除以「残差风险的方差」。
这意味着 —— 决定仓位的是信号质量,不是你的主观信心。 一只预测阿尔法很高但收益噪音很大的股票,会被打折;一只阿尔法不高但非常稳定的股票,反而拿到满仓。
import numpy as np
# 三只股票的预测阿尔法 和 残差风险(标准差)
alphas = np.array([0.05, 0.04, 0.06]) # 预测阿尔法
residual_std = np.array([0.10, 0.04, 0.20]) # 残差波动率
def treynor_black_weights(alphas, residual_std):
"""
根据特雷诺 - 布莱克模型计算主动组合权重
权重正比于 alpha / 残差方差
"""
raw = alphas / (residual_std ** 2) # 阿尔法 除以 残差方差
return raw / raw.sum() # 归一化为权重
weights = treynor_black_weights(alphas, residual_std)
for i, w in enumerate(weights, 1):
print(f"股票 {i} 的权重:{w:.2%}")
# 你会发现:阿尔法最高(0.06)的股票3,因为噪音太大反而权重不高跑一下这段代码你会发现:阿尔法最高的那只股票(0.06),因为残差波动太大,权重反而被压低了。而阿尔法中等但最「干净」的股票,拿到了最大仓位。这正是「精确度优先于幅度」的思想。
结合前面的内容,可以总结出一套简单的判断逻辑:
特雷诺比率虽然只是一行公式,但它背后藏着一整套「拆解收益来源」的思维:把收益拆成「市场给的 beta」和「靠本事赚的 alpha」两部分。
顶级机构的玩法其实殊途同归 —— 要么疯狂做大分子(赚纯阿尔法),要么把分母压到接近零甚至为负(极致对冲)。它们看到的不是一条简单的基准线,而是一张「系统性风险在哪里被错误定价」的地图。
对于学 Python 的你,最大的收获不在于背公式,而在于:
把上面几段代码跑一跑、改一改参数,你对系统性风险的理解会比看十篇理论文章都深刻。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐