第四章 暗池交易策略基础
各位同学,今天我们来聊聊暗池交易策略的四个基本功。说实话,这四种策略就像交易员的四把刀——不一定每把都用,但得知道什么时候该拔哪一把。
我在搭建暗池交易系统的头两年,踩了不少坑。最惨的一次,VWAP策略的参数设错了,直接把一个机构客户的订单拆成了碎渣,成交率不到30%。嗯,从那以后我对这些基础策略就格外上心了。
4.1 VWAP策略:成交量加权平均价格
VWAP,全称Volume-Weighted Average Price。说白了,就是让你的成交价尽量贴近市场当天的平均价。
核心逻辑:把大单拆成小单,按市场成交量的分布比例去下单。市场成交量大的时段,你就多下点;成交量小的时段,你就少下点。
VWAP计算公式:
VWAP = Σ(价格 × 成交量) / Σ(成交量)
目标:让实际成交价尽量接近这个值
我个人习惯把一天分成390个一分钟切片(美股交易时间6.5小时)。每个切片分配一个权重,权重就是历史数据中该分钟成交量占全天成交量的比例。
// 伪代码:VWAP切片分配逻辑
def vwap_slice_allocation(total_qty, volume_profile):
slices = []
for minute in range(390):
weight = volume_profile[minute] / sum(volume_profile)
slice_qty = int(total_qty * weight)
slices.append({
'time': minute,
'qty': slice_qty,
'weight': weight
})
return slices
实战要点:
- 历史成交量分布会变,建议用最近20个交易日的加权平均
- 遇到财报、分红等事件日,要调整权重
- 我建议把VWAP作为基准,而不是死命令——市场条件变了要灵活调整
避坑指南:我曾经在2018年用纯历史VWAP跑一个科技股的大单,结果那天该股因为突发利好成交量暴增3倍。历史权重完全失效,我的订单被拆得太散,错过了最佳成交窗口。后来我加了一个实时成交量修正因子,才解决了这个问题。
4.2 TWAP策略:时间加权平均价格
TWAP比VWAP简单粗暴——不管市场成交量多少,我就按时间均匀拆单。
适用场景:
- 流动性较差的股票(VWAP的成交量分布参考价值不大)
- 你不知道市场什么时候流动性好(比如刚上市的新股)
- 需要隐藏交易意图,均匀分布不容易被盯上
// 伪代码:TWAP均匀拆单
def twap_slice_allocation(total_qty, total_minutes):
base_qty = total_qty // total_minutes
remainder = total_qty % total_minutes
slices = []
for minute in range(total_minutes):
qty = base_qty + (1 if minute < remainder else 0)
slices.append({'time': minute, 'qty': qty})
return slices
你想想看,TWAP最大的问题是什么?对了,它完全无视市场深度。如果某个时间点买单特别少,你硬塞进去,就会造成价格冲击。
注意:TWAP在低流动性时段容易「砸盘」。我建议至少加一个最小成交量保护——如果当前盘口的买单深度不够,就跳过这个切片,等下一个周期再补。
4.3 实施缺口策略
这个策略的名字听起来有点玄乎,其实核心就一句话:利用市场微观结构中的价格缺口来成交。
什么是实施缺口?就是订单簿上买一价和卖一价之间的那个空档。比如买一10.00,卖一10.02,这0.02就是实施缺口。
策略逻辑:
- 监控订单簿的实时状态
- 当实施缺口变宽时(比如从0.02变成0.05),说明市场深度变差
- 此时主动吃单的成本变高,应该等待或改用被动挂单
- 当实施缺口收窄时,说明流动性改善,可以主动出击
核心指标:实施缺口宽度 = 卖一价 - 买一价
正常情况:0.01-0.03(美股)
异常情况:>0.05(需要警惕)
我在项目中遇到过一只小盘股,平时实施缺口只有0.01,但有一次突然跳到0.08。我立刻暂停了主动下单,改挂被动单。结果5分钟后,股价暴跌了3%,我的被动单反而在反弹时成交了。嗯,这就是实施缺口策略的价值——它帮你感知市场的「呼吸」。
4.4 流动性捕捉策略
这个策略是我个人最喜欢的。它的思路是:不主动制造成交,而是等市场出现流动性的时候「搭便车」。
怎么捕捉?
- 监控大单成交:当看到一笔大单吃掉买一或卖一,说明有大资金进场
- 监控订单簿变化:如果某个价位突然出现大量挂单,说明有人在布局
- 监控成交速度:单位时间内的成交笔数突然增加,说明流动性爆发
// 伪代码:流动性捕捉触发器
def liquidity_detector(order_book, trade_feed):
# 检测大单成交
if trade_feed.last_trade.qty > threshold:
return '大单触发'
# 检测订单簿突变
bid_depth_change = order_book.bid_depth - order_book.prev_bid_depth
if abs(bid_depth_change) > depth_threshold:
return '深度突变触发'
# 检测成交速度
trade_speed = count_trades_in_last_second(trade_feed)
if trade_speed > speed_threshold:
return '速度触发'
return None
实战技巧:
- 流动性捕捉策略最适合用在暗池里——因为暗池的订单簿不公开,你只能通过成交反馈来感知流动性
- 我建议设置多个触发条件,避免被单一信号误导
- 捕捉到流动性后,不要贪心,快速成交后立即撤单
避坑指南:我曾经过于依赖流动性捕捉策略,结果遇到了一次「假流动性」——某个做市商故意挂大单又撤单,诱骗我进场。后来我加了一个「挂单存活时间」的过滤器,挂单存活超过500毫秒才算有效信号。
四种策略对比
| 策略 | 核心逻辑 | 适用场景 | 主要风险 |
|---|---|---|---|
| VWAP | 按成交量分布拆单 | 高流动性、有历史数据 | 成交量分布突变 |
| TWAP | 按时间均匀拆单 | 低流动性、无历史数据 | 价格冲击 |
| 实施缺口 | 利用价差变化 | 订单簿深度变化大 | 价差突然扩大 |
| 流动性捕捉 | 搭便车式成交 | 暗池、低流动性市场 | 假信号、假流动性 |
这四种策略不是孤立的。我实际做系统的时候,经常把它们组合使用。比如:用VWAP做基础框架,遇到实施缺口变宽就切换到TWAP模式,检测到流动性爆发就启动捕捉策略。
说白了,策略是死的,市场是活的。你手里有四把刀,关键是要知道什么时候用哪一把。
好了,这四种策略的基础就讲到这里。记住,纸上谈兵终觉浅——你回去之后,最好拿历史数据回测一下,看看每种策略在不同市场环境下的表现。我当年就是靠反复回测,才慢慢摸清了它们的脾气。