第十四章:做市策略优化

做市策略写出来只是第一步。真正让它赚钱,得靠优化。我见过太多团队,策略逻辑漂亮得不行,一上线就亏钱。为什么?参数没调好,或者压根没考虑市场环境变化。

这一章,咱们聊聊怎么把做市策略从「能用」变成「好用」。我会从参数调优讲起,再到机器学习辅助报价,最后聊聊强化学习和多目标优化。嗯,内容有点多,但都是实战干货。

14.1 参数调优:别小看这步

参数调优,说白了就是找一组让策略表现最好的参数组合。我刚开始做的时候,觉得这玩意儿简单——跑个网格搜索不就完了?后来发现,事情没那么简单。

核心参数有哪些?

  • 报价宽度(Spread):太宽了成交少,太窄了赚不到钱
  • 库存上限(Inventory Cap):控制风险的关键
  • 报价更新频率:太快了容易被市场耍,太慢了跟不上行情
  • 风险厌恶系数:决定了你多怕亏钱

我的经验:别用全局最优参数。市场分时段,早盘和尾盘参数应该不一样。我习惯分时段调参,比如把一天分成4个时段,每个时段单独优化。

调优方法对比:

方法 优点 缺点 适用场景
网格搜索 简单粗暴 维度灾难 参数少(≤3个)
贝叶斯优化 高效,收敛快 实现复杂 参数多,计算贵
遗传算法 全局搜索能力强 容易过拟合 非线性问题
模拟退火 跳出局部最优 收敛慢 复杂目标函数

小技巧:我一般先用网格搜索粗筛,再用贝叶斯优化精调。这样又快又准。

14.2 机器学习辅助报价

传统做市策略,报价规则是写死的。比如「当库存超过上限,就调宽价差」。但市场是活的,死规则肯定吃亏。

机器学习能干嘛?预测短期价格走势、估计订单流不平衡、识别市场状态。把这些预测结果喂给做市策略,报价就能「活」起来。

我常用的几个模型:

  • XGBoost:预测未来1秒的价格方向,准确率大概65%
  • LSTM:捕捉订单流的时序模式,适合高频场景
  • 随机森林:做市场状态分类,比如「震荡」「趋势」「高波动」

避坑指南:我曾经把机器学习模型直接用在实盘上,结果亏惨了。为什么?模型在训练集上表现很好,但实盘数据分布变了。后来我加了在线学习,每5分钟重新训练一次,效果才稳定下来。

一个简单的例子:

# 用XGBoost预测短期价格方向
import xgboost as xgb
from sklearn.model_selection import train_test_split

# 特征:过去10笔交易的价差、成交量、买卖压力
features = ['spread', 'volume', 'buy_pressure', 'sell_pressure']
X = data[features]
y = (data['mid_price'].shift(-1) > data['mid_price']).astype(int)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = xgb.XGBClassifier(n_estimators=100, max_depth=3)
model.fit(X_train, y_train)

# 预测结果用于调整报价
pred = model.predict(current_features)
if pred == 1:  # 预测价格上涨
    bid_price *= 1.001  # 提高买价
else:
    ask_price *= 0.999  # 降低卖价

注意:机器学习模型不能直接输出报价。它只是辅助信号,最终报价还得靠做市逻辑来约束。否则模型一抽风,你就得亏钱。

14.3 强化学习做市策略

强化学习(RL)做市,这几年挺火的。说白了,就是把做市问题建模成一个马尔可夫决策过程(MDP)。智能体(Agent)观察市场状态,选择报价动作,然后获得奖励(赚的钱)。

为什么用RL?

  • 传统策略需要手动设计规则,RL自己学
  • RL能处理高维状态空间(订单簿、库存、波动率等)
  • RL天然适合序列决策问题

我踩过的坑:

刚开始用DQN做做市,训练了三天三夜,结果策略学到的居然是「永远不报价」。为什么?因为不报价就不会亏钱,奖励函数设计有问题。后来我把奖励改成「每成交一笔给正奖励,库存风险给负惩罚」,才学出正常策略。

