多元回归分析。策略生成程序和策略分析程序二合一(基础篇)
📘

多元回归分析。策略生成程序和策略分析程序二合一(基础篇)

第 1/2 篇

「把策略生成和分析塞进同一个 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>250price<-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 策略测试器用同周期样本跑一遍验证。

MQL5 / C++
  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 结构并不复杂,却在测试期拿到不弱于训练期的收益。至少在这段贵金属与外汇混合品种上,回归分析能落地成一个正期望系统,但样本外仅两个月,外推置信本来就薄。 别把回归当万能矿机。它在这类线性可分行情里好用,可一旦价格结构切换,系数会快速失效;优点是可解释、易复现,缺点是极度依赖历史区间的代表性,过拟合藏得很浅。

常见问题

把数据预处理、回归建模和结果输出写在同一文件里,用函数切分模块,避免来回导数据。
可以,用多元回归直接从历史数据拟合输入输出关系,跳过手工试参,但外汇贵金属高风险,样本外可能失效。
小布可读取你的品种数据跑回归初筛,并标出样本外漂移和过拟合警告,你只管看结论。
基础决策核心够用,重点在特征选择和等式结构,代码短不代表逻辑简单,需实盘验证。
概率不高,样本外倾向衰减;建议用滚动窗口重估系数,别把样本内拟合当能力。