🏠
AI量化交易 · 第二十五章
目录
CHAPTER 25

策略评价指标

用多维度的尺子衡量策略好坏

本章导航

  1. 学习目标
  2. 故事引入:只看收益的投资者
  3. 核心知识:策略评价指标体系
  4. AI实践:让AI帮你全面评价策略
  5. 动手练习:策略评价指标计算器代码
  6. 本章测验
  7. 下一章预告

学习目标

如果你只能用一个数字来评价策略,你会选什么?大多数人的第一反应是年化收益率。但这就像只根据身高来判断一个人是否健康——高个子可能患有严重的心脏病。

一个优秀的量化交易员必须学会用多维度的尺子衡量策略。收益只是故事的一半,风险才是决定你能走多远的关键。

本章结束后,你将能够:

故事引入:只看收益的投资者

2015年,老刘在朋友推荐下买了某私募产品。产品宣传页上赫然印着:过去3年年化收益65%!老刘心动了,投入100万。

第一年,产品赚了80%。老刘觉得自己找到了财富密码。第二年,产品亏了60%。第三年,又亏了30%。三年下来,100万变成了大约50万。

老刘后来才看到完整的数据:这个产品虽然年化收益高达65%,但最大回撤高达75%,夏普比率只有0.4。也就是说,它用极其激进的方式博取高收益,一旦市场转向,投资者就要承受灭顶之灾。

如果只看到一个数字就做决策,你很可能成为下一个老刘。量化交易的精髓之一,就是用严谨的多维度指标替代直觉判断。

核心知识:策略评价指标体系

收益类指标

收益是最直观的指标,但不要只看绝对数字——同样的年化收益,用10年时间和用1年时间达到,意义完全不同。

风险类指标

风险是收益的孪生兄弟。不理解风险,就无法真正理解收益。

风险调整收益指标

这才是评价策略的黄金标准——每承担一单位风险,能获得多少收益?

flowchart TD
    A[策略收益] --> B[风险调整收益指标]
    B --> C[夏普比率
收益/总波动] B --> D[索提诺比率
收益/下行波动] B --> E[卡玛比率
收益/最大回撤] B --> F[Omega比率
上行收益/下行收益] B --> G[信息比率
超额收益/跟踪误差]
⚠️ 点击展开:夏普比率的陷阱

夏普比率看似客观,实则暗藏玄机:

陷阱1:负收益策略也可能有高夏普。如果一个策略稳定地每天亏0.01%,波动率极低,它的夏普比率可能接近0甚至为正(如果无风险利率更低)。但这是一个稳定亏损的策略!

陷阱2:夏普可以被操纵。通过平滑净值(如用月末数据而非日数据)、使用高杠杆放大收益同时放大波动(但杠杆本身不提高夏普)、或者选择特定时间段,都可以人为提高夏普。

陷阱3:正态分布假设。金融收益通常具有肥尾特征,夏普比率低估了极端风险。2008年金融危机前,很多基金的夏普比率看起来很美,然后一夜之间崩盘。

收益分布特征

两个策略可能有相同的均值和方差,但收益分布形态完全不同。理解分布特征能帮助你预判策略在不同市场环境下的表现。

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))
📊 点击展开:指标对比计算器
夏普: 1.13 | 卡玛: 1.00

本章测验

测测你的理解
1. 夏普比率和索提诺比率的核心区别是什么?
  • A. 夏普比率计算更简单
  • B. 夏普比率惩罚所有波动,索提诺比率只惩罚下行波动
  • C. 索提诺比率只适合股票策略
  • D. 夏普比率考虑了无风险利率,索提诺没有
夏普比率的分母是总波动率(标准差),这意味着上涨波动也会被惩罚。索提诺比率只计算低于目标收益的下行波动,对非对称收益策略更公平。
2. 卡玛比率的计算方式是什么?
  • A. 年化收益 / 最大回撤的绝对值
  • B. 年化收益 / 年化波动率
  • C. 总收益 / 总亏损
  • D. 夏普比率 / 最大回撤
卡玛比率 = 年化收益 / |最大回撤|。它直观衡量了每承担一单位最大回撤痛苦,能获得多少年化收益。卡玛 > 1通常被视为可接受。
3. 收益分布的负偏度(左偏)意味着什么?
  • A. 分布左侧尾巴更长,偶尔有大跌的风险
  • B. 策略总是亏损
  • C. 收益分布完全对称
  • D. 策略没有任何风险
负偏度意味着收益分布左侧(亏损侧)尾巴更长,策略虽然大部分时候小赚,但偶尔会发生大幅亏损。这种策略看起来很稳,但一旦发生黑天鹅,损失巨大。

下一章预告

我们已经学会了如何全面评价策略,但还有一个关键问题:策略的参数到底怎么选?凭感觉?看回测?还是有更科学的方法?

第26章将带你进入参数优化的世界。你将学习网格搜索、随机搜索、贝叶斯优化等方法,理解为什么简单的网格搜索往往比复杂的智能优化更稳健,以及如何在优化过程中控制过拟合风险。

参数优化就像调吉他弦——太松了音不准,太紧了弦会断。找到那个刚刚好的位置,才是真正的艺术。

觉得有收获?分享给同样对量化交易感兴趣的朋友

上一章
Walk-Forward分析
滚动优化与样本外验证的正确打开方式
下一章
参数优化
如何科学选择策略参数,避免优化陷阱

如果这本书对你有所启发,欢迎支持我继续创作

赞赏二维码