第十八章:暗池与场外做市

暗池交易,说白了就是你看不见的流动性。很多做市商朋友一听到暗池就头疼,觉得那是黑箱操作。我个人倒觉得,暗池恰恰是微观结构里最有趣的部分——它把信息不对称玩到了极致。

先说说暗池到底是个什么东西。传统交易所的订单簿是公开的,谁挂了什么价、多少量,一目了然。暗池不一样,它不公开订单信息。你只能看到成交后的结果,看不到挂单的过程。嗯,这就像打牌时你不知道对手的底牌。

暗池的三种类型

我习惯把暗池分成三类,每一类的玩法完全不同。

1. 指示性暗池

这种暗池会给你一些「暗示」。比如告诉你「这里有大单在买」,但不告诉你具体是谁、什么价格。说白了就是给你个方向,让你自己去猜。

我在项目中遇到过一家欧洲的暗池,它会在盘前给你一个「流动性指示器」,告诉你今天哪个板块可能有大量交易。很多机构就靠这个信号来调整自己的挂单策略。

2. 隐藏订单

这是最常用的暗池类型。你挂一个100万股的买单,但订单簿上只显示1万股。剩下的99万股藏在下面,只有匹配到对手单时才露出来。

我曾经犯过一个错误:在隐藏订单里挂了很大的量,结果被一个高频交易者通过「逐笔试探」给探测出来了。他每次只吃1手,连续吃了几百次,硬是把我的隐藏量给摸清了。从那以后,我再也不在隐藏订单里挂太整齐的量了。

3. 冰山下订单

冰山下和隐藏订单有点像,但有个关键区别:冰山下的「可见部分」会不断刷新。比如你挂100万股,每次只显示1万股。这1万股成交后,系统自动再露出1万股。直到100万股全部成交。

你想想看,这就像冰山一样,水面上的只是尖尖一角。做市商最喜欢用冰山下订单来「钓鱼」——用少量可见订单吸引对手,然后用大量隐藏订单吃掉对手的流动性。

三种暗池对比

类型信息透明度典型用途风险点
指示性低(只给方向)信号交易信号可能误导
隐藏中(部分可见)大单执行容易被探测
冰山下中(动态刷新)流动性钓鱼对手盘不足时暴露

暗池做市策略

做市商在暗池里怎么玩?我总结了三套核心策略。

策略一:被动做市

说白了就是挂单等成交。在暗池里挂双边报价,赚买卖价差。但暗池的流动性不如公开市场,所以价差通常更大。我一般会在暗池里挂比公开市场宽0.5-1个tick的价差,这样既能吃到价差,又不会太容易被吃掉。

策略二:主动探测

这个有点「坏」,但确实有效。通过小单试探暗池里的隐藏流动性。比如我挂1手买单,如果瞬间成交了,说明暗池里有人在卖。我再挂1手,又成交了。连续几次后,我基本能判断出暗池里大概有多少隐藏卖单。

避坑指南:我曾经用这个策略探测一个暗池,结果被对方的算法反探测了。对方发现我在试探,直接撤单然后反向挂单,把我给套住了。所以现在我做探测时,会随机化下单时间和数量,不让对方摸清规律。

策略三:跨暗池套利

不同暗池之间的价格可能有差异。比如A暗池的买价是10.01,B暗池的卖价是10.00。理论上你可以从B暗池买入,到A暗池卖出,赚这1分钱的差价。

但实际操作中,这个套利很难做。因为暗池的成交速度慢,你从B暗池买入后,A暗池的价格可能已经变了。我建议只做那些流动性好、成交快的暗池之间的套利,比如大型投行的内部暗池。

跨市场套利

暗池和公开市场之间也存在套利机会。这个我做得比较多,给大家分享几个实战经验。

暗池-公开市场价差套利

当暗池里的价格明显偏离公开市场时,就有套利空间。比如某股票在纽交所的买价是50.00,卖价是50.02。但在一个暗池里,有人挂50.01的买单。这时候你可以从纽交所的50.02卖单买入,然后到暗池以50.01卖出。虽然只亏1分钱,但如果你能同时做空纽交所的卖单,就能锁定利润。

信息优势套利

这个比较敏感,但确实存在。有些暗池会提前显示大单的成交意向。如果你能比公开市场早几毫秒知道这些信息,就可以在公开市场提前布局。

我记得有一次,一个暗池的算法提前暴露了一个养老基金的大额买入意向。我比公开市场早了约50毫秒知道这个消息,立刻在纽交所买入相关股票。等养老基金的大单真正执行时,股价已经涨了0.3%。嗯,这种套利现在越来越难做了,监管盯得很紧。

重要提醒

跨市场套利涉及多个市场的监管规则。美国SEC对暗池交易有严格的信息披露要求。我曾经因为跨暗池套利被SEC问询过,虽然最后没事,但过程很折腾。建议在做任何跨市场套利前,先咨询合规部门。

实战代码:暗池流动性探测

下面是我写的一个简单的暗池流动性探测算法。它通过小单试探来估计暗池里的隐藏流动性。

import random
import time

class DarkPoolLiquidityProbe:
    def __init__(self, dark_pool, probe_size=100, max_probes=50):
        self.dark_pool = dark_pool
        self.probe_size = probe_size
        self.max_probes = max_probes
        self.probe_results = []
        
    def probe_liquidity(self, side='buy'):
        """
        探测暗池流动性
        side: 'buy' 或 'sell'
        """
        for i in range(self.max_probes):
            # 随机化下单时间,避免被反探测
            delay = random.uniform(0.01, 0.5)
            time.sleep(delay)
            
            # 随机化下单数量
            size = self.probe_size * random.randint(1, 5)
            
            # 发送试探订单
            order = self.dark_pool.send_order(
                side=side,
                size=size,
                order_type='IOC'  # Immediate-or-Cancel
            )
            
            # 记录成交情况
            filled = order.get_filled_quantity()
            self.probe_results.append(filled)
            
            # 如果连续3次没有成交,停止探测
            if len(self.probe_results) >= 3:
                if all(r == 0 for r in self.probe_results[-3:]):
                    print("流动性耗尽,停止探测")
                    break
        
        # 估算隐藏流动性
        total_filled = sum(self.probe_results)
        estimated_liquidity = total_filled * 2  # 保守估计
        return estimated_liquidity

# 使用示例
probe = DarkPoolLiquidityProbe(dark_pool=my_dark_pool)
est_liquidity = probe.probe_liquidity(side='sell')
print(f"估计暗池卖单流动性: {est_liquidity}股")

个人经验

这个算法在实际使用中,我建议把probe_size设成你最小交易单位的1/10。比如你最小交易是1000股,那probe_size就设100股。这样既能探测到流动性,又不会引起太多注意。另外,记得在探测完成后,等几秒钟再开始正式交易,让暗池的算法「冷静」一下。

暗池做市的未来

说实话,暗池做市正在变得越来越难。监管越来越严,算法越来越聪明,竞争也越来越激烈。但我个人觉得,暗池仍然是做市商不可或缺的工具。尤其是在处理大单时,暗池能帮你减少市场冲击成本。

最后说一句:暗池不是万能药。它只是你工具箱里的一把特殊工具。用得好,能帮你赚到超额收益;用得不好,可能让你亏得莫名其妙。嗯,多实践、多总结,慢慢就能找到感觉了。


交易系统化学习资料 微信Strategy888888