昨晚跑一个多品种组合的回测,MT5策略测试器跑到一半直接卡死,日志里报了一堆“correlation matrix not positive definite”,折腾到凌晨两点才搞明白是相关性参数填得太随意了。想起论坛里聊多品种回测的帖子不多,干脆把我踩过的坑整理一下,算是给想深入这块的朋友一点参考。
多品种回测和单品种最大的区别,就是你不能把每个品种当成孤岛。我以前也偷懒,欧美、镑美、黄金各跑各的,然后手动把资金曲线拼起来看,结果实盘一上就发现回撤叠加得厉害——因为欧美和镑美在大多数时候是同向的,你等于变相重仓了美元。所以第一步,先想清楚你要回测的是组合层面的风险,不是单个策略的收益。我一般会在MT5的“品种”列表里先把候选品种拉出来,用脚本算一下近两年的日线收益率相关系数,超过0.7的,要么砍掉一个,要么在参数里做对冲处理。
第二步是配置相关性矩阵。MT5策略测试器本身不直接提供跨品种相关性输入,得靠自定义EA里读CSV或者用全局变量传。我的做法是在EA的OnInit里加载一个相关系数矩阵文件,然后根据当前持仓品种动态调整手数。这里有个坑:矩阵必须是正定的,否则优化器会报错。我一开始手动填了几个相关系数,没注意对称性,结果矩阵非正定,跑了一晚上白跑。后来改成用Python的numpy先算好再导出,省事很多。
第三步,资金分配和杠杆要联动。多品种回测时,测试器默认每个品种独立计算保证金,但实盘是共享净值的。我习惯在EA里加一个总风险敞口上限,比如所有品种的未平仓风险合计不超过净值的2%。参数上,我会把每个品种的风险权重和相关系数挂钩——相关性越高,权重压得越低。这一步在优化时特别耗时,建议先用小样本参数粗筛,别一上来就全参数优化。
第四步,点差和隔夜利息要单独设。不同品种的点差差异很大,黄金和欧美完全不是一个量级。我通常会在测试器的“设置”里把每个品种的点差手动覆盖,而不是用默认值。隔夜利息也别忘了,尤其是持有多日的组合策略,三倍隔夜利息那天能吃掉不少利润。我吃过亏,回测里没算利息,实盘跑了一个月发现收益少了两成。
第五步,样本外验证要按品种分组做。别把所有品种的数据混在一起做交叉验证,那样会掩盖单品种的过拟合。我的习惯是每个品种单独留一段样本外,然后再看组合整体的表现。如果某个品种在样本外垮了,先别急着删,看看是不是相关性结构变了——有时候只是临时脱钩,加个滚动相关系数窗口就能救回来。
最后说个心态上的事。多品种回测很容易让人产生“分散了就安全”的错觉,其实相关性在极端行情下会突然飙升,你以为的对冲可能瞬间变成双倍亏损。我现在的做法是,回测报告里必须有一栏“最大回撤期间各品种相关性变化”,这个比夏普比率更让我安心。
你们跑多品种回测时,有没有遇到过相关性矩阵报错或者优化器卡死的情况?都是怎么处理的?
补充个细节:相关性矩阵别用全历史数据算,我后来改成分段滚动窗口,实盘匹配度高不少。
多品种回测和单品种最大的区别,就是你不能把每个品种当成孤岛。我以前也偷懒,欧美、镑美、黄金各跑各的,然后手动把资金曲线拼起来看,结果实盘一上就发现回撤叠加得厉害——因为欧美和镑美在大多数时候是同向的,你等于变相重仓了美元。所以第一步,先想清楚你要回测的是组合层面的风险,不是单个策略的收益。我一般会在MT5的“品种”列表里先把候选品种拉出来,用脚本算一下近两年的日线收益率相关系数,超过0.7的,要么砍掉一个,要么在参数里做对冲处理。
第二步是配置相关性矩阵。MT5策略测试器本身不直接提供跨品种相关性输入,得靠自定义EA里读CSV或者用全局变量传。我的做法是在EA的OnInit里加载一个相关系数矩阵文件,然后根据当前持仓品种动态调整手数。这里有个坑:矩阵必须是正定的,否则优化器会报错。我一开始手动填了几个相关系数,没注意对称性,结果矩阵非正定,跑了一晚上白跑。后来改成用Python的numpy先算好再导出,省事很多。
第三步,资金分配和杠杆要联动。多品种回测时,测试器默认每个品种独立计算保证金,但实盘是共享净值的。我习惯在EA里加一个总风险敞口上限,比如所有品种的未平仓风险合计不超过净值的2%。参数上,我会把每个品种的风险权重和相关系数挂钩——相关性越高,权重压得越低。这一步在优化时特别耗时,建议先用小样本参数粗筛,别一上来就全参数优化。
第四步,点差和隔夜利息要单独设。不同品种的点差差异很大,黄金和欧美完全不是一个量级。我通常会在测试器的“设置”里把每个品种的点差手动覆盖,而不是用默认值。隔夜利息也别忘了,尤其是持有多日的组合策略,三倍隔夜利息那天能吃掉不少利润。我吃过亏,回测里没算利息,实盘跑了一个月发现收益少了两成。
第五步,样本外验证要按品种分组做。别把所有品种的数据混在一起做交叉验证,那样会掩盖单品种的过拟合。我的习惯是每个品种单独留一段样本外,然后再看组合整体的表现。如果某个品种在样本外垮了,先别急着删,看看是不是相关性结构变了——有时候只是临时脱钩,加个滚动相关系数窗口就能救回来。
最后说个心态上的事。多品种回测很容易让人产生“分散了就安全”的错觉,其实相关性在极端行情下会突然飙升,你以为的对冲可能瞬间变成双倍亏损。我现在的做法是,回测报告里必须有一栏“最大回撤期间各品种相关性变化”,这个比夏普比率更让我安心。
你们跑多品种回测时,有没有遇到过相关性矩阵报错或者优化器卡死的情况?都是怎么处理的?
补充个细节:相关性矩阵别用全历史数据算,我后来改成分段滚动窗口,实盘匹配度高不少。
