相关性在交易中的实际应用·综合运用
📊

相关性在交易中的实际应用·综合运用

(3/3)·从指标实现到系统测试,用相关系数给趋势强度与持续时间定个量化标尺

进阶 第 3/3 篇
很多交易者看趋势只靠肉眼数阴线,却说不清这波下跌到底有多强、能撑几根K线。相关系数不是神学,它只是把‘感觉很稳’变成可观测的区间数值,让你少猜一点。

◍ 用相关性穿越阈值触发买卖

这套 EA 把相关性数组 corr[] 的相邻两根值当作触发源,而不是传统均线或 MACD。corr[0] 是当前柱、corr[1] 是上一柱,阈值由外部参数 Inp_KeyLevel 控制,默认思路是穿越正负阈值才动手。 策略分两类:Inp_Strategy_type==1 时,要求上一根 corr 已突破 +KeyLevel、当前根回落到阈值下方才买;卖则对称,上一根低于 -KeyLevel、当前根回升过 -KeyLevel 才空。类型 2 反过来,用当前根先穿正阈值、前一根还在下方作为买点。 开仓动作本身很直白:BuySignal() 或 SellSignal() 返回 true,就调 Trade.BuyPositionOpen / SellPositionOpen,把手数、止损、止盈、魔术码、注释全从输入参数接进来。外汇与贵金属杠杆高,这类相关性反转信号在历史样本里胜率有波动,实盘前务必在 MT5 策略测试器跑多品种回测。 下面这段是信号函数的骨架,注意 corr 数组和 KeyLevel 的比较顺序直接决定你吃的是突破还是回踩。

MQL5 / C++
if(BuySignal())
     Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
   class=class="str">"cmt">//--- 如果有卖出信号,开启订单
   if(SellSignal())
     Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment);
   }
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 买入条件                                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool BuySignal()
  {
   class="type">bool res=class="kw">false;
   if(Inp_Strategy_type==class="num">1)
      res=(corr[class="num">1]>Inp_KeyLevel && corr[class="num">0]<Inp_KeyLevel)?true:class="kw">false;
   else if(Inp_Strategy_type==class="num">2)
      res=(corr[class="num">0]>Inp_KeyLevel && corr[class="num">1]<Inp_KeyLevel)?true:class="kw">false;
   class="kw">return res;
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 卖出条件                                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool SellSignal()
  {
   class="type">bool res=class="kw">false;
   if(Inp_Strategy_type==class="num">1)
      res=(corr[class="num">1]<-Inp_KeyLevel && corr[class="num">0]>-Inp_KeyLevel)?true:class="kw">false;
   else if(Inp_Strategy_type==class="num">2)
      res=(corr[class="num">0]<-Inp_KeyLevel && corr[class="num">1]>-Inp_KeyLevel)?true:class="kw">false;
   class="kw">return res;
  }

「EURUSD 四年实盘参数的回测设置」

这套 EA 的回测没有走花哨的框架,直接钉死一组可复现的边界:时间窗取 2015.01.01—2018.12.01 的上涨趋势段,品种只跑 EURUSD,初始本金 1000 USD,杠杆 1:500,接入 MetaQuotes-Demo 服务器的 5 位报价。 交易模式标为无延迟。作者原话点明这不是高频策略,延迟扰动极小,所以这种设定对结论干扰可忽略。 K 线用 M1 的 OHLC 撮合。真实分时的预测试显示结果几乎一致,说明用 OHLC 近似不会骗你太多。 优化环节先放开计算方法与策略类型的参数集,跑完再挑最优组合做正式测试。外汇与贵金属杠杆交易风险极高,1000 USD 本金在 1:500 下爆仓可能发生在几个波动点内,回测盈利绝不等于实盘能活。

相关系数策略回测里冒出来的几个反直觉点

把相关系数类振荡指标丢进 MT5 优化器跑一遍,On Decrease 模式(即相关系数下降时触发)给出的净值曲线最好。这只能说明一件事:系数往下掉的时候,这类指标对市场波动的反应比平时快,毕竟基于相关系数的振荡指标——尤其周期拉大以后——滞后性是实打实存在的。 有意思的是,计算最简单的 Fechner 系数没进前 20,它的最佳结果排在第 99 位。如果你图省事想用最轻量的写法,回测会直接教做人。 短周期反而出好结果:前排最优解里盈利和回撤控制都不错,而且周期为 5 的优化下限频繁出现。这进一步坐实了相关性指标在大周期延迟大、表现差的判断。所选期间和关键价位之间,没跑出利润额上的依赖关系,别瞎猜阈值。外汇与贵金属杠杆高,这类信号仅作概率参考,实盘前务必自测。

◍ 别急着下结论

这套相关系数工具包以 Correlation.mq5 为主程序,配套 Trade.mqh 交易类与四个指标(Fechner、Kendall、Pearson、Spearman),压缩包体积 807.75 KB,解压后直接丢进 MT5 终端的 MQL5 目录即可调用。 有用户在 2021 年 8 月反馈编译报 7 个错误,包括未声明标识符和括号不平衡,说明落地前先在本机重编译一遍更稳妥,外汇与贵金属品种叠加相关策略属高风险,实盘前请用策略测试器跑历史数据验证信号逻辑。 工具给出的是相关结构而非方向保证,两段资产价格同向或背离都只是概率现象;把它当观测镜而不是下单指令,才可能少交学费。

把重复计算交给小布
这些跨品种与历史区间的相关系数扫描,小布盯盘的 AIGC 已内置,打开对应品种页即可看到滚动更新的相关强度,你只管读信号、做决策。

常见问题

0.75 常作为强相关阈值参考,但只能说明变量间线性依赖偏高,实际入场仍要结合阈值持续时间与价格结构,外汇贵金属波动大,概率而非确定性。
可以,小布盯盘品种页内置了相关系数面板,支持自选标的与多周期回看,省去手动导出报价跑统计的重复劳动。
常见,例如波动率放大时价差关系常呈曲线依赖;可用互信息或滚动散点图观察,单纯皮尔逊系数会低估这类联系。
避免过度拟合特定年份,建议分周期检验;贵金属与汇价在不同利率环境下相关结构会漂移,样本外验证不可省。