Skip to content

27、订单执行中的博弈论:其他交易者的策略识别、避免被狙击、Python模拟博弈场景

做量化交易做久了,你会发现一个残酷的事实:市场里不只有你和你的策略,还有无数双眼睛在盯着你的订单。说白了,这就是一场博弈。你下的每一笔单,都可能被对手盘"狙击"。

我刚开始做程序化交易那会儿,总觉得策略回测漂亮就万事大吉。结果实盘一跑,滑点大得离谱,甚至有时候订单根本成交不了。后来我才明白——我的交易意图被"看穿"了。

这一章,我们就聊聊订单执行中的博弈论。我会结合我踩过的坑,讲讲怎么识别其他交易者的策略,怎么避免被狙击,最后用Python模拟一下这个博弈场景。

博弈论视角下的订单执行

传统金融理论假设市场参与者都是理性的,价格反映所有信息。但实际呢?市场里充满了信息不对称和策略互动。

你的买单推高了价格,你的卖单压低了价格。这就是你的"交易成本"。而其他交易者,尤其是那些高频做市商和算法交易者,他们就在利用这个规律赚钱。

我习惯把市场参与者分成几类:

  • 流动性提供者:做市商、高频交易者。他们赚的是买卖价差,喜欢在订单簿两边挂单。
  • 流动性消耗者:像我这样的趋势交易者、套利者。我们吃单,需要立即成交。
  • "狙击手":专门盯着大单,提前布局,等你进场后反向操作。

你想想看,如果你是一个做市商,看到订单簿上突然出现一个巨大的买单,你会怎么做?

正常人的反应是:把卖单价格调高。因为你知道马上会有人来买。这就是最基础的"狙击"。

如何识别其他交易者的策略

识别对手盘策略,说白了就是"读盘"。我总结了几个关键信号:

1. 订单簿形态分析

订单簿的形态能透露很多信息。比如:

  • 厚实的买单墙:可能是有大资金在吸筹,也可能是故意挂单诱多。
  • 稀疏的中间价区域:说明流动性差,你的订单很容易造成价格冲击。
  • 频繁撤单:这很可能是高频交易者在试探市场。

我记得有一次,我在监控一个流动性较差的股票。订单簿上买一和卖一之间差了5个tick。我正准备用市价单吃进去,突然发现卖一位置连续出现了几次"挂单-撤单"的动作。嗯,这明显是有人在试探。我果断放弃了这笔交易,果然,下一秒价格就往下砸了。

2. 成交速度与模式

观察成交的速度和模式也很重要:

  • 快速连续成交:可能是算法在拆单执行。
  • 大单一次性成交:可能是机构在调仓,也可能是"傻钱"。
  • 成交后价格迅速反转:说明有聪明钱在接盘后立刻反向操作。

3. 冰山订单的识别

很多大资金会用"冰山订单"来隐藏真实意图。订单簿上只显示一小部分,实际后面还有大量订单。

怎么识别?看成交后的订单簿恢复速度。如果你吃掉了一层买单,但很快又有新的买单补上来,那很可能就是冰山订单。

核心观点:识别对手盘策略,不是为了预测价格,而是为了优化你的执行成本。知道对手在想什么,你就能避开他们的陷阱。

避免被狙击的实战技巧

避免被狙击,说白了就是"别让别人知道你要干什么"。我总结了几个实用技巧:

1. 订单拆分与随机化

这是最基础的手段。把大单拆成小单,并且加入随机的时间间隔和数量。

举个例子:你想买10000股,别一次性下进去。拆成100笔,每笔100股,每笔之间随机等待0.5到2秒。这样对手就很难判断你的真实意图。

2. 使用隐藏订单

很多交易所支持"隐藏订单"或"冰山订单"。只显示部分数量,实际委托量更大。这能有效避免被狙击。

小技巧:我习惯把隐藏比例设在30%-50%。太高了容易被交易所的规则限制,太低了又起不到隐藏效果。

3. 逆向思维:利用对手的贪婪

有时候,你可以反过来利用狙击手的心理。比如,你故意在某个价位挂一个大单,吸引对手来狙击你。然后你在另一个方向悄悄建仓。

我曾经用这招对付过一只小盘股。我在买五位置挂了一个大单,看起来像是要吸筹。果然,价格开始往下砸,试图打掉我的止损。但我根本没设止损,反而在更低的位置继续买入。等他们发现砸不动的时候,我已经建好仓了。

4. 时间维度上的分散

别在同一个时间窗口内执行所有订单。把交易分散到不同的时间段,甚至不同的交易日。

我一般会这样做: - 开盘前15分钟:不交易,观察市场情绪 - 上午10:00-11:30:执行30%的订单 - 下午13:00-14:30:执行40%的订单 - 尾盘30分钟:执行剩余的30%

警告:不要以为拆单就万事大吉。如果市场流动性极差,拆单反而会暴露你的交易方向。这时候,你可能需要放弃交易,或者改用更隐蔽的算法。

Python模拟博弈场景

理论说再多,不如动手写代码。下面我用Python模拟一个简单的博弈场景:一个"狙击手"和一个"交易员"之间的博弈。

场景设定: - 交易员想买入1000股,当前价格100元 - 狙击手在观察订单簿,试图在交易员买入前推高价格 - 交易员可以选择:市价单、限价单、冰山订单 - 狙击手可以选择:狙击(推高价格)、不狙击(让交易员成交)

import random
import matplotlib.pyplot as plt

