学习路线 06:Sharpe 比率崇拜 — 为什么单一指标会误导
7步学习路线:从理解为什么仅依赖 Sharpe 是危险的,到补充指标,到构建完整业绩图景。
目标:完成后,你将理解为什么仅依赖 Sharpe 比率是危险的,什么指标补充它,以及如何构建完整的业绩图景。
前置知识:基本理解 Sharpe 比率和组合业绩衡量。
第 1 步:这是什么?
一个对冲基金营销人员给你看回测:“3.2 Sharpe!稳定收益!低回撤!”
你要求看完整画面。他们展示:最大回撤 12%,年收益 28%,波动率 9%。
等等——28% 收益配合 9% 波动率是 2.6 的 Sharpe(年化)。但他们说是 3.2。为什么差异?
答案:他们年化方式不同,或者使用了不同的波动率估计,或者精选了时间段。Sharpe 比率不是一个单一数字——它是一个方法论,计算方式的微小差异导致结果的巨大差异。
除了技术问题,还有一个更深层的问题:Sharpe 比率没有告诉你策略是否安全、可持续或适合你的风险承受能力。3.2 Sharpe 配合 40% 回撤与 3.2 Sharpe 配合 5% 回撤是非常不同的。
第 2 步:为什么这很重要?
你会在基金营销中看到的真实模式:
- 展示 Sharpe
- 展示平滑的权益曲线
- 不展示回撤序列
- 不提及最差月份
- 不提及测试了多少参数
这是”Sharpe 崇拜”——把一个数字当作好像它捕获了一切重要的事。
后果:
你配置到 Sharpe 看起来很棒但有不可接受尾部风险的策略。 一个好年 +50%、坏年 -40% 的策略可能有 Sharpe 1.2。如果你知道 -40%,你会配置吗?
你选择了有结构性依赖的策略。 一个只在牛市中有效的动量策略,在 2010-2020 回测期间(大部分牛市)可能有 Sharpe 2.0。你没有看到完整画面。
第 3 步:核心问题:Sharpe 没有捕获什么
Sharpe 不捕获回撤。 Sharpe 1.5、最大回撤 50% 的策略不同于 Sharpe 1.5、最大回撤 10% 的策略。需要提取退休收入的投资者不能等待 50% 回撤恢复。
Sharpe 不捕获尾部风险。 Sharpe 使用标准差,对上行和下行对称处理。+30% 一年、-20% 下一年的策略与每年 +5% 的策略具有相同的波动率——但风险特征非常不同。
Sharpe 不捕获结构性依赖。 如果你的回测 Sharpe 是在恰好有利的时期计算的,Sharpe 偏向上。你不知道它在不同市场条件下的表现。
第 4 步:补充指标
最大回撤(MaxDD): 从峰值到谷值的最大跌幅。Sharpe 1.5、最大回撤 5% 的策略优于 Sharpe 1.5、最大回撤 25% 的策略。
Calmar 比率: 收益 / MaxDD
Calmar > 1.0 是好的。Calmar > 2.0 是优秀的。Sharpe 2.0 但 Calmar 0.5 的策略有 40% 最大回撤——你应该关注。
Sortino 比率: 收益 / 下行偏差
DR 是仅负收益的标准差。Sortino 仅在下行时惩罚波动率。平稳上升的策略 Sortino 高;波动大的策略 Sortino 低。
收益痛苦比率: 正收益之和 / |负收益之和| 简单但有效的指标。收益痛苦 > 1.5 是好的。> 2.0 是优秀的。
第 5 步:实现
import numpy as np
def comprehensive_performance_report(returns, periods_per_year=252, risk_free=0.0):
"""
生成超越 Sharpe 的综合业绩报告。
"""
returns = np.array(returns)
T = len(returns)
total_return = np.prod(1 + returns) - 1
annual_return = (1 + total_return) ** (periods_per_year / T) - 1
annual_vol = np.std(returns) * np.sqrt(periods_per_year)
excess = returns - risk_free / periods_per_year
sharpe = np.mean(excess) / np.std(excess, ddof=1) * np.sqrt(periods_per_year)
cumulative = np.cumprod(1 + returns)
running_max = np.maximum.accumulate(cumulative)
drawdowns = (cumulative - running_max) / running_max
max_drawdown = np.min(drawdowns)
calmar = annual_return / abs(max_drawdown) if max_drawdown != 0 else np.inf
negative_returns = returns[returns < 0]
downside_std = np.std(negative_returns) * np.sqrt(periods_per_year) if len(negative_returns) > 0 else 0
sortino = annual_return / downside_std if downside_std > 0 else np.inf
total_gain = np.sum(returns[returns > 0])
total_pain = abs(np.sum(returns[returns < 0]))
gain_to_pain = total_gain / total_pain if total_pain > 0 else np.inf
var_95 = np.percentile(returns, 5)
cvar_95 = np.mean(returns[returns <= var_95])
return {
'total_return': total_return,
'annual_return': annual_return,
'annual_vol': annual_vol,
'sharpe': sharpe,
'max_drawdown': max_drawdown,
'calmar': calmar,
'sortino': sortino,
'gain_to_pain': gain_to_pain,
'var_95': var_95,
'cvar_95': cvar_95
}
第 6 步:如何解读结果
比较 Sharpe 和 Sortino。 如果 Sharpe >> Sortino,你的收益是正偏的——你为不想要的上行波动率计分了。要怀疑。
高 Sharpe 策略的 Calmar < 1.0 是红旗。 这意味着最大回撤大于年收益。30% 收益、40% 最大回撤的策略 Calmar = 0.75。
收益痛苦 > 2.0 是优秀的。 这意味着每 1 美元痛苦(损失),你获得 2 美元收益。大多数专业交易员目标是 > 1.5。
第 7 步:常见陷阱 + 在知识体系中的位置
陷阱:只看 Sharpe。 Sharpe 是必要的但不是充分的。总是看回撤、Sortino 和尾部风险指标。
陷阱:忽略时间段。 2010-2020 年表现良好的策略可能没有在 2008 或 2020 年测试过。总是要求压力期的表现。
陷阱:不检查收益痛苦。 有些策略 Sharpe 很好但收益痛苦很差,因为频繁的小损失侵蚀了复利。收益痛苦捕获了这一点。
Sharpe 崇拜是一个陷阱。答案不是放弃 Sharpe——而是一起使用它和补充指标。完整的业绩图景包括 Sharpe、Sortino、Calmar、回撤、尾部风险和结构性分析。
下一步
准备好最后一篇了吗?→ 学习路线 07:信号供应商尽调
想要百科参考卡片?→ Sharpe 比率崇拜(百科词条)