第二十课:机器学习做市模型

说实话,传统做市模型做到一定程度,你会发现瓶颈很明显。线性模型也好,随机过程也罢,它们对市场非线性关系的捕捉能力有限。我做了几年传统模型后,开始把目光转向机器学习。今天聊聊决策树、随机森林、梯度提升机,以及最重要的——特征工程。

为什么是树模型?

做市交易里,数据噪声大、特征维度高、非线性关系多。神经网络虽然强大,但训练慢、可解释性差。树模型不一样——训练快、能处理缺失值、天然支持特征重要性排序。我个人习惯先用树模型做基线,再考虑要不要上深度学习。

你想想看,订单簿的买卖价差、深度、成交量分布,这些特征之间往往存在复杂的交互关系。比如价差小的时候,深度的影响更大;波动率高的时候,成交量反而可能萎缩。树模型能自动捕捉这些交互,不需要你手动构造交叉项。

核心观点: 在金融时序数据上,梯度提升机(XGBoost/LightGBM)往往比深度学习表现更好,尤其是在数据量不够大的时候。

决策树:最基础的构建块

决策树说白了就是一系列if-else规则的组合。每个节点根据某个特征做分裂,直到叶子节点给出预测值。做市场景里,我们可以用决策树预测短期价格方向,或者判断当前是否适合做市。

举个例子,假设我们想预测未来1秒的价格涨跌。特征可以是:当前买卖价差、最近10笔交易的成交量、订单簿不平衡度。决策树会学习到类似这样的规则:

if 价差 < 0.5 tick and 订单簿不平衡度 > 0.3:
    预测:上涨概率 65%
elif 价差 > 1.0 tick and 最近成交量 < 100:
    预测:下跌概率 70%
else:
    预测:横盘概率 55%

我在项目中遇到过一个问题:单棵决策树很容易过拟合。市场稍微变一下,树的结构就全变了。所以实际中我们几乎不用单棵树,而是用集成方法。

避坑指南: 我曾经用单棵决策树做高频方向预测,回测效果很好,上线就崩了。原因是树深度设到了10层,完全记住了历史噪声。建议树深度控制在3-5层,或者用集成方法。

随机森林:集成带来稳定

随机森林的思路很简单:训练多棵决策树,每棵树用不同的数据子集和特征子集,最后取平均或投票。这样做的好处是方差大大降低,泛化能力提升。

做市交易里,随机森林适合做中低频信号。比如预测未来5分钟的波动率区间,或者判断当前流动性是否充足。我一般用200-500棵树,特征采样比例设为sqrt(总特征数)。

但随机森林有个缺点:对极端值敏感。做市数据里经常出现闪崩、大单冲击,随机森林可能会被这些异常值带偏。这时候梯度提升机表现更好。

梯度提升机:XGBoost与LightGBM

梯度提升机和随机森林不同。它不是并行训练多棵树,而是串行地一棵一棵加树,每棵新树去拟合前面所有树的残差。这样能逐步优化预测精度。

XGBoost和LightGBM是目前最主流的两个实现。我个人的经验是:

特性 XGBoost LightGBM
训练速度 中等 快(基于直方图)
内存占用 较高 较低
对类别特征支持 需要编码 原生支持
小数据集表现 更好 容易过拟合
做市场景推荐 中低频信号 高频信号

做市交易里,我建议这样选:数据量小于10万条,用XGBoost;数据量大且需要快速迭代,用LightGBM。LightGBM的直方图算法能大幅减少内存占用,处理百万级订单簿数据毫无压力。

# 伪代码示例:LightGBM做市信号模型
import lightgbm as lgb

params = {
    'objective': 'binary',
    'metric': 'auc',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.7,
    'bagging_freq': 5,
    'verbose': 0
}

# 训练
model = lgb.train(params, train_data, num_boost_round=500)

# 特征重要性
importance = model.feature_importance()
# 我一般只看top10特征,其他特征考虑剔除
注意: 梯度提升机对学习率非常敏感。学习率设大了容易过拟合,设小了训练太慢。我习惯从0.05开始调,配合早停(early stopping)防止过拟合。

特征工程:做市模型的灵魂

模型再强,特征不行也是白搭。做市交易的特征工程,我总结为三个层次:

  1. 原始特征: 买卖价差、买卖深度、成交量、波动率、订单簿不平衡度。这些是基础,但远远不够。
  2. 统计特征: 过去N笔交易的均值、标准差、偏度、峰度。比如过去100笔成交量的变异系数,能反映流动性是否稳定。
  3. 微观结构特征: 订单到达率、成交间隔、价差恢复时间、订单簿斜率。这些特征对做市策略至关重要。

我个人最看重的一个特征是「订单簿斜率」。它衡量的是买卖两侧深度随价格变化的速率。斜率陡峭说明流动性集中在当前价格附近,做市风险小;斜率平缓说明深度分散,做市风险大。

还有一个容易被忽略的特征:时间特征。不同时间段的市场微观结构差异很大。比如开盘前30分钟和收盘前30分钟,做市策略应该完全不同。我习惯加入小时、分钟、距离开盘时间等特征。

经验之谈: 我曾经花了两周时间做特征工程,把特征从20个扩展到200个,结果模型效果反而下降了。后来发现是冗余特征太多,引入了噪声。建议先用特征重要性筛选,保留top30-50个特征就够了。

知识体系结构图

下面这张图展示了机器学习做市模型的核心逻辑:从原始数据到特征工程,再到模型训练和策略应用。

机器学习做市模型知识体系 订单簿 & 交易数据 特征工程 原始特征 → 统计特征 → 微观结构特征 时间特征 → 特征筛选 → 归一化 模型选择 决策树(基线) 随机森林(中低频) XGBoost/LightGBM(高频) 做市策略应用 方向预测 | 波动率预测 | 流动性判断 | 报价调整

实战中的几个要点

最后分享几个实战中容易踩的坑:

  • 数据泄露: 做特征时千万别用未来信息。比如用未来价格计算波动率,回测结果会好得离谱。我习惯用shift(1)确保所有特征都是历史数据。
  • 时序交叉验证: 随机打乱数据做交叉验证会高估模型效果。必须用时序交叉验证,比如用前80%数据训练,后20%测试。
  • 模型更新频率: 做市模型不能训练一次用一年。市场结构会变,我一般每天或每周重新训练一次,用最近30天的数据。
  • 特征稳定性: 有些特征在不同市场环境下分布差异很大。比如波动率在平静市场和剧烈波动时完全不同。建议做特征分布监控,发现分布偏移就重新训练。
总结一句话: 机器学习做市模型的核心不是模型本身,而是特征工程和数据处理。模型选XGBoost或LightGBM都行,但特征做不好,再强的模型也白搭。

嗯,这一课内容不少。树模型入门简单,但想用好需要大量实践。建议你先从随机森林开始,跑通流程后再上梯度提升机。特征工程方面,多看看订单簿数据,你会发现很多有意思的模式。

交易系统化学习资料 微信Strategy888888