关于因果网络分析(Causality Network Analysis,CNA)和向量自回归(Vector Autoregression,VAR)模型在市场事件预测中的应用实例·进阶篇
📘

关于因果网络分析(Causality Network Analysis,CNA)和向量自回归(Vector Autoregression,VAR)模型在市场事件预测中的应用实例·进阶篇

第 2/3 篇

「用 VAR 把多个品种的动态关系建模出来」

向量自回归(VAR)适合处理两个及以上时间序列互相牵扯的场景。在 MT5 里做跨品种或指标联动分析时,它把每个变量的当前值写成自身过去滞后项与其他变量过去滞后项的线性组合,因此能保留系统内部的丰富动态,而不是单看一条线。 这套系统里三个函数分工明确:TrainVARModel 负责用历史数据训练模型,PredictVARValue 拿训好的模型出预测值,OptimizeVARModel 则在滞后阶数和变量子集里挑组合,降低过拟合概率。外汇与贵金属杠杆高、跳空频繁,VAR 给出的联动信号只是概率倾向,实盘前务必在策略测试器跑多品种回测。

◍ 滞后一阶双变量VAR长这样

实战里若只看单一品种价格做外推,容易漏掉跨品种联动。滞后为1的两变量VAR把t时刻两个序列各自写成前一刻自身与对方值的线性组合: y1,t = c1 + φ11·y1,t-1 + φ12·y2,t-1 + ε1,t y2,t = c2 + φ21·y1,t-1 + φ22·y2,t-1 + ε2,t 这里c1、c2是常数项,φij是待估系数,ε为误差项。系统靠历史样本把这组系数估出来,才能往前推一步。 对外汇或贵金属交易者,这相当于同时给EURUSD与XAUUSD各建一条带交叉项的回归,而不是分开猜。两个序列互为滞后解释变量时,单序列AR会丢信息,VAR把线性依赖一次抓全。 需要注意,贵金属与外汇杠杆高、波动突发行情多,VAR给出的联合预测只是概率倾向,不代表方向必现,开MT5用两个品种日线跑一下系数估计最能体会边界。

VAR 模型跑起来的四个动作

想把 VAR 用在 MT5 的行情复盘里,先得把流程拆开看。第一步是数据收集:把你打算放进模型的所有变量历史数据拉齐,常见做法是同时取 EURUSD、XAUUSD 外加一个经济指标(比如美国 CPI 同比)的日线收盘,时间窗不短于 500 根 K 线,不然滞后项估计会塌掉。 模型设定是最吃交易经验的一环。你要拍板每个变量留几期滞后,经验上外汇日线用 2~4 阶、贵金属用 1~3 阶比较稳,阶数过高容易过拟合样本内。 估计阶段由统计库算每个变量受自身过去值和其他变量过去值冲击的系数矩阵;MT5 本身不内置 VAR,得借 R 或 Python 桥接算完再回写。 预测是顺理成章的一步:系数定下来后,模型能同时吐出所有变量的多步向前预测,但外汇与贵金属属高杠杆高风险品种,预测只代表历史联动的线性外推,实战中失效概率不低,只能当仓位权重的参考而非方向圣旨。

「自己动手在MT5里搭VAR骨架」

MT5标准库里找不到现成的VAR(向量自回归)函数,要做多变量联动分析只能自己写结构。下面这段示范把模型抽象成struct,把估计和预测拆成两个函数,EA里每笔报价触发一次重估。 代码里EstimateVAR的lag参数直接写死成5,意思是拿最近5根K线的多变量序列去拟合系数矩阵;外汇与贵金属波动聚类明显,lag选太小容易欠拟合,选太大在分钟级数据上会拖慢OnTick。 别把正态当圣经 VAR默认残差近似白噪声,但XAUUSD的跳空会让残差峰度偏高,实盘前先用历史数据跑一遍残差检验再挂真金白银。 把上面代码粘进MT5的MQH里,先只接两个变量(比如EURUSD和XAUUSD的收益率),用2019—2023年H1数据回测,看5 lag下的样本外预测误差是否比单变量ARMA低,再决定是否上更多品种。

