3. 最大回撤控制策略
任务目标
设计并实现一个最大回撤控制规则:当组合净值从历史峰值回撤超过设定阈值时,自动降低仓位或暂停开仓,直到回撤恢复至安全区间。通过回测对比“无风控”与“有风控”两种策略的最终收益与最大回撤,验证风控规则的实际影响。
实现方案
使用Python实现一个简化但完整的回测框架。策略本身为固定比例仓位(如50%仓位买入沪深300指数),风控规则在每日收盘后检查组合净值回撤:若回撤超过阈值(如10%),则次日仓位降至原仓位的一半;若回撤继续扩大至硬性止损线(如15%),则次日完全空仓,直到净值创出新高后才恢复原仓位。为聚焦回撤控制逻辑,不考虑交易成本与滑点。
完整代码
import numpy as np
import pandas as pd
# ========== 参数设置 ==========
RISK_FREE = 0.0 # 无风险利率(简化)
INIT_CAPITAL = 1_000_000 # 初始资金
DRAWDOWN_SOFT = 0.10 # 软阈值:回撤超过10%减仓
DRAWDOWN_HARD = 0.15 # 硬阈值:回撤超过15%清仓
POSITION_BASE = 0.5 # 基础仓位比例
POSITION_REDUCED = 0.25 # 减仓后仓位比例
# ========== 生成模拟价格序列(可复现) ==========
np.random.seed(42)
n_days = 500
daily_ret = np.random.normal(0.0005, 0.012, n_days)
price = 100 * np.cumprod(1 + daily_ret)
# ========== 回测函数 ==========
def run_backtest(returns, use_risk_control=True):
"""returns: 资产日收益率序列; 返回策略净值序列"""
equity = INIT_CAPITAL
peak = INIT_CAPITAL
position = POSITION_BASE
nav_curve = []
for r in returns:
# 当日收益 = 仓位 * 资产收益率
daily_pnl = equity * position * r
equity += daily_pnl
# 更新峰值与回撤
peak = max(peak, equity)
drawdown = (peak - equity) / peak
# 次日仓位调整(基于今日收盘后状态)
if use_risk_control:
if drawdown >= DRAWDOWN_HARD:
position = 0.0
elif drawdown >= DRAWDOWN_SOFT:
position = POSITION_REDUCED
else:
# 净值创新高时恢复基础仓位
if equity >= peak * 0.9999: # 浮点误差容忍
position = POSITION_BASE
# 无风控时始终保持基础仓位
nav_curve.append(equity)
return np.array(nav_curve)
# ========== 运行对比 ==========
nav_no_risk = run_backtest(daily_ret, use_risk_control=False)
nav_with_risk = run_backtest(daily_ret, use_risk_control=True)
# ========== 计算绩效指标 ==========
def calc_metrics(nav):
total_return = nav[-1] / INIT_CAPITAL - 1
peak = np.maximum.accumulate(nav)
max_dd = np.max((peak - nav) / peak)
return total_return, max_dd
ret_no, dd_no = calc_metrics(nav_no_risk)
ret_with, dd_with = calc_metrics(nav_with_risk)
print(f"无风控: 总收益率 {ret_no:.2%}, 最大回撤 {dd_no:.2%}")
print(f"有风控: 总收益率 {ret_with:.2%}, 最大回撤 {dd_with:.2%}")
print(f"风控效果: 回撤降低 {(dd_no - dd_with) / dd_no:.1%}, 收益变化 {ret_with - ret_no:+.2%}")
运行方式
- 安装依赖:
pip install numpy pandas - 将上述代码保存为
drawdown_control.py,执行python drawdown_control.py
验证方法与判定标准
程序输出两组绩效指标。判定风控策略有效的标准为:
- 最大回撤显著下降:有风控的最大回撤应明显低于无风控(通常降低30%以上);
- 收益代价可控:有风控的总收益率不应大幅低于无风控(例如下降不超过5个百分点),或虽收益略降但回撤改善幅度更大;
- 逻辑自洽:观察净值曲线(可自行添加绘图代码),有风控的曲线在回撤期更平缓,且恢复创新高后仓位自动回到基础水平。
由于使用固定随机种子,两次运行结果完全一致,可直接对比。若修改阈值参数(如将软阈值调至5%),应观察到回撤进一步降低但收益也相应减少,这符合风控规则的设计预期。
关键说明
本案例使用模拟价格序列而非真实行情数据,目的是在完全可控的条件下验证风控逻辑的有效性。实际应用中,将 daily_ret 替换为真实资产收益率序列即可直接复用回测框架。仓位调整在每日收盘后计算、次日生效,符合程序化交易的常规执行方式。