尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用 gs-quant 给量化策略做体检:三步防过拟合

用 gs-quant 给量化策略做体检:三步防过拟合 用 gs-quant 给量化策略做体检三步防过拟合【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant先说个常见场景回测夏普 4.2净值曲线平滑得像飞机航线你信心满满地上线。三个月后回撤 18%怎么改参数样本外表现都比样本内差。这通常不是执行层面的问题而是过拟合Overfitting——策略把历史数据的答案背了下来。这篇文章就用 gs-quant 搭一套「过拟合防控」三步体检流程帮你在上线前把策略查一遍。回测太漂亮反而要警惕为什么漂亮本身是危险信号把历史行情想象成一套已经出过答案的模拟卷。第一个成因是参数太多。五个年度的数据配十几个可动参数你总能拼出一条完美曲线——那不是学到了规律而是连卷子上的印刷错误都背下来了拟合的全是噪声。第二个成因是同一份数据反复看。调一次参数看一次结果再调一次再看一次每次回头看都在消耗样本的独立信息。最后那组看起来最漂亮的参数其实早就是样本内了只是你忘了。这两件事的共同点策略的表现来自重复使用同一份数据而不是来自市场规律。所以防过拟合的核心动作只有一件事——换一份数据再考一次。gs-quant 为什么不给一键体检按钮很多工具包会给你一个稳健性检验按钮一键出报告。gs-quant 的思路不同它不替你下结论而是把换数据、换场景、换度量的成本降到最低让你自己反复考。它给的是三块积木gs_quant/timeseriessharpe_ratio、max_drawdown、volatility、correlation、beta这些计量函数都接收一个序列作为输入。序列是你切的哪一段它就算哪一段。切样本外窗口就是改一行代码的事。gs_quant/backtestsStrategy初始组合 触发条件 计息模型配引擎GenericEngine、PredefinedAssetEngine、EquityVolEngine跑回测result_summary按天给出风险度量、Cumulative Cash和单独的Transaction Costs列。交易成本和盈亏分开记账扣没扣成本一目了然。gs_quant/risk 与 gs_quant/marketsPortfolio加PricingContext之上叠加Scenarios如MarketDataShockBasedScenario这种冲击场景回答市场数据平移之后我的持仓值多少。关键设计是回测用的风险度量RiskMeasure和场景压测用的是同一套体系不会出现回测一个账、验证另一个账。这套设计的逻辑是过拟合是数据复用的问题不是工具不够的问题。把再考一次做成低成本操作你才会真的去考。官方事件材料里这张闭环图也体现了同样的思路——输出之后还有再评估环节而不是一条直线走到底。三步跑通验证闭环下面是一个最小闭环。ret假设是你策略的日收益序列索引为日期替换成你自己的回测输出即可。第 1 步数据准备——切时间再切资产import pandas as pd from gs_quant.timeseries import sharpe_ratio, max_drawdown # 示例切分经验值2015-01-01 ~ 2021-12-31 样本内2022-01-01 起样本外 in_sample ret.loc[2015-01-01:2021-12-31] out_sample ret.loc[2022-01-01:]输出是两个等结构的收益序列。多资产策略还应把成分按特征分成几组如流动性、波动率聚类确认样本外覆盖每个组避免只在好考的标的上验证。判读标准样本外窗口必须至少包含一个完整的下跌阶段否则这次验证无效——只考顺风题的成绩单不算数。第 2 步运行验证——同一套度量两个窗口metrics lambda s: pd.Series({ sharpe: sharpe_ratio(s).iloc[-1], max_drawdown: max_drawdown(s).iloc[-1], }) score pd.DataFrame({in_sample: metrics(in_sample), out_sample: metrics(out_sample)}) print(score)输出是一张 2×2 的指标表。注意看的是两列之间的落差不是样本内那一列的绝对值——绝对值高只说明背答案背得好。第 3 步解读结果——按标准判读别凭感觉sharpe_decay (score.loc[sharpe, in_sample] - score.loc[sharpe, out_sample]) \ / abs(score.loc[sharpe, in_sample]) dd_ratio abs(score.loc[max_drawdown, out_sample]) / \ abs(score.loc[max_drawdown, in_sample]) print(f夏普衰减 {sharpe_decay:.0%}回撤放大 {dd_ratio:.1f}x)判读标准如下阈值为经验值请结合你的策略类别调整检查项怎么算阈值经验值样本外夏普衰减(样本内夏普 − 样本外夏普) / 样本内夏普超过 50% 高过拟合风险最大回撤放大样本外最大回撤 / 样本内最大回撤超过 1.5 倍要警惕成本后利润回测 Total 减去 Transaction Costs净利不足毛利一半要警惕参数敏感性关键参数 ±20% 时指标变化幅度超过 30% 说明过度优化别只盯着收益列。把样本外区间再分段比如按年份或牛熊阶段算一遍夏普和回撤如果策略只在某一类行情里赚钱说明它学到的是环境特征而不是规律——这张官方材料里的图说的就是这个道理风险结构要和收益放在一起看。新手最容易踩的三个坑 ⚠️坑一样本外数据看了。你用样本外调过一轮参数它就不再是样本外了只是换了名字的样本内。怎么避留一段从头到尾不碰的 holdout 数据需要调参就在样本内再切验证集。坑二回测按收盘必成交、零成本假设。很多策略扣掉滑点和手续费后利润归零回测里的好看全来自成本幻觉。怎么避跑回测时启用交易成本gs_quant/backtests 里OrderCost与result_summary的Transaction Costs列只看扣费后的Total。坑三用曲线平滑当验证结论。一条平滑曲线可能只是参数把波动压没了。怎么避验证时同时报告回撤幅度和不同子区间的指标任何一项在样本外明显恶化就当作体检不合格处理。体检只是开始一句话收束防过拟合不靠某个神奇函数靠的是换数据、换场景、换度量这套动作被低成本地重复执行。下一步可以去看 gs_quant/documentation 里的回测与风险教程或者直接从 gs_quant/risk 的源码入手把场景压测接进你自己的策略流程里。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表