第十四章:做市策略优化
做市策略写出来只是第一步。真正让它赚钱,得靠优化。我见过太多团队,策略逻辑漂亮得不行,一上线就亏钱。为什么?参数没调好,或者压根没考虑市场环境变化。
这一章,咱们聊聊怎么把做市策略从「能用」变成「好用」。我会从参数调优讲起,再到机器学习辅助报价,最后聊聊强化学习和多目标优化。嗯,内容有点多,但都是实战干货。
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:总盈亏,越大越好
- 夏普比率:风险调整后收益
- 最大回撤:越小越好
- 库存周转率:反映做市活跃度
- 成交率:报价被成交的比例
怎么处理多目标?
我常用的方法有两种:
- 加权求和法:给每个目标一个权重,合成一个目标。简单,但权重不好设。
- 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 知识体系总览
说了这么多,咱们用一张图把整个优化体系串起来。这样你心里有个框架,知道每一步在干什么。
这张图把整个优化流程串起来了。从原始策略出发,你可以走参数调优的路,也可以加机器学习辅助,或者直接上强化学习。最后,所有优化目标都要通过多目标优化来平衡。
我的建议:别贪多。先做好参数调优,再考虑机器学习。强化学习是锦上添花,不是雪中送炭。我见过太多团队,RL搞了半年,效果还不如手动调参。
好了,这一章的内容就到这儿。做市策略优化是个持续的过程,没有一劳永逸的方案。多试、多测、多复盘,慢慢你就能找到感觉。