数据科学和机器学习(第 31 部分):利用 CatBoost AI 模型进行交易(基础篇)
📘

数据科学和机器学习(第 31 部分):利用 CatBoost AI 模型进行交易(基础篇)

第 1/3 篇

CatBoost 凭什么适合 MT5 实盘

CatBoost 是梯度增强家族里少有的原生支持分类特征的库,不需要手动做独热编码就能把品种、时段、新闻标签这类离散变量喂进去,在 MT5 上做信号模型时省掉一大截特征工程。 原文引述其定位为「以高效且可扩展的方式处理分类特征,为许多现世问题提供显著性能提升」,这对多品种外汇与贵金属排查有现实意义,但模型输出只是概率倾向,实盘仍属高风险博弈。 想验证它跟传统 XGBoost 的差别,最快是在 MT5 用 Python 接口跑一份 EURUSD 的 H1 分类样本,对比同样深度下的过拟合程度。

◍ CatBoost 到底解决了什么痛点

CatBoost 是 Yandex 在 2017 年开源的梯度提升决策树库,核心卖点是原生处理分类特征。传统模型拿到类别型变量(比如品种名、时段标签)要么 One-Hot 要么靠人肉编码,CatBoost 内部用有序目标统计直接消化,省掉大量特征工程。 它在 Kaggle 这类竞赛平台爬到了常用模型榜首,靠的不是花哨结构,而是默认参数就能跑出能打的准确性。对比神经网络动辄要领域知识调参搭结构,CatBoost 接数据、设标签、训练三步就能出模型,对交易侧做信号实验很友好。 外汇与贵金属波动受多类离散状态影响(session、币种属性、事件标签),用它能低门槛把非线性关系塞进 EA 预判里;但杠杆市场高风险,模型输出只是概率倾向,不能直接当方向指令。

「CatBoost 在梯度增强里的三个硬差异」

CatBoost 同 LightGBM、XGBoost 一样走梯度增强路线:顺序堆决策树,后一棵树专门补前一棵的误差,最终预测是所有树输出的加权合计,目标就是把损失函数压到最小。 它最实用的点是吃分类特征不用你手动独热或标签编码,内部用基于目标的编码,直接算每个分类值的条件分布。更关键的是用有序增强——某个样本的编码只来自它之前见过的数据点,从机制上掐掉数据泄漏和过拟合的可能。 树结构上也跟另两家分道扬镳:CatBoost 用对称决策树,每个切分点的左右分支走同一条规则。实测这类结构训练更快、内存占用更低,而且对数据里的小扰动更稳,不至于轻微噪声就改了分裂路径。外汇与贵金属波动噪声大,对称树这个特性在实盘特征上可能比非对称树更扛造。

三类增强树在分类特征上的实际分野

做 MT5 信号模型时,选错增强树框架会直接拖慢回测节奏。CatBoost、LightGBM、XGBoost 虽同属梯度增强决策树,但在分类变量处理和树结构上差异明显,直接决定你喂数据前要干多少脏活。 CatBoost 用自动编码加有序增强消化分类特征,对称树平衡均匀增长,预测更快且过拟合风险偏低。LightGBM 和 XGBoost 都要求手工做独热或标签编码;前者逐叶生长、树深而不平衡,精度高但更易过拟合,后者按层级最佳切分,灵活但预测偏慢。 速度层面有硬数据:LightGBM 在大型高维集上通常是三者最快;XGBoost 常是最慢但大型集有效;CatBoost 训练慢于 LightGBM,却在中小含分类特征集上效率更高。外汇与贵金属行情序列里类别型字段(如会话段、事件标签)多,优先试 CatBoost 可能少走弯路,但杠杆品种高风险,任何框架输出都只是概率倾向。

◍ 把 EURUSD 日线喂给 CatBoost 分类器

做信号预测前先定场景:用 OHLC 连续值和日期类特征(月内日、周内日、年内日、月份)去推下一根 K 线的 Buy/Sell。MT5 端采集时这些日期维度被存成整数矩阵,进 Python 后必须转回字符串,CatBoost 才认它们是分类变量。 样本用 EURUSD 的 D1 数据,前 5 行里 Open 从 1.09381 走到 1.10302,对应信号列出现 0/1 交替——1 代表次根收盘高于开盘(偏多),0 则偏空。这类标注直接由 target_open 与 target_close 错位一 row 比较得出。 切分按 70% 训练、random_state=42,得到 6999 条训练索引。分类特征列表写死为 Day、DayofWeek、DayofYear、Month,转 astype(str) 后 X_train.info() 显示这四列 Dtype 变为 object。注意:这格式只 CatBoost 吃得下,丢给 sklearn 普通模型会报错。 外汇与贵金属杠杆高,模型信号仅作概率参考,实盘请先开 MT5 用脚本复采数据跑通下方代码再谈仓位。

MQL5 / C++
pip install catboost
class="kw">import numpy as np
class="kw">import pandas as pd
class="kw">import catboost
from catboost class="kw">import CatBoostClassifier
from sklearn.pipeline class="kw">import Pipeline
from sklearn.model_selection class="kw">import train_test_split
from sklearn.metrics class="kw">import classification_report
class="kw">import seaborn as sns
class="kw">import matplotlib.pyplot as plt
sns.set_style("darkgrid")
df = pd.read_csv("/kaggle/class="kw">input/ohlc-eurusd/EURUSD.OHLC.PERIOD_D1.csv")
df.head()
new_df = df.copy()  # Create a copy of the original DataFrame
# we Shift the &class="macro">#x27;Close&class="macro">#x27; and &class="macro">#x27;open&class="macro">#x27; columns by one row to ge the future close and open price values, then we add these new columns to the dataset
new_df["target_close"] = df["Close"].shift(-class="num">1)  
new_df["target_open"] = df["Open"].shift(-class="num">1)  
new_df = new_df.dropna()  # Drop the rows with NaN values resulting from the shift operation
open_values = new_df["target_open"]
close_values = new_df["target_close"]  
target = []
for i in range(len(open_values)):
    if close_values[i] > open_values[i]:
        target.append(class="num">1) # buy signal
    else:
        target.append(class="num">0) # sell signal
new_df["signal"] = target # we create the signal column and add the target variable we just prepared
print(new_df.shape)
new_df.head()
X = new_df.drop(columns = ["target_close", "target_open", "signal"]) # we drop future values
y = new_df["signal"] # trading signals are the target variables we wanna predict
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=class="num">0.7, random_state=class="num">42)
categorical_features = ["Day","DayofWeek", "DayofYear", "Month"]
X_train[categorical_features] = X_train[categorical_features].astype(str)
X_test[categorical_features] = X_test[categorical_features].astype(str)
X_train.info() # we print the data types now

常见问题

它对类别特征原生支持,不用手动编码,且在默认参数下过拟合概率更低,适合直接喂 EURUSD 日线这类带品种属性的数据。
先按时间点切分训练集和验证集,避免未来数据泄漏;标签用涨跌分类而非连续价格,模型更稳定。
小布可自动拉取品种日线、跑通 CatBoost 分类并给出信号倾向,你只需打开对应品种页看结论,不用自己写训练流程。
多数树模型会把类别当数字排序,产生错误分裂;CatBoost 用目标统计编码内部处理,省去人工 One-Hot 的维度爆炸。
是对称树结构带来的预测速度一致性和低方差,实盘刷新信号时延迟更可控,不容易因数据微变翻脸。