一个简化的RL框架:

# 伪代码:RL做市策略
class MarketMakerAgent:
    def __init__(self):
        self.inventory = 0
        self.cash = 0
        
    def observe_state(self):
        # 观察订单簿、库存、波动率等
        return state
    
    def choose_action(self, state):
        # 输出:买价、卖价、报价量
        # 用神经网络或Q表
        return bid_price, ask_price, quantity
    
    def update(self, reward):
        # 更新策略参数
        pass

# 训练循环
for episode in range(10000):
    state = env.reset()
    done = False
    while not done:
        action = agent.choose_action(state)
        next_state, reward, done = env.step(action)
        agent.update(reward)
        state = next_state

我的建议:别一上来就搞深度RL。先试试简单的Q-learning或SARSA,理解RL做市的逻辑。等跑通了,再上PPO、SAC这些高级算法。

14.4 多目标优化

做市策略的目标不止一个。赚钱当然重要,但风险控制、库存管理、市场冲击这些也得考虑。多目标优化就是同时优化多个目标,找到一组「帕累托最优」的解。

常见的目标函数:

  • PnL:总盈亏,越大越好
  • 夏普比率:风险调整后收益
  • 最大回撤:越小越好
  • 库存周转率:反映做市活跃度
  • 成交率:报价被成交的比例

怎么处理多目标?

我常用的方法有两种:

  1. 加权求和法:给每个目标一个权重,合成一个目标。简单,但权重不好设。
  2. NSGA-II:遗传算法的多目标版本,直接找帕累托前沿。复杂,但效果好。

实战经验:我一般用加权求和法做日常调优,权重根据市场环境动态调整。比如高波动时,风险权重调高;低波动时,收益权重调高。NSGA-II我用来做季度级的策略重设计。

一个多目标优化的例子:

# 用加权求和法优化做市参数
def objective(params):
    spread, cap, freq = params
    
    # 回测得到多个指标
    pnl = backtest_pnl(spread, cap, freq)
    sharpe = backtest_sharpe(spread, cap, freq)
    max_drawdown = backtest_max_dd(spread, cap, freq)
    
    # 加权求和(注意方向)
    w1, w2, w3 = 0.5, 0.3, 0.2
    score = w1 * pnl + w2 * sharpe - w3 * max_drawdown
    return -score  # 最小化

# 用贝叶斯优化求解
from skopt import gp_minimize
result = gp_minimize(objective, 
                     dimensions=[(0.001, 0.01), (100, 1000), (0.1, 1.0)],
                     n_calls=50)

注意:多目标优化容易过拟合。我见过有人把回测夏普优化到8.0,实盘直接亏成狗。一定要加正则化,或者用滚动窗口验证。

14.5 知识体系总览

说了这么多,咱们用一张图把整个优化体系串起来。这样你心里有个框架,知道每一步在干什么。

做市策略优化知识体系 原始做市策略 参数调优 机器学习辅助报价 强化学习做市 参数调优方法 • 网格搜索 • 贝叶斯优化 • 遗传算法 / 模拟退火 ML辅助报价 • XGBoost 价格预测 • LSTM 订单流建模 • 随机森林状态分类 RL做市 • DQN / PPO / SAC • 状态:订单簿+库存 • 动作:报价+数量 多目标优化(PnL / 夏普 / 回撤)

这张图把整个优化流程串起来了。从原始策略出发,你可以走参数调优的路,也可以加机器学习辅助,或者直接上强化学习。最后,所有优化目标都要通过多目标优化来平衡。

我的建议:别贪多。先做好参数调优,再考虑机器学习。强化学习是锦上添花,不是雪中送炭。我见过太多团队,RL搞了半年,效果还不如手动调参。

好了,这一章的内容就到这儿。做市策略优化是个持续的过程,没有一劳永逸的方案。多试、多测、多复盘,慢慢你就能找到感觉。

无相订单流研究社 微信Lucian808555