MQL5 / C++
class=class="str">"cmt">// Define your VAR model
class="kw">struct VARModel {
    class="type">int lag;
    class="type">int variables;
    class="type">class="kw">double[][] coefficients;
};
class=class="str">"cmt">// Estimate VAR model
VARModel EstimateVAR(class="type">class="kw">double[][] data, class="type">int lag) {
    class=class="str">"cmt">// Implement estimation logic here
    class=class="str">"cmt">// You might use matrix operations for efficiency
}
class=class="str">"cmt">// Make predictions
class="type">class="kw">double[] Forecast(VARModel model, class="type">class="kw">double[][] history) {
    class=class="str">"cmt">// Implement forecasting logic here
}
class=class="str">"cmt">// In your EA or indicator
class="type">void OnTick() {
    class=class="str">"cmt">// Collect your multivariate data
    class="type">class="kw">double[][] data = CollectData();
    
    class=class="str">"cmt">// Estimate model
    VARModel model = EstimateVAR(data, class="num">5); class=class="str">"cmt">// Using class="num">5 lags
    
    class=class="str">"cmt">// Make forecast
    class="type">class="kw">double[] forecast = Forecast(model, data);
    
    class=class="str">"cmt">// Use forecast in your trading logic
    class=class="str">"cmt">// ...
}

◍ 把美元强弱和油价塞进同一张网

做 EUR/USD 的人常犯一个错:只盯欧美本身的 K 线。VAR 的思路是直接把多个联动变量拉进同一个向量里,让模型自己算同期关系。 除了 EUR/USD 本身,至少可以并进去 USD/JPY——它比单一货币对更能反映美元整体强弱;再加布伦特或 WTI 油价,因为能源价格会撬动商品货币和通胀预期;标普 500 用作风险情绪代理;美欧利差则覆盖货币政策端的驱动力。 这样你的观测向量不再是 1 维价格,而是 5 维以上的同期系统。外汇和贵金属杠杆高、波动剧烈,多变量共振只提高信息厚度,不承诺方向,实际信号仍要在 MT5 里用历史数据回测确认。

跑VAR前先过这三道坎

VAR不是接上行情就能用的黑盒。它对历史样本量相当挑剔:变量越多、滞后阶数越高,所需可靠观测值呈非线性上升,实务中少于500根日线去估多变量VAR,参数方差会大到失去参考意义。 计算侧的压力来自维度爆炸。以3变量、滞后8阶为例,仅系数矩阵就有24个待估参数,MT5里若用双重循环逐根重算协方差,单 tick 刷新可能吃掉数毫秒,必须预分配矩阵并只做增量更新。 平稳性是硬假设。价格序列自带趋势和异方差,直接丢进VAR多半伪回归;常见处理是对数收益化或一阶差分后再测ADF。统计显著不等于能下单,最终信号仍要拿你的价格行为经验去过滤——外汇与贵金属杠杆高、跳空频繁,纯计量结论盲用易爆仓。

常见问题

滞后一阶双变量VAR写成 y_t = A1*y_{t-1} + u_t,其中 y_t 是含两个品种收益率的列向量,A1 为系数矩阵,u_t 为残差向量,可直接照此在代码里铺矩阵。
先过平稳性(ADF检验)、滞后阶数筛选、残差自相关三道坎;任一不过关,VAR得出的联动结论都不可信。
可以,小布能直接拉取两品种历史序列做VAR并输出因果网络图,你只需选好品种和样本区间,不用自己写矩阵代码。
四个动作:取多品种同频序列、估算系数矩阵、做残差诊断、用脉冲响应看冲击传导,缺一步模型都立不住。
多为未做平稳处理或滞后阶乱设导致伪回归;先用ADF确认平稳,再用信息准则定阶,概率上能少踩坑。