订单类型与时效:实战派地图
每种订单类型都是同一个权衡上的一个点:确定成交还是确定价格。这篇把常见类型逐个过一遍——各自的数学、用法,和各自具体的咬人方式。
多数散户知道市价单和限价单。少数人知道止损单。剩下的几乎没人知道,而几乎每个人都会在某天因为不懂其中一种而吃亏。
入门篇讲过那个基本权衡:确定成交,或者确定价格,不能都要。这篇是深度版:把股票、期货、期权、加密现货里大概率会遇到的订单类型全过一遍,每一种给出它的合约语义、背后的数学、以及它具体的咬人方式——后面这条最重要,因为每种订单类型的失败模式都不一样,而失败模式恰好在你最脆弱的时候登场。
市价单
市价单的合约是一句话:“按当前可成交的最优价格立即买入或卖出。“你现在就要成交、差几美分不在意的时候用它。
它的成交价不是一个价,是订单扫过的各个价格档的成交量加权平均。你下一笔 1000 股的市价买单,簿上显示 300 @ 100.01、400 @ 100.02、300 @ 100.03,成交价是:
相对 touch(100.01)滑点 1 美分,约 1 bp。平静市场里这是可以接受的代价。
咬人的方式:这个”加权平均”在簿薄的时候没有下限。崩盘期间点差拉到 5–10%,你的市价卖单会在最糟糕的位置成交,而且越是恐慌的时刻,簿越薄。Harris 用大量篇幅讨论 flash crash 里止损市价单的行为(Harris,《Trading and Exchanges》,第 28 章)——那正是市价单最坏一面的放大版,下面讲止损单时回到这件事。
回测提示:arithmion.orders 里的 OrderType.MARKET 用当前 L2 快照模拟扫簿。回测时要设置合适的波动率情景——“平静市场”假设会给你过分理想的成交价。
限价单
限价单站在权衡的另一端:“以价格 或更低买入;以 或更高卖出。“你要价格控制、愿意等、挂单提供流动性的时候用它。
价格锁住了,代价转移到了成交概率上。给定水平期 ,期望成本是:
其中 是限价, 是 内成交的概率, 是没成交的代价——错过的 alpha、没做成的再平衡或对冲。选 就是在这两项之间搬运成本:挂得越远,单笔成交付得越少,但 越低、机会成本项越重。这个权衡可以真的算出来,文末有一节专门算。
咬人的方式:市场跳空穿过你的限价,你永远没成交,想多仓的时候还是平的。“挂完就忘”的限价单就是让人错失突破的罪魁祸首。而且别忘了上一篇的结论——限价单成交最顺利的时刻,往往是价格正穿过你、你在接刀的时刻。
止损单
止损单看起来是第三种东西,其实是”挂了引信的市价单”:“一旦市场价格成交到或穿过 ,就提交一笔市价单。“用途是风险管理:你有仓位,价格反向到某个幅度时你要出局。
它的数学要点全在”触发之后”:触发价 只是引信,实际退出价还要减掉触发后的滑点。在波动率 的情景下,给定止损已触发:
其中 是从检测到触发到订单到达的延迟, 是个粗略捕捉触发后滑点的常量:平静市场 –,flash crash 时可以到 5 以上。这个公式的存在本身就是警告——止损价不是”最多亏到这里”的承诺,只是一个开关:“从这个价格开始,市价离场”,而开关按下的时刻恰好是市价单表现最差的时刻。
2010 年 flash crash 把这一点写进了历史:止损单在崩盘前价格下方 30–60% 处触发,很多止损在底部附近成交。SEC 的事后报告(《Findings Regarding the Market Events of May 6, 2010》)认定,止损市价单因为同时冲击市场而显著恶化了崩盘。
回测提示:回测止损策略时必须显式建模跳空风险。Arithmion 的 StopOrderSimulator 内置一个由历史日内波动率参数化的跳空模型。
止损限价单
被 flash crash 吓到的人会想到一个”修复”:触发后别下市价单,下限价单。这就是止损限价单:“一旦市场成交到或穿过 ,就提交一笔限价 的限价单。“通常 比 低一个缓冲(比如 0.05 美元)。
它修好了一个问题,换来了另一个:价格可以一步跨过 和 两个位置。跨过去了,你的限价永远不成交,你就还留在仓位里。2010 年那天,很多把止损市价换成止损限价的人根本没出场,跟着反弹坐了一趟过山车——事后看运气不错,但那是运气,不是设计。你说这好不好,完全取决于你本意想不想出来。
所以实战派的经验法则是按”能不能承担这个仓位”来分:止损市价是无条件必须出,绝对不能扛的时候用它,接受滑点;止损限价是带耐心出场,还能扛的时候用它,接受出不去的可能。两个都想要的东西不存在。
移动止损
移动止损给止损价装上棘轮:“止损价始终保持在入场后最高(多头)或最低(空头)市场价 ± 的位置。“多头的触发价:
追踪金额 可以是固定价格(0.50 美元)、百分比(5%)或 ATR 单位(2× ATR)。趋势跟随者用它在行情朝自己走的时候锁利润。
代价是震荡市:一个小回调把你洗出来,行情立刻反转回去。 越紧锁得越多、被洗得越勤; 越松扛的回撤越大。没有免费的参数。
隐藏数量的工具:冰山与隐藏单
订单大到会暴露意图的时候,有两个工具。冰山订单:“在价格 显示 股; 成交完就显示下一组 “,总量 可以远大于 。完成整单的期望时间大约是单个 股切片成交时间的 倍——显示切片越小,暴露越少,但整体完成越慢,这又是一个滑动的权衡。
问题在于冰山没那么隐蔽。盯簿的交易员能看到你的显示切片被反复打掉又补上,从而推断出冰山,这叫”冰山识别”。Harris 第 4 章提了一嘴;学术文献的成果集中在 2005–2015 那段(参见 Eisler、Bouchaud 等)。
隐藏订单更彻底:“挂在簿上但显示数量为零”,能被进入的可成交订单打到,但 L2 行情上看不见。代价写在优先级里:大多数交易所把隐藏订单排在同价位所有显示订单之后。你可以在买价挂一笔隐藏单,同时仍然是队尾——隐身是用排队位置买来的。
做市工具:pegged 订单
Pegged 订单把”跟价”外包给交易所:“自动把我的订单价格维持在最优买价 + offset / 最优卖价 − offset / 中间价。“做市商想一直贴着 touch 时用它,peg to midpoint 则是流动性提供者想要中间价成交时的常规选择。
咬人的方式有两个:快行情里一群 peg 会互相踩踏(你 peg 别人,别人也在 peg 你);offset 设错时你可能无意中跨过点差、从挂单变成吃单。Arithmion 的 PeggedOrder 模拟 peg 延迟——在毫秒级别这个延迟有实际影响。
可成交限价单
执行算法里最常用的其实是这种混合体:“以 或更低买入”,且 当前最优卖价。到达时可成交,就表现得像市价单;扫到限价够不到的档位,剩余量变成挂单。它给你市价单的即时性,附送一个价格天花板,防止失控成交。
注意两个边界:限价正好设在 touch,它和市价单没有任何区别;设得比 touch 好一格,你换来一点价格改善的机会,同时也换来部分成交(有些市场)或完全不成交(另一些市场)的真实概率。
时效标志
上面所有类型都还有一个时间维度:单子活多久。当日有效(DAY)收盘自动撤销,散户默认。撤销前有效(GTC)一直挂到成交或撤销——多数券商限制在 60–90 天。GTC 的坑是”过期不失效”:单子以一个早已不相关的价格挂着,某天价格回到那个水平,它成交了,按一个你都不记得自己同意过的价格。定期巡检你的 GTC 单。到期日有效(GTD)像 GTC 但带明确到期日,机构系统里因合规要求更常见。
两个吃单侧的时效是执行算法的工具。立即成交否则撤销(IOC):能成交多少立即成交,剩下的撤销——用来吃单且不留残余敞口,防止部分成交后挂在簿上暴露意图。它的成交比例
落在 0 到 1 之间,期望值取决于你限价位置上的簿深度。全部成交否则撤销(FOK)更严格:要么全成、要么整单撤销,用在需要原子执行的场合——典型是套利,两条腿必须同时成交,否则留下不该有的敞口。FOK 在流动性差的品种上经常被拒(全额数量不存在),散户基本用不着它。
最后是竞价单:开盘价成交(OPG)/ 收盘价成交(MOC)只在官方开盘或收盘竞价上成交,指数基金和 ETF 收盘调仓用的就是它。MOC 的成交价是收盘竞价的撮合价——所有 MOC、LOC 和收盘可成交单的成交量加权清盘价格。收盘撮合价往往比连续交易最后一秒稳定,但在波动品种上仍可能跟最后一笔报价差一跳或更多。
何时用哪个:决策树
你在下单。顺着走一遍:
- 需要立即成交吗? 是 → 市价单,付点差。否 → 继续。
- 在给已有仓位做风控吗? 是,且必须出局 → 止损市价。是,但可以有耐心 → 止损限价。否 → 继续。
- 有价位目标吗? 有 → 限价单,按水平期选时效。没有 → 继续。
- 订单相对簿上显示量大不大? 大 → 冰山,或直接上执行算法(VWAP、TWAP、implementation shortfall)。不大 → 继续。
- 想隐藏吗? 想 → 隐藏单或冰山。不想 → 标准限价单。
- 需要原子执行吗? 是 → FOK。否 → IOC 或标准限价单。
大多数时候你最后用到的还是那四样:限价 DAY、限价 GTC、市价、止损市价。奇奇怪怪的类型是为特定问题准备的,问题没出现就别用。
把限价 vs 市价算出来
回到最常见的日常决策:什么时候该挂限价,什么时候该跨过点差?这个可以算。
设点差 (价格单位),当前中间价 。市价买单的期望成本是跨过半个点差:。限价单挂在 ,水平期 内成交概率 ;如果没成交而你仍然要这个仓位,之后只能在 附近以追价成本 跨过去。限价的期望成本是 。限价更划算,当且仅当:
左边是”成交时省下的钱”乘上成交概率——挂在买价()时省的就是一个整点差。右边是”没成交时多付的追价”乘上不成交概率。用人话说:点差越宽、成交概率越高,挂单越划算;行情要跑、追价越贵,市价越划算。
对比的 Python 代码:
def limit_vs_market(spread, mid_now, mid_future, fill_prob, chase_cost_bps=2):
"""
对比限价单与市价单的期望成本(买入方向)。
spread: 完整点差(价格单位)
fill_prob: 限价单在 mid_future 之前成交的概率
chase_cost_bps: 没成交后跨过去多付的成本(bps)
限价更划算返回 'limit',否则返回 'market'。
"""
market_cost = mid_now + spread / 2 # 现在跨点差
limit_fill = mid_now - spread / 2 # 挂在买价,成交省一个点差
chase = mid_future * chase_cost_bps / 1e4
limit_cost = fill_prob * limit_fill + (1 - fill_prob) * (mid_future + chase)
return "limit" if limit_cost < market_cost else "market"
# 簿紧、成交概率高 → 挂单划算
print(limit_vs_market(0.01, 100.00, 100.005, 0.9))
# 簿宽、成交概率低、追价贵 → 直接吃单
print(limit_vs_market(0.10, 100.00, 100.05, 0.3, chase_cost_bps=5))
第一个 print 出来是 “limit”:成交概率 90%,省下的点差压过偶尔的追价。第二个出来是 “market”:成交概率只有 30%,七成情况下你要在更差的位置追价,等待本身就很贵。
顺带提一句 Payment for Order Flow
你通过接受 PFOF 的零售券商发市价单时,单子被路由到一个付钱给券商的做市商那里。做市商吃点差,券商赚收入,你拿到的成交价通常比 NBBO 差零点几美分。这不违法,是美国股票市场的公开结构,但它意味着”免佣金”不等于”免成本”——成本可能藏在成交价里。Harris 在第 25–26 章讨论了市场结构和 PFOF。同一条线上的实证研究(Battalio、Corwin、Jennings,2016,关于券商路由激励与执行质量)发现:券商跟着交易所回扣选路由时,限价单的执行质量明显变差。激励扭曲是真实的、可测量的,规模一上来就是真钱。
如果你用 Arithmion 评估执行质量,第 11 篇讲的 implementation shortfall 模块可以把你的成交价跟到达时的 NBBO 对比,把这个成本量化出来。
订单类型的选择是执行里杠杆最高的决策之一——同一个交易意图,递单方式不同,成本能差出几倍。Harris 整整用一章讲订单类型(第 4 章),那章值得完整读一遍。
参考文献
- Harris, L. Trading and Exchanges: Market Microstructure for Practitioners. Oxford University Press, 2003. 第 4 章(订单类型),第 25–26 章(美国股票市场结构、PFOF)。ISBN: 978-0-19-514470-3.
- SEC. Findings Regarding the Market Events of May 6, 2010. 2010.
- Battalio, R., Corwin, S., Jennings, R. “Can Brokers Have It All? On the Relation between Make-Take Fees and Limit Order Execution Quality.” Journal of Finance, 2016.