第四章:混合策略与随机化
好,咱们进入第四章。这一章我特别想跟你聊聊——混合策略。说实话,很多做量化的人一听到「混合策略」就觉得是纯数学概念,离实战很远。但我个人觉得,这恰恰是博弈论里最接地气的东西之一。
你想想看,在交易里,如果你的策略是纯确定性的——比如「MACD金叉就买入」——那别人一旦摸清你的套路,就能提前埋伏,让你接盘。这就是纯策略的致命伤。而混合策略,说白了就是让你的对手猜不透你。
4.1 混合策略纳什均衡:为什么随机化是理性的?
先讲个故事。我记得有一次跟一个做高频的朋友聊天,他说他们团队有个策略,专门盯着某个大机构的订单流。那个大机构后来学乖了,开始随机化下单时间——有时候提前,有时候延后,有时候拆单。结果呢?我朋友那个策略的夏普比率直接腰斩。
这就是混合策略纳什均衡的实战体现。在博弈论里,混合策略纳什均衡是指:每个参与者以一定的概率分布选择自己的纯策略,使得没有任何一方能通过单方面改变自己的概率分布而获得更高收益。
核心公式:
在混合策略纳什均衡中,每个参与者选择的概率分布,必须使得对手的所有纯策略的期望收益相等。
用数学表达就是:对于参与者 i,其混合策略 σ_i 满足:
E[ u_i(σ_i, σ_{-i}) ] ≥ E[ u_i(s_i, σ_{-i}) ],对所有 s_i ∈ S_i 成立
嗯,这里要注意:混合策略不是「随便乱来」,而是有数学依据的随机化。你的随机化参数,必须让对手无论选什么策略,收益都一样。这样对手就失去了「针对性优化」的动机。
4.2 交易中的混合策略:一个经典例子
咱们用一个简化模型来说明。假设市场里只有两方:一个做市商和一个投机者。做市商可以选择「报高价」或「报低价」;投机者可以选择「买入」或「卖出」。收益矩阵如下:
| 投机者买入 | 投机者卖出 | |
|---|---|---|
| 做市商报高价 | (2, -1) | (-1, 2) |
| 做市商报低价 | (-1, 2) | (2, -1) |
这个游戏没有纯策略纳什均衡——因为无论做市商选什么,投机者都能找到对应的最优反应。但混合策略纳什均衡是存在的。
我来算给你看。假设做市商以概率 p 报高价,以概率 (1-p) 报低价。那么投机者买入的期望收益是:
E(买入) = p × (-1) + (1-p) × 2 = 2 - 3p
投机者卖出的期望收益是:
E(卖出) = p × 2 + (1-p) × (-1) = 3p - 1
令两者相等:2 - 3p = 3p - 1 → p = 0.5
所以做市商应该以50%的概率报高价,50%的概率报低价。投机者同理。
实战启示:
这个例子虽然简单,但揭示了核心逻辑:当市场参与者都采用混合策略时,任何确定性策略都会被对手利用。我建议你在设计策略时,至少留一个随机化参数——哪怕只是下单时间的随机化。
4.3 随机化交易信号生成:从理论到代码
好,理论讲完了,咱们上代码。我个人习惯用Python来实现随机化信号生成。核心思路是:在传统信号的基础上,叠加一个随机扰动,使得信号不再是确定性的。
import numpy as np
import pandas as pd
class RandomizedSignalGenerator:
"""
随机化交易信号生成器
核心思想:在确定性信号上叠加随机扰动,使得对手无法预测
"""
def __init__(self, base_strategy, randomization_level=0.3):
self.base_strategy = base_strategy # 基础策略函数
self.randomization_level = randomization_level # 随机化程度
def generate_signal(self, market_data):
# 先计算基础信号
base_signal = self.base_strategy(market_data)
# 生成随机扰动
# 使用拉普拉斯分布,比正态分布有更厚的尾部
noise = np.random.laplace(0, self.randomization_level, size=base_signal.shape)
# 混合信号
mixed_signal = base_signal + noise
# 阈值化处理
signal = np.where(mixed_signal > 0.5, 1,
np.where(mixed_signal < -0.5, -1, 0))
return signal
def update_randomization_level(self, new_level):
"""动态调整随机化程度"""
self.randomization_level = new_level
这段代码里,我用了拉普拉斯分布而不是正态分布。为什么?因为拉普拉斯分布的尾部更厚,产生的极端值更多——这在对抗性环境中反而更安全。我曾经在实盘里用过正态分布,结果对手很快摸清了噪声的边界,差点被反向狙击。
避坑指南:
我曾经犯过一个错误:把随机化参数设成了固定值。结果对手通过统计我的历史信号,反推出了随机化参数,然后针对性地做了对冲。后来我改成动态调整——根据市场波动率、对手行为等实时更新 randomization_level。记住:静态的随机化,本质上还是确定性的。
4.4 混合策略的实战框架
下面这张图是我自己总结的混合策略交易框架,你可以把它当作一个检查清单:
这个框架的核心在于反馈回路。你想想看,市场是动态的,对手也在学习。如果你的随机化参数一成不变,迟早会被识破。所以一定要有动态调整机制。
4.5 随机化参数的动态调整
怎么动态调整?我分享一个我实际用过的方案:
class AdaptiveRandomizer:
def __init__(self, initial_level=0.3, adaptation_rate=0.1):
self.level = initial_level
self.adaptation_rate = adaptation_rate
self.performance_history = []
def update(self, recent_performance):
"""
根据近期表现调整随机化程度
"""
self.performance_history.append(recent_performance)
if len(self.performance_history) > 20:
# 计算近期胜率
recent_win_rate = np.mean(self.performance_history[-20:])
# 如果胜率下降,增加随机化程度
if recent_win_rate < 0.5:
self.level = min(0.8, self.level + self.adaptation_rate)
else:
self.level = max(0.1, self.level - self.adaptation_rate * 0.5)
return self.level
这里有个细节:胜率下降时,我增加随机化程度的速度比胜率上升时快一倍。为什么?因为亏损的时候,说明对手可能已经摸到你的规律了,需要快速打乱。而盈利的时候,可以慢慢降低随机化,让策略更稳定。
关键参数建议:
- 初始随机化程度:0.2-0.4(取决于市场波动率)
- 调整速率:0.05-0.15(太快会不稳定,太慢来不及反应)
- 历史窗口:15-30个交易信号(太短噪声大,太长反应迟钝)
4.6 实战中的注意事项
嗯,最后说几个我踩过的坑:
- 不要过度随机化。 我曾经把随机化参数设到0.8,结果策略基本变成了随机游走,回撤大得吓人。记住:随机化是为了让对手猜不透,不是让自己变成无头苍蝇。
- 随机化要有边界。 比如你的信号范围是[-1, 1],那随机化后的信号不能超出这个范围。否则会出现极端仓位,风控过不了。
- 考虑交易成本。 随机化会增加交易频率,从而增加手续费。我建议在回测时把手续费算进去,看看随机化带来的收益提升能否覆盖成本。
- 监控对手行为。 如果发现对手的收益曲线突然变得平滑,说明他可能也在用混合策略。这时候你需要调整自己的随机化参数,进入更高层级的博弈。
一个小技巧:
我习惯在每天开盘前,根据前一天的交易结果重新计算随机化参数。这样既保证了实时性,又避免了盘中频繁调整带来的混乱。你可以试试看。
好了,这一章的内容就到这里。混合策略和随机化,说白了就是一句话:让你的对手永远猜不到你下一步要做什么。但记住,随机化不是目的,而是手段。最终的目标是提升策略的鲁棒性,让它在各种市场环境下都能稳定盈利。