拓冰建站拓冰建站
首页 / 资讯中心 / 正文

量化策略过拟合风险控制:用 gs-quant 的 4 种验证手段戳穿回测幻觉

量化策略过拟合风险控制用 gs-quant 的 4 种验证手段戳穿回测幻觉【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant回测报告写着年化夏普 3.2资金实盘后一个季度内转负。本文用量化金融工具包 gs-quant 讲清楚量化策略过拟合风险控制的全流程怎么算样本外衰减率、怎么设计参数敏感性分析与蒙特卡洛稳健性测试、上线后如何设置持续监控告警。理解过拟合的根源三种不同的幻觉先打个比方。一个学生把往年试卷的原题背下来题目原样再现就能拿高分换个问法就不会做。分数看着高考的是记忆不是理解。三种过拟合各偷了别的东西。统计过拟合偷的是样本参数相对数据量太多模型记住的是噪声不是规律。特征是样本内指标远高于样本外。数据窥探偷的是数据同一份数据反复调参直到出现显著的结果。尝试次数越多假阳性概率越高。回测很漂亮但数据已经被用掉没有向前预测力。幸存者偏差偷的是资产池回测样本里只有今天还上市的标的已退市的被悄悄剔除收益系统性虚高。诊断策略时先分清它属于哪一种后面的验证手段各不相同。 gs-quant 风险验证框架组装一条四件套验证链gs-quant 没有提供一个反过拟合的按钮。它提供的是时间序列统计与风险度量的积木验证流水线要自己拼。三个模块分工明确gs_quant/timeseries/滚动夏普、最大回撤、交叉验证统计全部基于它计算gs_quant/risk/风险度量定义与情景冲击框架用于检验策略在不同市场状态下的表现gs_quant/backtests/事件驱动回测引擎上线后做模拟复验本文用到的四个核心函数如下函数位置在过拟合验证中的角色sharpe_ratiogs_quant/timeseries/econometrics.py滚动夏普样本外衰减率的基准max_drawdown同上滚动最大回撤检验尾部风险backtest_basketgs_quant/timeseries/backtesting.py不同调仓频率下做参数敏感性generate_seriesgs_quant/timeseries/statistics.py合成数据单测验证流水线下面按决策链推进先上线前再上线后。上线前验证算出三个核心数字样本内外怎么切、样本外衰减率如何判定第一条规则把数据最后 30% 切出来这一段不允许参与任何参数调优。滚动窗口验证的输入取策略权益曲线。from gs_quant.timeseries.econometrics import sharpe_ratio split int(len(pnl) * 0.7) insample sharpe_ratio(pnl.iloc[:split], w22).iloc[-1] oos sharpe_ratio(pnl.iloc[split:], w22).iloc[-1] decay (insample - oos) / insampledecay就是样本外衰减率样本外夏普不足样本内七成时视为预警不予上线。w22是滚动窗口长度单位交易日样本足够长可放大到 63。参数敏感性分析结论依赖哪几个参数把核心参数各扰动一遍看结果离散度。以调仓频率为例prices是篮子成分价格序列列表weights是对应权重。import numpy as np from gs_quant.timeseries.backtesting import backtest_basket, RebalFreq results [backtest_basket(prices, weights, rebal_freqf).iloc[-1] for f in (RebalFreq.Daily, RebalFreq.Weekly, RebalFreq.Monthly)] sens np.std(results) / abs(np.mean(results))sens是参数敏感性即不同参数组下指标的变异系数超过 0.4 说明结论靠的是运气不是稳健。若你已遍历过大量参数组合这一步必须做。蒙特卡洛稳健性测试策略扛得住多少噪声对权益曲线加一层小噪声重复计算夏普 200 次看分布。import numpy as np import pandas as pd from gs_quant.timeseries.econometrics import sharpe_ratio dist [sharpe_ratio(pd.Series(np.asarray(pnl) np.random.normal(0, 0.002, len(pnl)), indexpnl.index), w22).iloc[-1] for _ in range(200)] p_fail float(np.mean(np.array(dist) 0))p_fail是噪声环境下的失效概率估计超过 10% 说明策略对数据波动过敏稳健性不足。另注意多数回测假设零滑点而市场冲击与流动性成反比高频策略对这个隐藏假设尤其敏感。上线后监控前推式交叉验证与告警前推式交叉验证表现是否跨期稳定窗口沿时间向前滑动每个窗口算一次夏普相当于在全历史上反复做训练—检验。import numpy as np from gs_quant.timeseries.econometrics import sharpe_ratio folds [sharpe_ratio(pnl.iloc[i:i126], w22).iloc[-1] for i in range(0, len(pnl) - 126, 126)] stable np.std(folds) / abs(np.mean(folds)) 0.4folds里每个元素是一个窗口的夏普变异系数超过 0.4 说明策略表现跨期波动大这是过拟合的典型画像。交叉验证有两个轴时间轴和资产轴资产轴可以先用聚类把相似标的分组再逐组验证策略。上线后持续监控告警怎么设上线后样本内数字就是基准线。定期重算滚动指标与基准比对。from gs_quant.timeseries.econometrics import sharpe_ratio, max_drawdown live sharpe_ratio(live_pnl, w22).iloc[-1] dd max_drawdown(live_pnl, w63).iloc[-1] alert live baseline_sharpe * 0.5 or dd -0.25alert是告警触发条件滚动夏普相对样本内基准腰斩或近 63 日最大回撤超过 25%立即重查数据与成本假设。⚠️ 上线前自检清单检查项判定标准处理建议前视偏差特征含交易时点之后的数据改用滞后数据重跑回测样本外衰减率样本外夏普不足样本内 70%不上线缩小参数搜索空间参数敏感性指标变异系数 0.4减少参数数量或简化策略逻辑蒙特卡洛失效概率p_fail 10%增加噪声扰动复验样本外窗口未覆盖完整市场周期拉长样本至少含一段牛熊资产池幸存者偏差数据仅含当前上市标的换用时点数据优化迭代次数尝试次数超过样本点 10%缩小网格保留纯保留段✅ 总结三件马上能做的事先切分再写回测代码。把最后 30% 数据切出来并锁定禁止调参成本最低的防线。把两个数字写进上线审批。样本外衰减率与参数敏感性各占一格双双通过才允许小资金实盘。上线后盯基准线。每周重算滚动夏普与最大回撤与样本内基准比对触发告警先查数据与成本假设。回测报告里那个 3.2 的夏普不是庆祝的理由。样本内外切分、参数敏感性、蒙特卡洛、持续监控四道关卡都通过后它才是一个值得投入实盘的策略。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门