跳到正文

寻流算法:何时用狙击手、游击队还是行军

寻流算法拿成交确定性换更好的价格。狙击手、游击队、激进 POV 各自把这笔交换推到不同位置——选算法,就是选你愿意承担多大方差。

第 9 篇 · 共 12 篇 约 10 分钟

大部分执行算法分两派。第一派是节奏算法:VWAP、TWAP、POV。它们有目标参与曲线,差不多就贴着走,不耍聪明,用时间换冲击。第二派是寻流算法:游击队、狙击手、寻流、冰山增强。它们主动到暗池和亮所的被动成交里找隐藏的流动性。

这两派的区别可以压缩成一句话:节奏算法卖给你成交的确定性,寻流算法卖给你更好价格的概率。这篇文章写第二派,而上面这句话是全文的主线——寻流算法的每个优点、每个缺点、每种失败模式,都是这笔”确定性换概率”交换的不同侧面。如果你奇怪为什么你的”寻流”算法留下 30% 没成交就走了,或者为什么它在两秒钟内在卖价全成交了,答案都在这笔交换的设计里,而那个设计优化的场景可能不是你的场景。

Harris(2003,第 22 章)区分主动和被动执行策略的方式至今好用:被动算法等市场来找它,主动算法去找市场。寻流在中间。它主动找,但通过挂被动单吸引成交,看到合适的目标再抢。这个分类不是关于激进与否,而是关于你在任一时刻是吃还是挂。

它们在解决什么问题

节奏算法解决时间对冲击的问题:有一小时买 100000 股,VWAP 算法按成交量铺你的成交,把冲击当作耐心的成本接受下来。寻流算法解决另一个问题——找到不在亮簿上的流动性。一只美股大盘股在 NYSE 最优买价上可能只显示 5000 股,但 broker 的智能路由知道有 200000 股躺在暗池里和 ECN 的冰山单上。节奏算法看不见那些,寻流算法看得见。

前提是隐藏流动性比显示流动性便宜,而这个前提基本成立:跟挂着的暗单成交不付点差,没人看着你拿的话也不付冲击。但便宜的东西有两个附加条款——隐藏流动性不是你要的时候都有,找它这件事本身会泄露信息。这两个条款分别对应寻流算法的两大类失败,后面会看到。

狙击手:最极端的一端

三种主要策略可以按”愿意为价格牺牲多少确定性”排个序。最极端的一端是狙击手。

狙击手算法在市场深处挂一笔被动单——远低于当前买价——然后就等。比如卖一在 $50.01 时把买单挂在 $49.90,等有人下来扫你的买价,成交了就重挂、再等。纯狙击手本质上是个限价单策略,外加些执行算法的胶水:它把”确定性换价格”这笔交换推到了头,价格潜在最好,成交最没保证。

所以它的适用面完全由这个定位决定。点差宽、中间价稳、你有几小时而不是几分钟、也不着急——这时深挂的买价迟早被打到,你把整个点差都省下来了。反过来,只要中间价在你等的时候漂走,你就在付时机成本;点差紧,你的深买价永远轮不上;股价跳空穿过你的价位,你干脆错过。大多数执行 desk 提供狙击手,但很少有交易员拿它当主策略——对多数机构单子,它太慢。

游击队:挂着等,看到目标就扑

游击队把狙击手的”挂着等”跟一个机会性的吃单引擎结合起来,把交换往确定性那边挪了一格。经典行为:在 touch 或稍内侧挂被动单,同时盯着暗池,一有合适的暗单就立刻”扑”上去跨过点差。

扑是关键。游击队算法维护一份暗池里看到的隐单的”想要清单”,一个目标又大又价好的时候,算法立刻把它抬起来,赶在被撤之前——这要求亚毫秒级的反应。所以游击队要的环境是:暗池流动性好(大盘股,ADTV > $1B),点差够宽让被动挂单有得赚,而且你能吃点逆向选择。点差太紧(< 1 美分)被动挂单赚不到,暗池空的(小盘股、新上市、停牌名字)扑循环无目标可扑,这两种情况下游击队就退化成一个昂贵的等待。

逆向选择值得单独说,因为它是游击队的隐藏成本。你在 $49.99 挂被动买单,有人扫你——合理的推断是他知道一些你不知道的。成交之后中间价漂到 $50.05,你确实”省了点差”,但你是在一个已经过时的价格上多进了货。便宜的流动性有时候便宜是有原因的。

激进 POV:中间地带

POV(量比参与)技术上是节奏算法,但它的激进变体——有时叫”激进 POV”或”寻流 POV”——是个混合体,把交换又往确定性挪了一格。算法设一个目标参与率(比如成交量的 10%)来推单,但不像标准 POV 均匀切子单,它在显示流动性大的时刻集中出手。

