查看全课大纲(第 23 / 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.预案准备和实盘心理建设
优化趋势型策略的思路及方法
约 10 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
过度参数优化是量化策略走向实盘崩溃的最直接原因。如何辨别真 Alpha 与过拟合幻觉?本节深入剖析参数高原(Parameter Plateau)、滚动窗口前进分析(Walk-Forward Analysis, WFA)以及基于波动率过滤的趋势策略稳健优化方案。
💡 核心导读
- 量化策略防过拟合与优化的四大原则:
- 参数高原原则(Parameter Plateau):选择处于宽阔稳定高原中心的参数,绝不使用孤立尖锐的“参数孤岛”;
- 前进分析法(Walk-Forward Analysis):滚动使用 3 年样本内(In-Sample)训练,1 年样本外(Out-of-Sample)检验;
- 波动率与动量双重确认:引入 ATR 波动率过滤器,在低波动蓄势时准备,在波动率扩张时顺势突破;
- 极端行情压力测试(Stress Testing):检验策略在 2008 年金融危机、2015 年股灾等极端暴跌下的回撤保护能力。
┌─────────────────────────────────────────────────────────────┐
│ 策略优化与防过拟合 WFA 架构 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 参数高原分析 (Plateau) │ │ 样本外前进分析 (WFA) │ │ 波动率动态自适应过滤器 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • 绘制 3D 参数热力图 │ │ • 3年 In-Sample 优化 │ │ • ATR 波动率放大才开仓 │
│ • 寻找平坦稳定收益区域 │ │ • 1年 Out-Sample 盲测 │ │ • 避免在低波动盘整中磨损│
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、参数敏感性热力图与参数高原分析
在优化双均线参数 时,若最优参数 周围的邻近参数(如 或 )收益率迅速由正转负,表明该最优参数属于典型的随机过拟合孤岛。稳健的参数必须满足局部导数接近 0 的高原特征:
import pandas as pd
import numpy as np
def run_parameter_grid_search(df: pd.DataFrame, fast_range: list, slow_range: list) -> pd.DataFrame:
"""
双均线参数网格搜索与参数高原评估(合成样例,历史最优参数未来可能失效,存在过拟合风险)
"""
results = []
for f in fast_range:
for s in slow_range:
if f >= s:
continue
ma_f = df['close'].rolling(f).mean()
ma_s = df['close'].rolling(s).mean()
sig = (ma_f > ma_s).astype(int).shift(1).fillna(0)
ret = sig * df['close'].pct_change().fillna(0)
total_ret = ret.sum()
results.append({'fast': f, 'slow': s, 'return': total_ret})
return pd.DataFrame(results)
# 合成价格数据(教学样例,不代表任何真实资产)
rng = np.random.default_rng(42)
returns = rng.normal(0.0002, 0.015, 100)
prices = 100.0 * np.cumprod(1.0 + returns)
df = pd.DataFrame({'close': prices})
# 执行参数网格搜索
fast_range = [5, 10, 15]
slow_range = [20, 30, 40]
grid_results = run_parameter_grid_search(df, fast_range, slow_range)
print("===== 双均线参数网格搜索 =====")
print(f"搜索范围: fast={fast_range}, slow={slow_range}")
print(f"有效参数组合数: {len(grid_results)}")
if not grid_results.empty:
best_row = grid_results.loc[grid_results['return'].idxmax()]
print(f"最佳组合: fast={best_row['fast']}, slow={best_row['slow']}")
print(f"对应累计收益: {best_row['return']:.4f}")
# 展示部分结果
print("前5个组合结果:")
print(grid_results.head())
else:
print("⚠️ 未找到有效参数组合(fast >= slow 被过滤)")===== 双均线参数网格搜索 =====
搜索范围: fast=[5, 10, 15], slow=[20, 30, 40]
有效参数组合数: 9
最佳组合: fast=15.0, slow=20.0
对应累计收益: 0.0619
前5个组合结果:
fast slow return
0 5 20 -0.002124
1 5 30 -0.002104
2 5 40 -0.006158
3 10 20 0.053730
4 10 30 0.032224二、前进分析(Walk-Forward Analysis)滚动评估
前进分析将历史数据切分为多个滚动重叠窗口。在训练集 上优化获得参数 ,并在未参与优化的样本外数据 上执行盲测,连接所有样本外净值构成真正的 WFA 净值曲线。
import pandas as pd
import numpy as np
def walk_forward_validation(df: pd.DataFrame, in_len: int = 150, out_len: int = 50) -> list:
"""
前进分析 WFA 滚动切分与验证(合成样例,历史样本外表现不代表未来,存在策略衰减风险)
"""
wfa_results = []
total_len = len(df)
start = 0
while start + in_len + out_len <= total_len:
in_sample = df.iloc[start : start + in_len]
ext_end = start + in_len + out_len
# 在样本内寻找最佳均线周期(简化规则:若样本内整体上涨,用短周期10,否则用20)
best_p = 10 if in_sample['close'].pct_change().sum() > 0 else 20
# 样本外检验:在截至窗口末端的历史上计算完整信号与收益率,再切出样本外部分
hist_close = df['close'].iloc[:ext_end]
full_sig = (hist_close > hist_close.rolling(best_p).mean()).astype(int).shift(1)
full_ret = hist_close.pct_change()
out_ret = (full_sig.iloc[start + in_len:] * full_ret.iloc[start + in_len:]).sum()
wfa_results.append(out_ret)
start += out_len
return wfa_results
# 合成价格数据(教学样例,包含上涨与下跌段)
rng = np.random.default_rng(123)
n_points = 300
trend = np.linspace(0, 0.001, n_points) # 缓慢上升趋势
noise = rng.normal(0, 0.012, n_points)
returns = trend + noise
prices = 100.0 * np.cumprod(1.0 + returns)
df = pd.DataFrame({'close': prices})
# 执行前进分析验证
wfa_returns = walk_forward_validation(df, in_len=150, out_len=50)
print("===== 前进分析 (WFA) 样本外验证 =====")
print(f"数据长度: {len(df)},样本内长度: 150,样本外长度: 50")
print(f"滚动窗口数: {len(wfa_returns)}")
print("各窗口样本外收益率:")
for i, ret in enumerate(wfa_returns, 1):
print(f" 窗口 {i}: {ret*100:+.2f}%")
print(f"样本外平均收益率: {np.mean(wfa_returns)*100:+.2f}%")
print(f"正收益窗口数: {sum(1 for r in wfa_returns if r > 0)} / {len(wfa_returns)}")===== 前进分析 (WFA) 样本外验证 =====
数据长度: 300,样本内长度: 150,样本外长度: 50
滚动窗口数: 3
各窗口样本外收益率:
窗口 1: -2.69%
窗口 2: +5.65%
窗口 3: -8.67%
样本外平均收益率: -1.91%
正收益窗口数: 1 / 3📝 动手练一练
编写 Python 脚本模拟参数网格搜索与前进分析(WFA),验证策略参数的稳健性:
import pandas as pd
import numpy as np
def run_parameter_grid_search(df: pd.DataFrame, fast_range: list, slow_range: list) -> pd.DataFrame:
"""
双均线参数网格搜索与参数高原评估(合成样例,历史最优参数未来可能失效,存在过拟合风险)
"""
results = []
for f in fast_range:
for s in slow_range:
if f >= s:
continue
ma_f = df['close'].rolling(f).mean()
ma_s = df['close'].rolling(s).mean()
sig = (ma_f > ma_s).astype(int).shift(1).fillna(0)
ret = sig * df['close'].pct_change().fillna(0)
total_ret = ret.sum()
results.append({'fast': f, 'slow': s, 'return': total_ret})
return pd.DataFrame(results)
def walk_forward_validation(df: pd.DataFrame, in_len: int = 150, out_len: int = 50) -> list:
"""
前进分析 WFA 滚动切分与验证(合成样例,历史样本外表现不代表未来,存在策略衰减风险)
"""
wfa_results = []
total_len = len(df)
start = 0
while start + in_len + out_len <= total_len:
in_sample = df.iloc[start : start + in_len]
ext_end = start + in_len + out_len
best_p = 10 if in_sample['close'].pct_change().sum() > 0 else 20
hist_close = df['close'].iloc[:ext_end]
full_sig = (hist_close > hist_close.rolling(best_p).mean()).astype(int).shift(1)
full_ret = hist_close.pct_change()
out_ret = (full_sig.iloc[start + in_len:] * full_ret.iloc[start + in_len:]).sum()
wfa_results.append(out_ret)
start += out_len
return wfa_results
# 模拟具备结构性行情的价格序列(教学合成数据)
rng = np.random.default_rng(42)
returns = rng.normal(0.0006, 0.015, 300)
prices = 100.0 * np.cumprod(1.0 + returns)
df = pd.DataFrame({'close': prices})
# 1. 参数网格搜索
grid_df = run_parameter_grid_search(df, fast_range=[5, 10, 15], slow_range=[20, 30, 40])
# 2. WFA 样本外滚动检验
wfa_rets = walk_forward_validation(df, in_len=150, out_len=50)
print("================ 趋势策略稳健优化与 WFA 测试 ================")
print(f"网格搜索参数组合数: {len(grid_df)} 组")
if not grid_df.empty:
best_idx = grid_df['return'].idxmax()
best_fast = grid_df.loc[best_idx, 'fast']
best_slow = grid_df.loc[best_idx, 'slow']
print(f"最佳参数组合 : Fast={best_fast}, Slow={best_slow}")
else:
print("最佳参数组合 : 无有效组合")
print("WFA 各窗口样本外收益:")
for i, r in enumerate(wfa_rets, 1):
print(f" 窗口 {i}: {r*100:+.2f}%")
print(f"WFA 样本外平均收益 : {np.mean(wfa_rets)*100:+.2f}%")
print("✅ 趋势策略优化与防过拟合 WFA 验证 PASS(合成样例,不构成投资建议)")
print("==========================================================")运行结果输出:
================ 趋势策略稳健优化与 WFA 测试 ================
网格搜索参数组合数: 9 组
最佳参数组合 : Fast=10, Slow=20
WFA 各窗口样本外收益:
窗口 1: +1.49%
窗口 2: -3.55%
窗口 3: -2.98%
WFA 样本外平均收益 : -1.68%
✅ 趋势策略优化与防过拟合 WFA 验证 PASS(合成样例,不构成投资建议)
==========================================================⚠️ 失败案例教学:本例是一个典型的反面教材——网格搜索选出的最优参数组合(Fast=10, Slow=20),经 WFA 样本外盲测的窗口平均收益为 -1.68%,且三个窗口收益剧烈分化(+1.49% / -3.55% / -2.98%,后两个窗口直接亏损)。样本内”最优”到了样本外不仅收益为负,还极不稳定——这正是参数高原不保证样本外有效的实证:样本内表现最好的参数,很可能只是拟合了历史噪声。正确的工程结论是拒绝上线该参数组合,而不是把样本内的”最优”当成实盘依据。
👉 点击查看解析
本节练习围绕趋势型策略的优化展开,重点演示了通过参数调整、信号过滤和风险控制来改善策略表现,并提醒在优化时需注意防范过拟合。
本章小结
- 寻找宽阔平坦的参数高原:坚决弃用孤立峰值的尖锐参数,选择周边环境平稳的最优区间;但须牢记参数高原不保证样本外有效,高原只是必要条件而非充分条件。
- 践行 WFA 滚动前进检验:通过严格的样本外盲测验证策略生命力,有效识别回测过拟合陷阱;凡样本外平均收益为负、逐窗口剧烈波动的最优参数(如本节 -1.68% 且后两窗口亏损的案例)必须果断弃用。
- 引入波动率滤网降低磨损:结合 ATR 动态门槛过滤横盘低波动噪点,提升趋势策略整体盈亏比。
📋 行动清单 (Action Checklist)
- 运行网格搜索与 WFA 代码,绘制参数三维收益热力曲面;
- 测试增加交易摩擦后,最优均线参数向大周期漂移的物理现象;
- 全面复习第四章趋势策略研发流程,预习第五章量化体系风险控制。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第4章课件:趋势型策略的设计与实现PDF · 1.9MB