第二十课:机器学习做市模型
说实话,传统做市模型做到一定程度,你会发现瓶颈很明显。线性模型也好,随机过程也罢,它们对市场非线性关系的捕捉能力有限。我做了几年传统模型后,开始把目光转向机器学习。今天聊聊决策树、随机森林、梯度提升机,以及最重要的——特征工程。
为什么是树模型?
做市交易里,数据噪声大、特征维度高、非线性关系多。神经网络虽然强大,但训练慢、可解释性差。树模型不一样——训练快、能处理缺失值、天然支持特征重要性排序。我个人习惯先用树模型做基线,再考虑要不要上深度学习。
你想想看,订单簿的买卖价差、深度、成交量分布,这些特征之间往往存在复杂的交互关系。比如价差小的时候,深度的影响更大;波动率高的时候,成交量反而可能萎缩。树模型能自动捕捉这些交互,不需要你手动构造交叉项。
决策树:最基础的构建块
决策树说白了就是一系列if-else规则的组合。每个节点根据某个特征做分裂,直到叶子节点给出预测值。做市场景里,我们可以用决策树预测短期价格方向,或者判断当前是否适合做市。
举个例子,假设我们想预测未来1秒的价格涨跌。特征可以是:当前买卖价差、最近10笔交易的成交量、订单簿不平衡度。决策树会学习到类似这样的规则:
if 价差 < 0.5 tick and 订单簿不平衡度 > 0.3:
预测:上涨概率 65%
elif 价差 > 1.0 tick and 最近成交量 < 100:
预测:下跌概率 70%
else:
预测:横盘概率 55%
我在项目中遇到过一个问题:单棵决策树很容易过拟合。市场稍微变一下,树的结构就全变了。所以实际中我们几乎不用单棵树,而是用集成方法。
随机森林:集成带来稳定
随机森林的思路很简单:训练多棵决策树,每棵树用不同的数据子集和特征子集,最后取平均或投票。这样做的好处是方差大大降低,泛化能力提升。
做市交易里,随机森林适合做中低频信号。比如预测未来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特征,其他特征考虑剔除
特征工程:做市模型的灵魂
模型再强,特征不行也是白搭。做市交易的特征工程,我总结为三个层次:
- 原始特征: 买卖价差、买卖深度、成交量、波动率、订单簿不平衡度。这些是基础,但远远不够。
- 统计特征: 过去N笔交易的均值、标准差、偏度、峰度。比如过去100笔成交量的变异系数,能反映流动性是否稳定。
- 微观结构特征: 订单到达率、成交间隔、价差恢复时间、订单簿斜率。这些特征对做市策略至关重要。
我个人最看重的一个特征是「订单簿斜率」。它衡量的是买卖两侧深度随价格变化的速率。斜率陡峭说明流动性集中在当前价格附近,做市风险小;斜率平缓说明深度分散,做市风险大。
还有一个容易被忽略的特征:时间特征。不同时间段的市场微观结构差异很大。比如开盘前30分钟和收盘前30分钟,做市策略应该完全不同。我习惯加入小时、分钟、距离开盘时间等特征。
知识体系结构图
下面这张图展示了机器学习做市模型的核心逻辑:从原始数据到特征工程,再到模型训练和策略应用。
实战中的几个要点
最后分享几个实战中容易踩的坑:
- 数据泄露: 做特征时千万别用未来信息。比如用未来价格计算波动率,回测结果会好得离谱。我习惯用shift(1)确保所有特征都是历史数据。
- 时序交叉验证: 随机打乱数据做交叉验证会高估模型效果。必须用时序交叉验证,比如用前80%数据训练,后20%测试。
- 模型更新频率: 做市模型不能训练一次用一年。市场结构会变,我一般每天或每周重新训练一次,用最近30天的数据。
- 特征稳定性: 有些特征在不同市场环境下分布差异很大。比如波动率在平静市场和剧烈波动时完全不同。建议做特征分布监控,发现分布偏移就重新训练。
嗯,这一课内容不少。树模型入门简单,但想用好需要大量实践。建议你先从随机森林开始,跑通流程后再上梯度提升机。特征工程方面,多看看订单簿数据,你会发现很多有意思的模式。