class OrderBook:
    def __init__(self, price=100, spread=0.1):
        self.bid = price - spread/2
        self.ask = price + spread/2
        self.mid_price = price

    def update(self, action, volume):
        """根据动作更新订单簿"""
        if action == 'market_buy':
            # 市价买入,推高价格
            impact = volume * 0.001  # 每1000股推高0.1元
            self.ask += impact
            self.bid += impact * 0.5
        elif action == 'limit_buy':
            # 限价买入,不推高价格
            pass
        elif action == 'iceberg_buy':
            # 冰山订单,部分隐藏
            pass
        elif action == 'snipe':
            # 狙击手推高价格
            self.ask += 0.5
            self.bid += 0.3

    def get_spread(self):
        return self.ask - self.bid

def simulate_game(trader_strategy, sniper_active=True, rounds=100):
    """
    模拟博弈过程
    trader_strategy: 'market', 'limit', 'iceberg'
    sniper_active: 狙击手是否活跃
    """
    book = OrderBook()
    total_cost = 0
    filled_volume = 0
    target_volume = 1000

    for i in range(rounds):
        if filled_volume >= target_volume:
            break

        # 交易员决策
        if trader_strategy == 'market':
            # 市价单:立即成交,但成本高
            volume = min(100, target_volume - filled_volume)
            book.update('market_buy', volume)
            cost = volume * book.ask
            filled_volume += volume

        elif trader_strategy == 'limit':
            # 限价单:可能不成交,但成本低
            if random.random() < 0.3:  # 30%概率成交
                volume = min(100, target_volume - filled_volume)
                cost = volume * book.bid
                filled_volume += volume
            else:
                cost = 0

        elif trader_strategy == 'iceberg':
            # 冰山订单:显示50股,实际下100股
            visible = 50
            actual = 100
            if random.random() < 0.7:  # 70%概率成交
                volume = min(actual, target_volume - filled_volume)
                book.update('market_buy', volume * 0.5)  # 隐藏部分减少冲击
                cost = volume * book.ask
                filled_volume += volume
            else:
                cost = 0

        # 狙击手决策
        if sniper_active and random.random() < 0.4:  # 40%概率狙击
            book.update('snipe', 0)
            # 狙击后,交易员成本增加
            if trader_strategy == 'market':
                # 市价单被狙击,成本更高
                cost *= 1.02  # 额外2%成本

        total_cost += cost

    avg_price = total_cost / filled_volume if filled_volume > 0 else 0
    return {
        'filled': filled_volume,
        'avg_price': avg_price,
        'total_cost': total_cost,
        'final_price': book.mid_price
    }

# 运行模拟
print("=== 博弈模拟结果 ===")
print()

strategies = ['market', 'limit', 'iceberg']
for strategy in strategies:
    print(f"交易员策略: {strategy}")

    # 无狙击手
    result_no_sniper = simulate_game(strategy, sniper_active=False)
    print(f"  无狙击手: 成交{result_no_sniper['filled']:.0f}股, 均价{result_no_sniper['avg_price']:.2f}元")

    # 有狙击手
    result_sniper = simulate_game(strategy, sniper_active=True)
    print(f"  有狙击手: 成交{result_sniper['filled']:.0f}股, 均价{result_sniper['avg_price']:.2f}元")
    print()

# 可视化结果
strategies_names = ['市价单', '限价单', '冰山订单']
costs_no_sniper = [simulate_game(s, False)['avg_price'] for s in strategies]
costs_sniper = [simulate_game(s, True)['avg_price'] for s in strategies]

plt.figure(figsize=(10, 6))
x = range(len(strategies_names))
width = 0.35

plt.bar([i - width/2 for i in x], costs_no_sniper, width, label='无狙击手', color='skyblue')
plt.bar([i + width/2 for i in x], costs_sniper, width, label='有狙击手', color='salmon')

plt.xlabel('交易策略')
plt.ylabel('平均成交价格 (元)')
plt.title('不同策略在博弈环境下的执行成本对比')
plt.xticks(x, strategies_names)
plt.legend()
plt.grid(True, alpha=0.3)

# 保存图表
plt.savefig('game_theory_simulation.png', dpi=100, bbox_inches='tight')
plt.show()

print("图表已保存为 game_theory_simulation.png")

运行这段代码,你会发现一个有意思的现象:

  • 市价单:成交最快,但被狙击的概率最高,成本也最高。
  • 限价单:成本最低,但可能成交不了。在博弈环境下,反而容易被对手利用。
  • 冰山订单:在成交率和成本之间取得了平衡,尤其是在有狙击手的情况下,优势更明显。

这个模拟虽然简单,但揭示了博弈的核心:你的策略选择,直接影响对手的反应。没有完美的策略,只有最适合当前市场环境的策略。

博弈论的核心启示

做订单执行优化,本质上就是在做博弈。我总结了几个核心启示:

  1. 信息就是武器:你的订单信息越少暴露,对手就越难狙击你。
  2. 随机化是护身符:固定的模式最容易被利用。加入随机性,让对手无法预测。
  3. 流动性是双刃剑:流动性好的市场,你的订单容易被消化;流动性差的市场,你的订单就是靶子。
  4. 没有免费的午餐:想快速成交,就要付出更高的成本;想降低成本,就要承担不成交的风险。

最后说一句:博弈论不是让你去猜对手在想什么,而是让你理解市场互动的本质。当你真正理解了这一点,你的订单执行算法就不再是简单的"拆单",而是一个能自适应市场环境的智能系统。

好了,这一章的内容就到这里。记住,市场里没有绝对的赢家,只有不断进化的策略。希望这些内容能帮你少踩一些坑。