将ML模型与策略测试器集成(结论):实现价格预测的回归模型(基础篇)
📘

将ML模型与策略测试器集成(结论):实现价格预测的回归模型(基础篇)

第 1/2 篇

「把回归模型接进MT5测试器做价格预测」

在 MT5 里做价格预测,不一定要另写独立 EA 跑外挂,直接把回归类 ML 模型塞进策略测试器是一条可行路径。思路是:用历史报价训练回归模型,输出下一根 K 线的预测价格(连续值而非涨跌分类),再在测试器的每根柱上调用模型得到预测值,用于触发交易逻辑。 这种集成方式的好处是能复用测试器的滑点、点差、手续费模型,回测更贴近实盘。但外汇与贵金属属高杠杆高风险品种,预测值只是概率倾向,实盘前务必用不同品种、不同周期做样本外验证。 一个最小验证动作:开 MT5 → 策略测试器 → 选任意品种 → 把下方 OnTester 里的模型推断接进来,看预测序列是否跟价格同向漂移。若预测滞后明显,优先调特征窗口而非模型层数。

用回归模型押注一周收盘价

上一篇文章里我们已经把 CSV 文件管理类跑通,历史金融数据的存取不再是瓶颈。这一节直接切入正题:用回归模型去预测金融资产在一周内的收盘价,把它当成价格行为分析里的辅助信号。 价格预测本身不是圣杯,但能帮交易者把「主观猜方向」换成「概率化推演」。若模型对周线级别收盘价的拟合偏差可控,至少能在持仓前先排除一批低胜率情形,顺带框定风险暴露区间。外汇与贵金属杠杆高、跳空频繁,任何预测都只是概率倾向,不能替代仓位管理。 具体落地分三步走:先用 Python 脚本拉历史价与辅助字段,清洗后喂给模型做训练集与测试集;再在线性回归、多项式回归、SVR 之间按训练表现选型,不预设谁更好;最后用测试集跑评估,盯住误差分布而不是单点准确率,发现偏移就回炉调参。 跑完这一节,你会拿到一个能输出周收盘价预测的回归模型文件,把它接进 MT5 的 Python 环境就能对每个品种做快速回测验证。

◍ 挑回归模型先看这五条硬指标

做周线收盘价预测前,先得决定用哪类回归模型。常见选项里,线性回归假设自变量和因变量呈直线关系,靠最小化误差平方和找拟合线,但遇上非线性关系就吃瘪;多项式回归拿不同阶数多项式去弯曲线条,近似能力更强,却容易在训练集上过拟合,泛化到 unseen 数据就掉链子;决策树回归把特征空间切成不重叠区域、用区域内均值预测,能抓复杂非线性,但树一大就过拟合,得靠剪枝和交叉验证压住;SVR 借 RBF 这类核函数建模非线性,代价是训练算力比前几种都贵。 选模型不是比谁高级,而是权衡五条:性能(用 MSE、MAE 这类指标量化)、可解释性(线性模型天然比神经网络好懂)、复杂性(参数多≠好,容易过拟合)、训练时间(线性/多项式远快于神经网络和 SVR)、鲁棒性(抗异常值和噪声的能力)。周收盘价序列里跳空和极值不少,鲁棒性这条不能无视。 本文最终落地用决策树回归,理由很实在:超参数(树深度、每叶最小样本数)能直接控复杂度,在拟合和泛化间找平衡;决策路径是人能读的一系列判断,方便解释哪些因子撬动了收盘价;训练速度比 SVR、神经网络快一个量级;且每步决策基于样本集而非单点,对噪声明暗点不敏感。 但外汇和贵金属周线受宏观事件驱动,高风险环境下没有万能模型。上面五条标准建议你自己在 MT5 里跑一遍:换模型、调超参、看 MSE 曲线,再定哪个适配你的品种。

「用 MT5 接口拉 EURUSD 周线并做回归前清洗」