数学很简单:过去 5 分钟成交量 50000 股、你想 10% 参与,你就该发 5000 股。但不是每分钟发 1000 股连发五分钟,而是盯着簿上,一有大亮单出现就把 5000 股做一笔扫掉。它继承了节奏算法的完成时间大致可控,又继承了寻流的机会主义。代价是两头的尾部它都沾一点:成交量飙的时候参与率帽触发太快,成交量干的时候根本填不进,有硬截止时间的单子它不保证赶上。

激进 POV 变体就是大多数 desk 说的”寻流”。不知道用什么的时候,它是个合理的默认。

算法在黑箱里干嘛

大多数寻流算法维护三个内部循环。显示循环在亮场所挂并刷新被动单,决定什么价、什么量、什么场所,可能随机化单量以避免被识别。检测循环盯暗池的兴趣表达(IOI)、零售 wholesaler 流量、显示冰山的刷新,建一张”流动性地图”标出哪里可能藏着量。扑循环在检测循环标出目标时,在微秒内发一笔吃单——扑是被限速的,避免一口气穿过多个档位。

def pounce_check(target_size, target_venue, mid, spread, max_spread=0.10):
    """判断是否要跨过点差去拿隐藏流动性。"""
    if target_size < 1000:
        return False                # 量太小不值得
    if spread > max_spread:
        return False                # 点差太宽,市场不稳
    if target_venue in blocked_venues:
        return False                # 反作弊规则
    return True

这是玩具。真实实现还会查 NBBO、时段、最近波动率、已经干掉的 ADV 比例。

同一笔单,四种走法

假设你有 200000 股要买,美股大盘,ADV 800 万股,点差 $0.01,中间价 $50.00。

节奏算法(VWAP,60 分钟):可预测,按时完成,约 4–6 bp 冲击加 0.5 bp 点差,保守的基线。狙击手:在 $49.95 挂买价 90 分钟,中间价不动就被动成交、省了点差;中间价动到 $50.10,你就错过了、付了 10 bp 时机成本。游击队:在 49.99/49.99 / 50.00 挂单,盯暗池;一个 50000 股的大块出现在暗池 $49.99,扑上去,四分之一的单子在买价成交、零点差成本,然后继续干活——总成本可能 1–2 bp,也可能根本填不进、最后按 VWAP 收尾。激进 POV:设 12% 参与率,量出现就扫,30–45 分钟填完,3–5 bp。

四个期望值,四个方差。这正是学术文献框定过的权衡:Bertsimas 和 Lo(1998)把最优执行问题写成冲击成本对时机风险的取舍,最优路径是条权衡曲线而不是单一答案;Almgren 和 Chriss(2000)加上执行成本方差的二次惩罚,给出闭式最优轨迹——急就前端偏置,风险中性就线性,时间多就后端偏置。但注意这套理论假设的是固定的成交量节奏。寻流算法是另一种动物:它响应的是潜在流动性(暗池、隐藏单),没有闭式轨迹可言。学术作品基本没建模这个,实战派建了,他们的发现跟主线一致:在流动、暗池深的名字上,寻流比节奏算法冲击成本低,但方差更高——平均跑赢,尾部跑输。你的 PM 能接受方差,它们就是赢的;不能,就用 VWAP。

“最佳”选择于是取决于你在优化什么。PM 在乎跑赢 VWAP,激进 POV 最稳;PM 不惜一切要最小冲击,游击队配长水平期;不想漏掉一个快走的名字又愿意冒填不到的险,才轮到狙击手。

找流动性的人也在被找

前面说过,寻找本身会泄露信息。一个每天在同一个地方挂同样大小、同样价位的寻流算法,就是在给对手方发日程表。其他参与方识别出模式,在你前面反向成交。Harris(2003,第 21 章)在大单语境下讨论过这种”信息泄露”:你的算法通过反复在同一场所挂单漏了底,老练的对手方会识别模式、在你前面建仓、抽你的租。

所以现代算法做随机化:变化子单大小、挂单场所、刷新时机和价位。随机化有边界——太多会失去执行节奏的好处——但适度的随机化能压低被识别的概率。它的代价落在别处:随机化让 TCA 更难。子单大小在 100 到 500 股之间随机,你就没法把一天的执行跟另一天直接比。大部分 TCA 系统靠跨多笔订单平均来平滑,但在单笔层面,那就是噪音。

尺子也经常是错的

方差高还带来一个更隐蔽的问题:寻流算法经常被错误的基准评价。

把游击队算法跟 VWAP 基准比,游击队有时看起来很糟。原因不难找:VWAP 基准假设你跟量成交,游击队机会性成交——找到大块就快速成交,找不到就等。这两件事根本不匹配。专业做法是把寻流跟到达价或 implementation shortfall 基准比;如果一定要用 VWAP 基准,就得预期出现游击队看起来很差的时段,此时算法在做它被设计做的事,是尺子拿错了。

