多元回归分析。策略生成程序和策略分析程序二合一(基础篇)
「把策略生成和分析塞进同一个 MT5 程序」
- 年 3 月发布的这套思路,核心是把「策略生成」和「策略分析」做成同一个 MT5 程序,而不是先写生成器、再单独写回测面板。对做价格行为量化的人来说,少切一次环境就少一层数据口径偏差。
它依赖多元回归分析来挑参数组合:用多个自变量(比如几根 K 线的收盘价差、波动率分位)去拟合一个因变量(比如下一根 K 线的方向概率)。在 MT5 里这类计算可以直接用矩阵运算跑,不用导出到 Python 再导回。 公开页显示该文当时有 3730 次查看、24 条讨论,说明这种「二合一」结构在早期 MQL5 社区算偏实操的冷门路线。外汇与贵金属市场高杠杆、滑点随机,任何回归结论都只是概率倾向,开 MT5 用历史数据复算前先确认样本区间是否含极端行情。
用多元回归绕过系统开发死胡同
有个做外汇培训作业的人卡在交易系统开发上快一周,觉得比写论文还难。我让他试多元回归分析,结果他一晚上就从零搭出一套系统过了审。 多元回归的价值在于快速定位指标和价格之间的统计关系,基于这种关系可以在一定概率下由指标值推演价格走向。现代统计软件能同时筛几千个参数找关联,本质像工业化砂里淘金。 把指标数据灌进多元回归做处理,就能产出可直接用的策略和策略生成程序。外汇与贵金属杠杆高、回撤凶,这类统计模型只给概率倾向,不等于必胜。 本文这节只交代思路:用多元回归创建策略的过程,后面会落到具体操作和代码。
◍ 用回归等式拼一个 15 行决策核心
那段通宵写出的系统骨架,本质是一条多元回归等式:把 DeMarker、BearsPower、BullsPower、AC 四个标准指标的滞后差值塞进去,算出 Reg。Reg 大于 0 倾向做多,小于 0 倾向做空。 等式来自 EURUSD H1、2011 年 7 月 1 日到 8 月 31 日共两个月的样本做回归得到的。附带 EA(R_check)里真正管开平仓的代码只有 15 行左右,开发期内没出现测试里常见的超额利润,大概率是因为没做再优化。 下面这段是决策核心的原文,逐行拆一下逻辑: // 先算最近两根 K 线的收盘价差值(换算成点数) double price=(mrate[2].close-mrate[1].close)/_Point; // 如果波动超过 250 点,不交易并平掉当前仓位
| if(price>250 | price<-250){ ClosePosition(); return; } |
|---|
// 回归等式本体 double Reg=22.7+205.2*(buf_DeMarker[1]-buf_DeMarker[2]) -14619.5*buf_BearsPower[1]+22468.8*buf_BullsPower[1] -139.3*buf_DeMarker[1] -41686*(buf_AC[1]-buf_AC[2]); // 查当前是否已有仓位,标记多空 if(myposition.Select(_Symbol)==true){ if(myposition.PositionType()==POSITION_TYPE_BUY) Buy_opened=true; if(myposition.PositionType()==POSITION_TYPE_SELL) Sell_opened=true; } // 仓位和等式同向就不动 if(Reg>0 && Buy_opened==true) return; if(Reg<=0 && Sell_opened==true) return; // 仓位和等式反向就平仓 if(Reg<=0 && Buy_opened==true) ClosePosition(); if(Reg>0 && Sell_opened==true) ClosePosition(); // 用 20 作为过滤阈值再开仓 if(Reg>20) BuyOrder(1); if(Reg<-20) SellOrder(1); 注意 Reg 直接穿越 0 就反转,但开仓加了 ±20 的缓冲。外汇和贵金属波动大、杠杆高,直接挂真仓前务必在 MT5 策略测试器用同周期样本跑一遍验证。
class=class="str">"cmt">//--- checking the price change range class="type">class="kw">double price=(mrate[class="num">2].close-mrate[class="num">1].close)/_Point; class=class="str">"cmt">//--- if the range is big, do not take trades and close the current positions if(price>class="num">250 || price<-class="num">250) { ClosePosition(); class="kw">return; } class=class="str">"cmt">//--- regression equation class="type">class="kw">double Reg=class="num">22.7+class="num">205.2*(buf_DeMarker[class="num">1]-buf_DeMarker[class="num">2]) -class="num">14619.5*buf_BearsPower[class="num">1]+class="num">22468.8*buf_BullsPower[class="num">1] -class="num">139.3*buf_DeMarker[class="num">1] -class="num">41686*(buf_AC[class="num">1]-buf_AC[class="num">2]); class=class="str">"cmt">//--- checking for open positions if(myposition.Select(_Symbol)==true) class=class="str">"cmt">//--- open positions found { if(myposition.PositionType()==POSITION_TYPE_BUY) { Buy_opened=true; class=class="str">"cmt">// class="type">long position(Buy) } if(myposition.PositionType()==POSITION_TYPE_SELL) { Sell_opened=true; class=class="str">"cmt">//--- class="type">short position(Sell) } } class=class="str">"cmt">//--- if an open position follows the trend as predicted by the equation, abstain from doing anything. if(Reg>class="num">0 && Buy_opened==true) class="kw">return; if(Reg<=class="num">0 && Sell_opened==true) class="kw">return; class=class="str">"cmt">//--- if an open position is against the trend as predicted, close the position. if(Reg<=class="num">0 && Buy_opened==true) ClosePosition(); if(Reg>class="num">0 && Sell_opened==true) ClosePosition(); class=class="str">"cmt">//--- opening a position in the direction predicted by the equation. class=class="str">"cmt">//--- using level class="num">20 to filter the signal. if(Reg>class="num">20) BuyOrder(class="num">1); if(Reg<-class="num">20) SellOrder(class="num">1);
「两个月样本外能跑平样本内吗」
图 1 给出训练期内 EA 的净值曲线,图 2 则是 2011 年 9 月 1 日到 2011 年 11 月 1 日共两个月测试数据的表现。实测下来,用前两个月训练出的参数,在后续两个月样本外时段里盈利水平与训练期基本持平,说明这两个月窗口对这套逻辑勉强够用。 基于多元回归硬凑出来的这套 EA 结构并不复杂,却在测试期拿到不弱于训练期的收益。至少在这段贵金属与外汇混合品种上,回归分析能落地成一个正期望系统,但样本外仅两个月,外推置信本来就薄。 别把回归当万能矿机。它在这类线性可分行情里好用,可一旦价格结构切换,系数会快速失效;优点是可解释、易复现,缺点是极度依赖历史区间的代表性,过拟合藏得很浅。