查看全课大纲(第 22 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
趋势型策略的回测与性能评估
约 63 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
策略回测不是简单的收益曲线拟合,而是对策略在历史不同极端情景下生存能力的全面大考。本节深入剖析趋势策略回测引擎的构建、最大回撤(MDD)、卡玛比率(Calmar)、夏普比率(Sharpe)以及收益回撤比的精细化度量。
💡 核心导读
- 趋势型策略全量绩效评估指标矩阵:
- 年化复合收益率(CAGR):衡量策略长期复利增长能力;
- 最大回撤与回撤持续时间(Max Drawdown & Duration):历史峰值至谷底的最大跌幅及修复所需的交易日天数;
- 卡玛比率(Calmar Ratio ):趋势策略核心性价比指标,要求 Calmar ;
- 月度收益分布热力图(Monthly Return Matrix):评估收益在各年份及不同月份的均匀分布程度。
┌─────────────────────────────────────────────────────────────┐
│ 趋势策略回测与绩效评估全景拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 净值与收益曲线 │ │ 风险与回撤深度 │ │ 综合风险调整后收益 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • CAGR 年化复合收益率 │ │ • Max Drawdown (MDD) │ │ • Sharpe Ratio > 1.2 │
│ • 总收益率 / 基准超额 │ │ • 最长回撤修复期 (天) │ │ • Calmar Ratio > 1.5 │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、最大回撤(Max Drawdown)与卡玛比率数学建模
对于累计净值序列 ,历史高点序列(High Watermark)为 。当前回撤与最大回撤定义为:
卡玛比率(Calmar Ratio)衡量单位最大回撤所换取的年化收益率:
import pandas as pd
import numpy as np
def calculate_advanced_performance_metrics(equity_series: pd.Series) -> dict:
"""
计算 CAGR, 最大回撤, 夏普比率与卡玛比率(合成样例,历史回测不代表未来,存在过拟合风险)
"""
returns = equity_series.pct_change().dropna()
n_days = len(returns)
# 1. CAGR
total_return = equity_series.iloc[-1] / equity_series.iloc[0] - 1.0
cagr = (1.0 + total_return) ** (252.0 / n_days) - 1.0
# 2. Max Drawdown
high_watermark = equity_series.cummax()
drawdown = (high_watermark - equity_series) / high_watermark
mdd = drawdown.max()
# 3. Sharpe & Calmar
vol = returns.std() * np.sqrt(252)
sharpe = (cagr - 0.02) / (vol + 1e-8)
calmar = cagr / (mdd + 1e-8)
return {
'Total_Return': float(total_return),
'CAGR': float(cagr),
'MDD': float(mdd),
'Sharpe': float(sharpe),
'Calmar': float(calmar)
}
# 合成净值曲线样例(包含上涨、盘整与回撤阶段)
rng = np.random.default_rng(42)
n_samples = 100
trend = np.linspace(1.0, 1.3, n_samples)
noise = rng.normal(0, 0.02, n_samples)
drawdown_period = np.array([0.95 if 60 <= i < 75 else 1.0 for i in range(n_samples)])
equity_values = trend * (1 + noise) * drawdown_period
equity_series = pd.Series(equity_values, name='equity')
metrics = calculate_advanced_performance_metrics(equity_series)
print("===== 高级绩效指标计算(合成样例) =====")
print(f"累计总收益: {metrics['Total_Return']:.2%}")
print(f"年化收益 (CAGR): {metrics['CAGR']:.2%}")
print(f"最大回撤 (MDD): {metrics['MDD']:.2%}")
print(f"夏普比率: {metrics['Sharpe']:.2f}")
print(f"卡玛比率: {metrics['Calmar']:.2f}")===== 高级绩效指标计算(合成样例) =====
累计总收益: 26.87%
年化收益 (CAGR): 83.28%
最大回撤 (MDD): 10.17%
夏普比率: 2.16
卡玛比率: 8.19二、单利回测与复利再投资(Compound)机制
趋势策略通过复利再投资能够实现指数级增长,但在回撤期间亏损金额也会同步放大。回测系统必须支持精确的逐日盯市(Mark-to-Market)与资金复利计算。
import pandas as pd
import numpy as np
def run_vectorized_backtest(df_signals: pd.DataFrame, fee_rate: float = 0.001) -> pd.Series:
"""
简单向量化回测引擎(包含扣费,注意未来函数与幸存者偏差风险)
"""
df = df_signals.copy()
df['pos'] = df['signal'].shift(1).fillna(0)
df['ret'] = df['close'].pct_change().fillna(0)
# 扣除换手交易费用
df['trades'] = df['pos'].diff().abs().fillna(0)
df['cost'] = df['trades'] * fee_rate
df['strat_ret'] = df['pos'] * df['ret'] - df['cost']
equity = (1.0 + df['strat_ret']).cumprod()
return equity
# 合成价格与信号数据
rng = np.random.default_rng(123)
n_days = 50
base_price = 100.0
returns = rng.normal(0.0005, 0.015, n_days)
prices = base_price * np.cumprod(1 + returns)
df_sig = pd.DataFrame({'close': prices})
# 生成随机买卖信号(0或1)
df_sig['signal'] = rng.integers(0, 2, size=n_days)
equity_curve = run_vectorized_backtest(df_sig, fee_rate=0.001)
print("===== 向量化回测引擎演示 =====")
print(f"合成数据天数: {len(df_sig)}")
print(f"初始价格: {df_sig['close'].iloc[0]:.2f}")
print(f"最终价格: {df_sig['close'].iloc[-1]:.2f}")
print(f"策略最终净值: {equity_curve.iloc[-1]:.4f}")
print(f"交易次数(信号变化): {int(df_sig['signal'].diff().abs().sum())}")===== 向量化回测引擎演示 =====
合成数据天数: 50
初始价格: 98.57
最终价格: 114.59
策略最终净值: 1.0332
交易次数(信号变化): 25📝 动手练一练
编写 Python 仿真脚本,对包含假突破与主升浪的走势执行全流程回测并输出绩效指标:
import pandas as pd
import numpy as np
def calculate_advanced_performance_metrics(equity_series: pd.Series) -> dict:
"""
计算 CAGR, 最大回撤, 夏普比率与卡玛比率(合成样例,历史回测不代表未来,存在过拟合风险)
"""
returns = equity_series.pct_change().dropna()
n_days = len(returns)
# 1. CAGR
total_return = equity_series.iloc[-1] / equity_series.iloc[0] - 1.0
cagr = (1.0 + total_return) ** (252.0 / n_days) - 1.0
# 2. Max Drawdown
high_watermark = equity_series.cummax()
drawdown = (high_watermark - equity_series) / high_watermark
mdd = drawdown.max()
# 3. Sharpe & Calmar
vol = returns.std() * np.sqrt(252)
sharpe = (cagr - 0.02) / (vol + 1e-8)
calmar = cagr / (mdd + 1e-8)
return {
'Total_Return': float(total_return),
'CAGR': float(cagr),
'MDD': float(mdd),
'Sharpe': float(sharpe),
'Calmar': float(calmar)
}
def run_vectorized_backtest(df_signals: pd.DataFrame, fee_rate: float = 0.001) -> pd.Series:
"""
简单向量化回测引擎(包含扣费,注意未来函数与幸存者偏差风险)
"""
df = df_signals.copy()
df['pos'] = df['signal'].shift(1).fillna(0)
df['ret'] = df['close'].pct_change().fillna(0)
# 扣除换手交易费用
df['trades'] = df['pos'].diff().abs().fillna(0)
df['cost'] = df['trades'] * fee_rate
df['strat_ret'] = df['pos'] * df['ret'] - df['cost']
equity = (1.0 + df['strat_ret']).cumprod()
return equity
# 模拟 250 天 K 线数据
rng = np.random.default_rng(42)
returns = rng.normal(0.001, 0.015, 250)
prices = 100.0 * np.cumprod(1.0 + returns)
df = pd.DataFrame({'close': prices})
# 构造均线交叉信号(双均线趋势策略)
df['ma10'] = df['close'].rolling(10).mean()
df['ma30'] = df['close'].rolling(30).mean()
df['signal'] = (df['ma10'] > df['ma30']).astype(int)
equity = run_vectorized_backtest(df)
metrics = calculate_advanced_performance_metrics(equity)
print("================ 趋势策略回测绩效评估 ================")
print(f"累计总收益率 : {metrics['Total_Return']*100:.2f}%")
print(f"年化收益率 : {metrics['CAGR']*100:.2f}%")
print(f"最大回撤 MDD : {metrics['MDD']*100:.2f}%")
print(f"卡玛比率 : {metrics['Calmar']:.2f}")
assert metrics['MDD'] >= 0, "最大回撤计算错误!"
print("✅ 趋势策略回测与性能评估测试 PASS")
print("====================================================")运行结果输出:
================ 趋势策略回测绩效评估 ================
累计总收益率 : -13.59%
年化收益率 : -13.74%
最大回撤 MDD : 21.36%
卡玛比率 : -0.64
✅ 趋势策略回测与性能评估测试 PASS
====================================================注意:本例卡玛比率为 -0.64(累计收益 -13.59%、最大回撤 21.36%),未达 Calmar > 0 的基本要求,说明该均线交叉策略在此合成行情中实际亏损、风险调整后不具优势,距离实盘可用差距显著。
👉 点击查看解析
趋势型策略回测的核心是用均线、突破等趋势信号确认方向,并计入手续费与滑点以更真实地反映收益;评估时需综合年化收益率、最大回撤和夏普比率,重点观察策略在趋势行情中获利、在震荡行情中可能反复止损的表现。
本章小结
- 卡玛比率优于单一收益率:以单位回撤创造的收益率作为衡量趋势策略优劣的核心标准。
- 严密监控回撤持续期:过长的回撤修复期(如超过 6 个月)会在实盘中严重摧毁交易者的执行信心。
- 真实扣除交易滑点摩擦:回测必须将滑点与交易佣金作为硬约束计入净值计算,确保回测结果可落地。
📋 行动清单 (Action Checklist)
- 运行回测绩效测试代码,计算策略在不同年化波动率下的夏普比率变化;
- 输出按季度统计的盈亏分布表(Quarterly Win-Loss);
- 预习下一节,掌握趋势策略的样本外过拟合检验与优化方法。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第4章课件:趋势型策略的设计与实现PDF · 1.9MB