这也是为什么通用的”算法跑赢基准 X bp”报告基本没意义。正确的对比是算法特定的:VWAP 算法对 VWAP 基准,IS 算法对到达价,寻流对 IS 基准。否则你在拿苹果对螺丝刀。

四种经典的抱怨

寻流算法的失败模式在 desk 上都有固定台词,每一句背后都是同一件事:交换的条款没被理解。

“它没成交。“交易员在点差紧的股票上设了狙击手,中间价漂了,买价永远没被打,算法到期返回 30% 成交。算法在做它被设计做的事——点差紧、股票在趋势里,就不该用狙击手。

“它两秒就全成交了。“交易员在低量名字上设了游击队,算法在 touch 上挂着,一个大块进来,扑循环启动,整个父单在卖价全成。交易员为 200000 股跨了 1 美分点差——$2000 的成本,PM 没预算过。修法是加参与率帽。

“它付得比 VWAP 多。“交易员在成交量飙的日子用激进 POV,算法撞了参与率帽就停了,留下 40% 没填,股票跳了,收盘时未填部分涨了 1.5%,实现成本比老实跑节奏算法差得多。修法是设更高的参与率帽,或者用带硬截止时间的混合算法。

“暗池成交有毒。“交易员的游击队在暗池 X 找到了”好”流动性,大部分成交是亚美分的,点差省下了,然后股票反着走——那些流动性来自知情者。修法是按场所监控逆向选择:某个暗池的成交系统性地后面跟着不利价格变动,就把它拉黑。

什么时候干脆关掉它

有几种场景应该明确关掉寻流、退回节奏算法。财报日,成交量大到 VWAP 干得很好,寻流只添复杂度不添好处。指数再平衡日,流动性集中、价格明确,VWAP 就能处理。危机市,点差炸开、暗池退缩,寻流什么也找不到。还有信号已陈的日子——市场在消化你模型没捕捉的信息,寻流会按坏价格把你成交进去,节奏算法反而更扛得住。

一般规则:市场正常、单子大,用寻流;市场不正常或单子小,用节奏算法。落到操作上,一个对多数情况管用的决策序列是:

  1. 订单规模 > ADV 的 5% 吗? 是 → 寻流算法配低参与率(1–3%)。否 → 节奏算法,冲击本来就小。
  2. 点差 > 5 美分吗? 是 → 游击队合理,被动挂单有得赚。否 → 狙击手太险。
  3. 有硬截止时间吗? 是 → 激进 POV 带上升参与率。否 → 游击队配长水平期。
  4. PM 风险厌恶吗? 是 → VWAP 稍带 POV 倾斜。否 → 游击队或狙击手。

大多数 shop 默认就在 VWAP、POV、寻流三个里挑。单子相对 ADV 大、PM 能接受方差时,才轮到第三个。

顺带一提篮子的情况:交易一篮子相关名字时,寻流更复杂——你不能给每条腿独立跑狙击手,腿在不同时刻成交,篮子就失衡了。篮子感知算法监控所有腿的成交进度、逐腿调激进度保持整体节奏;Harris(2003,第 24 章)讨论过这个”组合执行”问题,对高相关篮子,协调执行相对逐腿执行能明显降低整体成本。这另有一篇:多资产执行。

诚实的结尾

寻流算法不是魔法。它们赌的是隐藏流动性以合理价格存在、而且你能在别人之前找到它。有时赌赢,有时没有,方差是真的。如果你 desk 的文化是稳定跑赢 VWAP 2–3 bp,参数调对的寻流能带你到那儿;如果文化是绝不漏基准、绝不承担方差,就贴着节奏算法,把冲击成本当已知数付掉。干得好的人把寻流当默认但参数保守:参与率帽、最大冲击预算、跌回节奏算法的硬截止——用算法的智能,但不让它做 PM 不会做的决策。

还有一件不出现在任何模型里的事:交易员直觉。有经验的执行交易员看着簿、看着新闻、看着最近成交,能判断”这只股马上要跳”或”这里有个隐藏卖方”或”我现在就该跨过去”。没有算法抓得住这个。最好的寻流算法增强交易员的直觉,不替代它——把寻流当黑箱然后走开的交易员,放弃了当人的优势;把它当工具的(设参数、看成交、不对劲就介入)拿到最好的结果。赢在执行上的买方 desk,是聪明算法加有经验交易员的那种,单独一边都不够。

参考文献

  • Harris, L. (2003). Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press. 第 21–22、24 章。ISBN: 978-0-19-514470-3.
  • Almgren, R., & Chriss, N. (2000). “Optimal Execution of Portfolio Transactions.” Journal of Risk, 3(2), 5-39.
  • Bertsimas, D., & Lo, A. W. (1998). “Optimal Control of Execution Costs.” Journal of Financial Markets, 1(1), 1-50.