做价格回归预测,第一道关是数据质量。异常值、噪声和缺失记录会直接拉低模型泛化能力;EURUSD 周线从 2000 到 2022 共约 23 年样本,若不加清洗,决策树容易过拟合到个别跳空周。 下面的 get_rates_between 用 MT5 Python 库直连终端拉历史价:先 initialize 失败就抛异常退出,再用 copy_rates_range 取指定品种和周期,装进 pandas DataFrame;空表直接报错,time 列转成 UTC 可读时间并设为索引。 [CODE] 实际拉取时写死 symbol='EURUSD'、period=TIMEFRAME_W1、起止 2000-01-01 至 2022-12-31(UTC)。拿到 df 后先用 ewm(alpha=0.1) 做指数平滑压噪声——这只是一种轻量示范,真实场景建议对比移动平均、百分位截断再定。 特征方面原文随机选了开盘价、MACD(快 12 / 慢 26 / 信号 9 的 EMA 差)和 EMA 作输入,收盘价为目标;变量选择本身不神秘,关键是别把无关列喂进树里。随后 MinMax 归一化到 [0,1],再 train_test_split 切训练集与测试集。 外汇与贵金属属高风险品种,这套准备流程只是基础口径;不同品种流动性结构不同,直接套用周线参数可能失效,开 MT5 跑一遍上述代码验证返回行数是否合理是必要动作。

MQL5 / C++
def get_rates_between(symbol:str, period : class="type">int, ini : class="type">class="kw">datetime, end : class="type">class="kw">datetime):
    if not mt5.initialize():
        print("initialize() failed")
        mt5.shutdown()
        raise Exception("Error Getting Data")
    rates = mt5.copy_rates_range(symbol, period, ini, end)
    mt5.shutdown()
    rates = pd.DataFrame(rates)
    if rates.empty:
        raise Exception("Error Getting Data")
    rates[&class="macro">#x27;time&class="macro">#x27;] = pd.to_datetime(rates[&class="macro">#x27;time&class="macro">#x27;], unit=&class="macro">#x27;s&class="macro">#x27;)
    rates.set_index([&class="macro">#x27;time&class="macro">#x27;], inplace=True)
    class="kw">return rates
class="kw">import pandas as pd
from class="type">class="kw">datetime class="kw">import class="type">class="kw">datetime, timezone
class="kw">import MetaTrader5 as mt5
from sklearn.preprocessing class="kw">import MinMaxScaler
from sklearn.model_selection class="kw">import train_test_split
symbol = "EURUSD"
date_ini = class="type">class="kw">datetime(class="num">2000, class="num">1, class="num">1, tzinfo=timezone.utc)
date_end = class="type">class="kw">datetime(class="num">2022, class="num">12, class="num">31, tzinfo=timezone.utc)
period = mt5.TIMEFRAME_W1
df = get_rates_between(symbol=symbol, period=period, ini=date_ini, end=date_end)
smoothed_df = df.ewm(alpha=class="num">0.1).mean()
# Function to calculate MACD
def macd(df, fast_period=class="num">12, slow_period=class="num">26, signal_period=class="num">9):
    ema_fast = df[&class="macro">#x27;close&class="macro">#x27;].ewm(span=fast_period).mean()
    ema_slow = df[&class="macro">#x27;close&class="macro">#x27;].ewm(span=slow_period).mean()
    macd_line = ema_fast - ema_slow
    signal_line = macd_line.ewm(span=signal_period).mean()

常见问题

回归模型只能给出概率倾向,外汇高风险,周线预测误差常超30点,建议只当辅助参考而非下单依据。
先剔除停牌缺口与异常跳空K线,再做对数收益处理,避免非交易时段脏数据污染拟合。
小布盯盘的AIGC已内置回归诊断,打开对应品种页即可看到周线拟合与残差提示,不用自己接接口。
重点看R²、残差正态性、多重共线性、样本外MSE、稳定性五条,缺一项都先别实盘。
大概率过拟合或没做样本外验证,贵金属外汇高风险,换时段重跑留出门外数据再判。