本章导航
- 学习目标
- 故事引入:只看收益的投资者
- 核心知识:策略评价指标体系
- AI实践:让AI帮你全面评价策略
- 动手练习:策略评价指标计算器代码
- 本章测验
- 下一章预告
学习目标
如果你只能用一个数字来评价策略,你会选什么?大多数人的第一反应是年化收益率。但这就像只根据身高来判断一个人是否健康——高个子可能患有严重的心脏病。
一个优秀的量化交易员必须学会用多维度的尺子衡量策略。收益只是故事的一半,风险才是决定你能走多远的关键。
本章结束后,你将能够:
- 掌握核心风险调整收益指标:夏普比率、索提诺比率、卡玛比率、Omega比率、信息比率
- 理解收益分布特征:偏度、峰度、最大回撤、回撤恢复时间
- 构建综合评价仪表盘:用多个指标交叉验证策略质量
- 识别指标背后的陷阱:为什么高夏普比率也可能是危险的
故事引入:只看收益的投资者
2015年,老刘在朋友推荐下买了某私募产品。产品宣传页上赫然印着:过去3年年化收益65%!老刘心动了,投入100万。
第一年,产品赚了80%。老刘觉得自己找到了财富密码。第二年,产品亏了60%。第三年,又亏了30%。三年下来,100万变成了大约50万。
老刘后来才看到完整的数据:这个产品虽然年化收益高达65%,但最大回撤高达75%,夏普比率只有0.4。也就是说,它用极其激进的方式博取高收益,一旦市场转向,投资者就要承受灭顶之灾。
如果只看到一个数字就做决策,你很可能成为下一个老刘。量化交易的精髓之一,就是用严谨的多维度指标替代直觉判断。
核心知识:策略评价指标体系
收益类指标
收益是最直观的指标,但不要只看绝对数字——同样的年化收益,用10年时间和用1年时间达到,意义完全不同。
- 年化收益率(CAGR):将不同时间段的收益统一到年度维度。计算公式:(期末价值/期初价值)^(1/年数) - 1。
- 累计收益率:整个回测期的总收益。容易被短期爆发扭曲,建议与年化收益结合看。
- 超额收益(Alpha):策略收益减去基准收益(如沪深300)。衡量策略的选股/择时能力。
风险类指标
风险是收益的孪生兄弟。不理解风险,就无法真正理解收益。
- 波动率(Volatility):收益率的标准差,通常年化。波动率衡量收益的不确定性,但不区分上涨波动和下跌波动。
- 最大回撤(Max Drawdown):从峰值到谷底的最大跌幅。这是投资者最真实的痛苦体验——你看到的浮盈可能在某一天变成巨大的亏损。
- 回撤恢复时间:从最大回撤的谷底回到前期高点需要多久。有些策略回撤不大,但恢复极慢,资金长期被锁定。
- 下行波动率(Downside Deviation):只计算低于目标收益(如无风险利率)的波动。比总波动率更能反映真实的下行风险。
风险调整收益指标
这才是评价策略的黄金标准——每承担一单位风险,能获得多少收益?
flowchart TD
A[策略收益] --> B[风险调整收益指标]
B --> C[夏普比率
收益/总波动]
B --> D[索提诺比率
收益/下行波动]
B --> E[卡玛比率
收益/最大回撤]
B --> F[Omega比率
上行收益/下行收益]
B --> G[信息比率
超额收益/跟踪误差]
- 夏普比率(Sharpe Ratio):(策略收益 - 无风险利率) / 策略波动率。最经典的指标,但有两个问题:①假设收益正态分布;②惩罚上涨波动(其实投资者喜欢上涨波动)。通常Sharpe > 1算不错,> 2算优秀。
- 索提诺比率(Sortino Ratio):(策略收益 - 目标收益) / 下行波动率。只惩罚坏波动,不惩罚好波动。对非对称收益分布的策略(如期权卖方)更公平。
- 卡玛比率(Calmar Ratio):年化收益 / 最大回撤。直观衡量收益与最惨经历的对比。Calmar > 1通常被视为可接受,> 3非常优秀。
- Omega比率:上行收益积分 / 下行收益积分。考虑了收益分布的全部信息,不假设正态分布。Omega > 1.5说明策略整体向上倾向明显。
- 信息比率(Information Ratio):超额收益 / 跟踪误差。衡量相对基准的超额收益稳定性。IR > 0.5说明有稳定的Alpha能力。
夏普比率看似客观,实则暗藏玄机:
陷阱1:负收益策略也可能有高夏普。如果一个策略稳定地每天亏0.01%,波动率极低,它的夏普比率可能接近0甚至为正(如果无风险利率更低)。但这是一个稳定亏损的策略!
陷阱2:夏普可以被操纵。通过平滑净值(如用月末数据而非日数据)、使用高杠杆放大收益同时放大波动(但杠杆本身不提高夏普)、或者选择特定时间段,都可以人为提高夏普。
陷阱3:正态分布假设。金融收益通常具有肥尾特征,夏普比率低估了极端风险。2008年金融危机前,很多基金的夏普比率看起来很美,然后一夜之间崩盘。
收益分布特征
两个策略可能有相同的均值和方差,但收益分布形态完全不同。理解分布特征能帮助你预判策略在不同市场环境下的表现。
- 偏度(Skewness):衡量分布的不对称性。正偏度意味着右侧尾巴更长(偶尔有大涨),负偏度意味着左侧尾巴更长(偶尔有大跌)。投资者通常偏好正偏度——小亏常态化,大赚偶尔有。
- 峰度(Kurtosis):衡量尾巴的厚度。高峰度意味着极端收益发生的频率高于正态分布预期(肥尾)。量化策略如果峰度过高,说明存在未被模型捕捉的尾部风险。
- 盈亏比(Profit Factor):总盈利 / 总亏损。> 1.5说明策略的整体盈利能力强,< 1则说明策略长期亏损。
- 胜率(Win Rate):盈利交易次数 / 总交易次数。高胜率策略(如60%+)通常盈亏比低(赚小亏大),低胜率策略(如30%-40%)通常盈亏比高(赚大亏小)。
import numpy as np
import pandas as pd
from scipy import stats
def evaluate_strategy(returns, benchmark_returns=None, risk_free=0.03):
"""
全面的策略评价指标计算
returns: 策略日收益率序列(pandas Series)
benchmark_returns: 基准日收益率序列(可选)
risk_free: 年化无风险利率(默认3%)
"""
results = {}
# 基础收益指标
results['年化收益'] = returns.mean() * 252
results['年化波动'] = returns.std() * np.sqrt(252)
# 夏普比率
excess_return = results['年化收益'] - risk_free
results['夏普比率'] = (excess_return / results['年化波动']
if results['年化波动'] > 0 else 0)
# 索提诺比率
downside_returns = returns[returns < 0]
downside_std = downside_returns.std() * np.sqrt(252)
results['索提诺比率'] = (excess_return / downside_std
if downside_std > 0 else np.inf)
# 最大回撤
cum_returns = (1 + returns).cumprod()
rolling_max = cum_returns.expanding().max()
drawdown = (cum_returns - rolling_max) / rolling_max
results['最大回撤'] = drawdown.min()
# 卡玛比率
max_dd = abs(results['最大回撤'])
results['卡玛比率'] = (results['年化收益'] / max_dd
if max_dd > 0 else np.inf)
# 收益分布特征
results['偏度'] = returns.skew()
results['峰度'] = returns.kurtosis()
results['胜率'] = (returns > 0).mean()
# 盈亏比
avg_win = returns[returns > 0].mean()
avg_loss = abs(returns[returns < 0].mean())
results['盈亏比'] = avg_win / avg_loss if avg_loss > 0 else np.inf
# 信息比率(如果有基准)
if benchmark_returns is not None:
excess = returns - benchmark_returns
tracking_error = excess.std() * np.sqrt(252)
results['信息比率'] = (excess.mean() * 252 / tracking_error
if tracking_error > 0 else 0)
return pd.Series(results)
# 示例:评价两个策略
np.random.seed(42)
strategy_a = np.random.normal(0.0005, 0.015, 252*3) # 高收益高波动
strategy_b = np.random.normal(0.0003, 0.008, 252*3) # 低收益低波动
eval_a = evaluate_strategy(pd.Series(strategy_a))
eval_b = evaluate_strategy(pd.Series(strategy_b))
print("=== 策略A评价 ===")
print(eval_a.round(3))
print("
=== 策略B评价 ===")
print(eval_b.round(3))
与AI一起练习
练习1:让AI分析策略A vs 策略B
我有两个策略的历史日收益序列:
- 策略A:年化收益25%,夏普1.2,最大回撤30%,偏度-1.5
- 策略B:年化收益15%,夏普1.5,最大回撤10%,偏度0.8
请帮我:
1. 从风险调整收益角度,哪个策略更优?
2. 策略A的负偏度意味着什么风险?
3. 如果我是风险厌恶型投资者,应该选择哪个策略?
练习2:让AI设计策略评价仪表盘
请用Python和Streamlit/Matplotlib设计一个策略评价仪表盘:
- 输入:策略日收益序列CSV文件
- 输出:
1. 净值曲线与回撤曲线
2. 月度收益热力图
3. 收益分布直方图(标注偏度峰度)
4. 核心指标卡片(夏普、卡玛、索提诺、最大回撤)
5. 滚动12个月夏普比率时间序列
练习3:让AI讨论尾部风险
我的策略回测夏普比率2.5,但收益分布峰度高达8(正态分布为3)。
请帮我:
1. 解释高峰度意味着什么风险
2. 讨论为什么传统指标(夏普、波动率)会低估这种风险
3. 提出3个衡量和监控尾部风险的方法(如VaR、CVaR、最大连续下跌天数)
动手练习:交互式策略评价计算器
"""策略评价计算器 - 输入净值序列,输出全套指标"""
import numpy as np
import pandas as pd
class StrategyEvaluator:
def __init__(self, nav_series):
"""nav_series: 净值序列(以1为起点)"""
self.nav = nav_series
self.returns = nav_series.pct_change().dropna()
def all_metrics(self):
r = self.returns
metrics = {}
# 收益
metrics['总收益'] = self.nav.iloc[-1] / self.nav.iloc[0] - 1
n_years = len(r) / 252
metrics['年化收益'] = (self.nav.iloc[-1] / self.nav.iloc[0]) ** (1/n_years) - 1
# 风险
metrics['年化波动'] = r.std() * np.sqrt(252)
metrics['下行波动'] = r[r < 0].std() * np.sqrt(252)
cum = (1 + r).cumprod()
peak = cum.expanding().max()
dd = (cum - peak) / peak
metrics['最大回撤'] = dd.min()
# 风险调整收益
rf = 0.03
metrics['夏普'] = (metrics['年化收益'] - rf) / metrics['年化波动']
metrics['索提诺'] = ((metrics['年化收益'] - rf) / metrics['下行波动']
if metrics['下行波动'] > 0 else np.inf)
metrics['卡玛'] = (metrics['年化收益'] / abs(metrics['最大回撤'])
if metrics['最大回撤'] != 0 else np.inf)
# 分布
metrics['偏度'] = r.skew()
metrics['峰度'] = r.kurtosis()
metrics['胜率'] = (r > 0).mean()
wins = r[r > 0]
losses = r[r < 0]
metrics['盈亏比'] = (wins.mean() / abs(losses.mean())
if len(losses) > 0 and losses.mean() != 0 else np.inf)
return pd.Series(metrics)
# 示例
np.random.seed(42)
nav = pd.Series(np.cumprod(1 + np.random.normal(0.0004, 0.012, 756)))
evaluator = StrategyEvaluator(nav)
print(evaluator.all_metrics().round(3))
本章测验
下一章预告
我们已经学会了如何全面评价策略,但还有一个关键问题:策略的参数到底怎么选?凭感觉?看回测?还是有更科学的方法?
第26章将带你进入参数优化的世界。你将学习网格搜索、随机搜索、贝叶斯优化等方法,理解为什么简单的网格搜索往往比复杂的智能优化更稳健,以及如何在优化过程中控制过拟合风险。