第十七章:机器学习在做市中的应用

做市策略做到一定阶段,你会发现传统方法有天花板。比如你很难手动捕捉订单流里的微观结构特征,或者你没法同时优化多个目标——既要赚价差,又要控制库存风险。这时候,机器学习就派上用场了。

我个人习惯把机器学习在做市中的应用分成三类:强化学习做市深度学习预测特征工程。这三块各有各的坑,也各有各的甜头。今天咱们就一个一个聊。

强化学习做市:让策略自己进化

强化学习(RL)做市,说白了就是让算法自己学会怎么报价。你给它一个环境——订单簿、成交数据、库存状态——它自己试错,自己优化。

我最早接触RL做市是在2019年。当时团队想做一个能自适应波动率的做市策略。传统方法要手动调参数,调得头疼。后来我们试了DQN,效果出乎意料。

核心思路:把做市问题建模成马尔可夫决策过程(MDP)。

  • 状态(State):当前订单簿深度、买卖价差、库存量、持仓成本、市场波动率
  • 动作(Action):调整买卖报价的偏移量,或者直接决定是否撤单重挂
  • 奖励(Reward):已实现盈亏 + 库存惩罚项(防止过度持仓)

你想想看,传统做市策略里,你写死一个价差公式,比如「价差 = 固定值 + 波动率系数 × 波动率」。但RL可以学到更复杂的映射关系——比如在低流动性时主动缩窄价差,在高波动时主动扩大保护。

深度Q网络(DQN)策略:从理论到实战

DQN是强化学习里最经典的算法之一。它用神经网络来近似Q函数,也就是「在某个状态下,采取某个动作能获得多少未来收益」。

我在项目中遇到过一个问题:直接用原始订单簿数据做输入,网络根本学不动。为什么?因为订单簿是稀疏的,大部分价格档位没有挂单。后来我改成用相对价格特征——比如「当前买一价与中间价的差值」、「卖一挂单量与买一挂单量的比值」——效果就好多了。

下面是一个简化版的DQN做市伪代码:

class DQNMarketMaker:
    def __init__(self, state_dim, action_dim):
        self.q_network = build_network(state_dim, action_dim)
        self.target_network = build_network(state_dim, action_dim)
        self.replay_buffer = deque(maxlen=10000)
    
    def select_action(self, state, epsilon):
        if random.random() < epsilon:
            return random.choice(range(action_dim))
        q_values = self.q_network(state)
        return argmax(q_values)
    
    def train(self, batch_size=64):
        batch = sample_from_replay_buffer(batch_size)
        states, actions, rewards, next_states = batch
        
        # 计算目标Q值
        target_q = rewards + gamma * max(self.target_network(next_states))
        
        # 更新Q网络
        loss = MSE(self.q_network(states), target_q)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

实战小技巧:DQN训练时,epsilon的衰减速度很关键。我一般从0.9开始,每1000步衰减到0.95倍,最终稳定在0.05左右。衰减太快,策略还没探索够就收敛了;衰减太慢,策略一直随机乱报,赚不到钱。

LSTM订单流预测:看穿市场的「呼吸」

订单流预测,就是预测未来几笔订单的到达方向、到达时间、订单量。这玩意儿对做市商来说太重要了——如果你能提前知道接下来有大买单要砸过来,你肯定要提前调整报价。

LSTM(长短期记忆网络)天然适合处理这种时序数据。它能把过去几十笔订单的序列信息「记住」,然后预测下一笔。

我记得有一次做回测,发现LSTM预测的准确率只有52%,比随机猜好不了多少。后来排查发现,是特征工程出了问题——我只用了订单方向(买/卖)和订单量,忽略了订单间隔时间订单簿不平衡度。加上这两个特征后,准确率直接跳到61%。

嗯,这里要注意:LSTM不是万能的。它擅长捕捉短期模式,比如「连续三笔小买单后大概率跟一笔大卖单」。但如果你指望它预测10分钟后的订单流,那基本没戏——市场太随机了。

特征重要性分析:别让模型学「噪音」

做特征工程时,我踩过最大的坑就是「特征越多越好」。实际上,很多特征之间高度相关,或者根本就是噪音。比如你把过去100笔订单的每一笔都当成一个特征,模型大概率会过拟合。

特征重要性分析能帮你筛选出真正有用的特征。常用的方法有:

方法 原理 适用场景
树模型特征重要性 基于随机森林/XGBoost的Gini重要性 快速筛选,适合初步探索
Permutation Importance 随机打乱某个特征,看模型性能下降多少 模型无关,适合对比不同模型
SHAP值 基于博弈论,解释每个特征对预测的贡献 需要可解释性时首选

我曾经用SHAP分析过一个做市模型,发现「最近5笔订单的买卖方向比」这个特征的重要性,是「过去1小时成交量」的3倍。这说明微观结构特征比宏观统计特征更关键。从那以后,我设计特征时都会优先考虑订单簿层面的信息。

避坑指南:我曾经在特征重要性分析上犯过一个低级错误——用全量数据计算重要性,然后直接用于特征筛选。结果模型在实盘上表现很差。后来发现,市场结构会变,特征重要性也会变。正确的做法是:用滚动窗口定期重新计算特征重要性,或者至少保留最近3个月的数据。

知识体系总览

下面这张图总结了机器学习在做市中的应用框架。你可以把它当成一张「地图」,方便以后查漏补缺。

机器学习在做市中的应用框架 强化学习做市 深度学习预测 特征工程 MDP建模 DQN / PPO 算法 奖励函数设计 LSTM订单流预测 Transformer注意力机制 时序特征提取 订单簿不平衡度 微观结构特征 特征重要性分析 目标:自适应报价 + 风险控制 + 盈利最大化 三大模块相互配合:特征工程提供输入,深度学习做预测,强化学习做决策

这张图里,三大模块是相互配合的。特征工程提供输入,深度学习做预测,强化学习做决策。缺了任何一个环节,整个系统都跑不起来。

我个人建议,刚开始接触机器学习做市的朋友,先从特征工程入手。因为特征质量直接决定了模型的上限。模型选得再好,特征不行也是白搭。等你把特征工程玩熟了,再慢慢往深度学习和强化学习上靠。

最后说一句:机器学习做市不是银弹。它解决的是「在复杂环境下做决策」的问题,但解决不了「市场流动性枯竭」或者「极端行情下的黑天鹅」。任何时候,风控都是第一位的。


无相订单流研究社 微信Lucian808555