因果推断与量化交易中的回归模型探索·综合运用
(3/3)·方向胜率70%也可能亏,回归模型如何把价格波动幅度变成可交易信号
很多交易者以为分类器胜率高就能赚钱,实盘里却常被小幅波动洗掉利润。二分类只给方向,不给幅度,EA没法区分无效噪音和真正该吃的行情。这篇收尾把回归模型接进MT5,让信号带上报价空间。
◍ 在MT5里给回归信号加阈值护栏
两个分类模型换成回归模型后,开仓判断就从‘是/否’变成了‘值够不够大’,这时候阈值参数才有实际意义。buy_threshhold 和 sell_threshhold 直接拦掉主模型里太弱的信号——比如预测波动不到10点,扣掉点差和手续费基本没油水,这类单子就该过滤掉。 meta_threshhold 走的是另一层逻辑:它用前文因果推断去估‘预测值 vs 未来真实波动’的可能偏差。偏差超了说明主模型在这段行情里可能已经失准,同样不发单。这套护栏在外汇和贵金属上尤其要手调,因为这两类品种滑点和点差跳变频繁,阈值写死容易吃暗亏。 策略测试器里跑一遍就能看见差异。前向测试从2024年初起,模型表现相当稳,核心就是阈值没乱设。你可以直接把 buy/sell_threshhold 从默认改小到5~8点试,回测曲线通常会更干净。 模型本身也能换特征或参数重训。有一组用不同参数训出来的模型,不碰阈值在新数据上也走得顺;但把阈值重新校准后,从2024年初收益曲线更平稳向上。 另一路用均值交易标注函数做测试,tol=1e-2 已经比裸模型准,把训练 tol 收到 1e-3,过滤后的信号质量还能再提一截。贵金属回测里这个改动对假突破的剔除最明显。
「把回归模型塞进EA的几个改动点」
要把 sklearn 训练好的回归模型在 MT5 里跑起来,先得在 Python 侧装好 skl2onnx,用 convert_sklearn 把模型转成 ONNX 格式;这一步没做,EA 端连模型文件都加载不了。 EA 里原来跑推理的代码要改:现在用 #define 把模型名、周期数组、填充函数全宏定义化,换品种或换周期只改宏就行,不用动逻辑主体。 阈值相关的输入变量是新加的,默认 buy_threshold = 0.00001、sell_threshold = -0.00001、meta_threshold = 0.001,都是 double 类型,实盘前建议在策略测试器里扫一遍参数。 信号触发逻辑很直接:先卡点差(Ask-Bid < max_spread*_Point)和 meta_sig 绝对值小于 meta_threshold,再判 sig > buy_threshold 开买、sig < sell_threshold 开卖;外汇和贵金属杠杆高,点差跳变可能让信号失效,验证时先用 EURUSD H1 回测看成交分布。
from skl2onnx class="kw">import convert_sklearn from skl2onnx.common.data_types class="kw">import FloatTensorType vectorf y_main(class="num">1), y_meta(class="num">1); OnnxRun(ExtHandle, ONNX_DEBUG_LOGS, f, y_main); OnnxRun(ExtHandle2, ONNX_DEBUG_LOGS, f_m, y_meta); class="type">class="kw">float sig = y_main[class="num">0]; class="type">class="kw">float meta_sig = y_meta[class="num">0]; input class="type">class="kw">double buy_threshold = class="num">0.00001; input class="type">class="kw">double sell_threshold = -class="num">0.00001; input class="type">class="kw">double meta_threshold = class="num">0.001; class="macro">#define model ExtModel_EURUSD_H1_0 class="macro">#define model_m ExtModel2_EURUSD_H1_0 class="macro">#define periods PeriodsEURUSD_H1_0 class="macro">#define periods_m Periods_mEURUSD_H1_0 class="macro">#define fill_arrays fill_araysEURUSD_H1_0 class="macro">#define fill_arrays_m fill_arays_mEURUSD_H1_0 if((Ask-Bid < max_spread*_Point) && MathAbs(meta_sig) < meta_threshold && AllowTrade(OrderMagic)) if(countOrders(OrderMagic) < max_orders && CheckMoneyForTrade(_Symbol, LotsOptimized(), ORDER_TYPE_BUY)) { class="type">class="kw">double l = LotsOptimized(); if(sig > buy_threshold && Allow_Buy) { class="type">int res = -class="num">1; do { class="type">class="kw">double stop = Bid - stoploss * _Point; class="type">class="kw">double take = Ask + takeprofit * _Point; res = mytrade.PositionOpen(_Symbol, ORDER_TYPE_BUY, l, Ask, stop, take, bot_comment); Sleep(class="num">50); } while(res == -class="num">1); } else { if(sig < sell_threshold && Allow_Sell) { class="type">int res = -class="num">1; do { class="type">class="kw">double stop = Ask + stoploss * _Point; class="type">class="kw">double take = Bid - takeprofit * _Point; res = mytrade.PositionOpen(_Symbol, ORDER_TYPE_SELL, l, Bid, stop, take, bot_comment); Sleep(class="num">50); } while(res == -class="num">1); } }
空小节无内容可析
本小节原文未提供任何技术文字或代码,仅残留一个右大括号与代码块闭合标记,无可用数据点与技术点可提取。 若你手头有对应 MQL5 原文片段,贴出后我可补做逐行拆解与验证要点。
◍ 记住这一条就够了
回归模型这套思路不是交易系统的唯一解,但确实能把机器学习EA的调优做细:靠阈值把原本亏的模型扳成盈利,特征组合和标注函数你随便换,品种和周期也能平移去测。 配套给的就是两套压缩包——Python端主训练脚本 causal regression.py 加标注、测试、导出模块,MT5端是 regression trader.ex5 和源码,还有 Trend following 文件夹里的ONNX模型和头文件。EURUSD_H1.csv 是从终端导出的报价,直接能跑。 评论区有个实打实的点:有用户用附带的同一套代码,MT5里 buy/sell 阈值设 0.0001 / -0.0001,交易量却比文章少很多;作者回说 meta-threshold 原文是 0.001,建议测试时抬到 0.01 或 0.1,之后所有阈值都能再优化。 换品种时删掉 ONNX_EURUSD 不够,EA行为不会变;得在代码里加载Python生成、改名后的 .mqh 头文件才会吃新数据。外汇和贵金属波动剧烈、杠杆高危,任何阈值方案都只是概率倾向,上实盘前先开MT5逐参数验证。
class="macro">#include <Trend following/EURUSD_H1 ONNX include class="num">0.mqh>