第十八章:暗池与场外做市
暗池交易,说白了就是你看不见的流动性。很多做市商朋友一听到暗池就头疼,觉得那是黑箱操作。我个人倒觉得,暗池恰恰是微观结构里最有趣的部分——它把信息不对称玩到了极致。
先说说暗池到底是个什么东西。传统交易所的订单簿是公开的,谁挂了什么价、多少量,一目了然。暗池不一样,它不公开订单信息。你只能看到成交后的结果,看不到挂单的过程。嗯,这就像打牌时你不知道对手的底牌。
暗池的三种类型
我习惯把暗池分成三类,每一类的玩法完全不同。
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