第 04a 章 订单基础:市价单与限价单
对应 Harris《Trading and Exchanges》第 4 章“Orders and Order Properties”的前半部分(4.1–4.4 节)。第 4 章是 Part I 的核心:作者在这里提出“挂出的限价单是免费送给市场的交易期权”这一观察,并由此解释流动性从哪里来、价差为什么会随波动率变宽、为什么快的交易者占优。本册把第 4 章拆成两部分:本章讲订单的基本术语、市价单和限价单;第 04b 章讲止损单、触价单、跳动敏感订单以及有效期、数量、显示等其他指令。
学习目标
读完本章,你应当能够:
- 准确使用买价、卖价、最优买卖价(BBO)、买卖价差、挂单、提供/获取流动性、即时性等术语。
- 用两种论证说明“小额市价单的成本是半个价差”,并能把市价单的总成本分解为半价差、市场冲击和执行价格不确定性。
- 按限价相对于当前报价的位置给限价单分类(可立即成交、做出新市场、在市、在市场后面)。
- 解释为什么挂单限价单是交易期权(限价卖单是看涨、限价买单是看跌),说出决定其期权价值的三个因素,并推出“波动大时价差变宽”。
- 理解限价单的两大风险——执行不确定性与事后后悔(逆向选择),能用模拟估计限价单的成交概率和成交后的不利漂移,并知道限价单回测中最常见的偏差。
读前导读
这一章在解决什么问题。 市价单和限价单你在 CFA 一级就学过:市价单保证成交、不保证价格,限价单保证价格、不保证成交。这一章要回答的是更深一层的问题:这两种订单各自的“价格”是多少?谁在为谁付费? 答案是:市价单的价格是半个价差加市场冲击;限价单的价格是一份免费送给市场的期权。限价买单就是你卖出的看跌期权,行权价是限价,对手方只在“卖给你划算”时行权。一旦接受这个视角,CFA 期权章节的结论就能直接搬过来:波动率越高、挂单时间越长,这份期权越值钱,所以挂单者要求更好的价格,价差随之变宽。
全书后面讲交易商、买卖价差、订单预期者、执行算法,都建立在“限价单 = 期权”这一观察上,所以 4.4.2 节是本章乃至 Part I 的核心。
需要先想起来的数学。
- 期权到期收益:看跌 \(\max(K-S,0)\),看涨 \(\max(S-K,0)\)。本章把 \(K\) 换成限价 \(L\),把 \(S\) 换成真实价值 \(V\)。例如限价买单 \(L=10\),真实价值跌到 \(9.7\),对手卖给你赚 \(0.3\);价值涨到 \(10.5\),对手不会卖给你,收益为 0。
- 期望与条件期望:“成交后盯市盈亏”是在“成交”这一条件下求平均,即 \(E[\text{盈亏}\mid\text{成交}]\)。逆向选择的数学含义就是这个条件期望为负。详见 第 00 册第 07 章 概率中的分析工具。
- 随机游走与鞅:每步等概率上下跳 1 tick 的价格序列叫对称随机游走;“明天的期望等于今天”的过程叫鞅(martingale),它是“价格不可预测”的数学表达。小例子:今天 100,明天以各 1/2 概率变成 101 或 99,期望仍是 100。实战二的理论推导要用到“鞅在随机时刻停下来,期望仍等于起点”这一性质(可选停止定理),本册在讲解框里给出直观解释,严格内容见第 02 册。
- 蒙特卡洛模拟:用大量随机路径的平均值近似期望。10 万条路径时,均值的标准误约为 \(\sigma/\sqrt{100{,}000}\approx\sigma/316\),所以模拟值与理论值相差一两个百分点是正常的。
怎么读这一章。 4.1、4.2 是术语,快速读过,但要记住“提供/获取流动性”和“即时性”的含义。4.3 精读 4.3.1(两种论证半价差)和 4.3.3(市场冲击)。4.4.1 的表 4-1 要能熟练使用。4.4.2–4.4.4 是核心,务必精读。量化实战的实战一是一个可运行的订单簿,后续章节会复用;实战二的数学推导第一次读可以只看结论“没有逆向选择时,先挂单再追价的平均成本 \(=1-P(\text{成交})\),总低于市价单”,再重点看有信息事件时这一结论如何被推翻。
4.1 订单是什么,为什么用订单
订单(orders)是交易指令,说明交易什么、买还是卖、多少、何时以及如何交易,最重要的是以什么条件交易。订单总是指定工具、数量和方向;可能包含成交条件,最常见的是价格限制,还有有效期、何时可执行、是否允许部分成交、送往何处、如何寻找对手,甚至愿意与谁交易。
作者开宗明义:下单策略(order submission strategy)是交易成败最重要的决定因素。合适的订单用在合适的时机,决定了一笔交易是好交易、昂贵的交易,还是根本没有交易。理解订单还能看清流动性从哪里来:有的订单向他人提供交易机会,从而提供流动性;有的订单抓住这些机会,从而获取流动性。
为什么需要订单?因为多数交易者不亲自安排交易。亲自交易的人(通常是交易商)不用订单,他们当场决策。对许多小交易者来说,持续盯盘不经济,订单在他们不关注市场时代表他们的利益。
亲自交易者有一个关键优势:能随市场变化即时反应。用订单的人必须预见变化并把应对条件写进订单;订单不再合适时必须撤单重下,期间可能旧单先成交,或者新单来不及利用新情况。一般而言,对市场变化反应最快的交易者比慢者占优;在速度至关重要的地方,场内交易者和计算机化交易者最成功。这句话写于 2002 年,今天的高频交易正是它的极端形态。
快速市场中误解代价极大,所以大家使用所有人都懂的标准订单。原书举例:Harry 想卖 7,600 股 Exxon Mobil,每股不低于 41.05,只在本交易时段、且只在能一次全部成交时才卖——他应该下一张全部或不成交的当日限价卖单:卖 7,600 股 XOM,限价 41.05,all-or-nothing,day。
本章假设订单提交到连续交易市场(continuous trading market),即订单一到达就尝试撮合。同样的订单在集合竞价市场(call markets)中性质略有不同,见第 05、06 章。
4.2 基本术语
买价与卖价。交易者用出价(bids)表示愿意买,用要价(offers)表示愿意卖;自己安排交易时直接报价(quote)。对应的价格叫 bid price 和 offer price(也叫 asking price,简称 bid、ask),对应的数量叫规模(sizes)。
确定价与软价。可以要求对方按该价成交的报价是确定价(firm);报价者在成交前可以修改的是软价(soft)。订单一般是确定价。
最优买卖价。市场上最高的买价是最优买价(best bid),最低的卖价是最优卖价(best offer / best ask),合称 BBO(best bid and offer);美国全国范围内的最优价称 NBBO。
买卖价差。最优卖价减最优买价,称买卖价差(bid/ask spread),也叫内部价差(inside spread);英国人称 the touch。
提供流动性。原书例子:Joe 下单,今天收盘前以不高于 100 美元向第一个联系他的人买 100 股 IBM。他的买单提供了流动性——别人现在可以随时以 100 美元卖给他。“offer”一词的双重含义(出售某物的报价、提供某物)在这里很有启发性:如果把流动性看作可以买卖的服务,交易商就是靠向客户出售流动性赚钱。
挂单(standing orders)是公开的交易要约,也称未结订单(open orders)。有挂单就是在提供流动性。
获取流动性。想快速交易的人需求流动性;接受他人已挂出的要约就是获取流动性(Sue 愿意以 100 卖,就可以吃掉 Joe 的单)。要求立即交易的人需求即时性(immediacy),即时性是流动性的一个维度。
流动的市场:交易不会对价格产生显著不利影响的市场。挂单多、价差小的市场通常很流动。
代理订单与自营订单。经纪商代客户下的是代理订单(agency orders),为自己账户下的是自营订单(proprietary orders)。许多有组织的市场中,同价时代理订单优先于自营订单。
订单状态。已提交给经纪商、尚未被接受的订单处于待定(pending)状态(例如待确认可借券);已接受、尚未成交或撤销的订单处于工作中(working)状态。
4.3 市价单
市价单(market order)是以当前最优可得价格立即交易的指令。它通常成交快,但价格有时较差。不耐心或必须成交的交易者用市价单需求流动性。小额市价买单通常在最优卖价成交,卖单在最优买价成交。原书例子:AstroPower 的报价为 36.80 买(500 股)/ 36.85 卖(400 股),Bill 市价买 200 股,全部以 36.85 成交。
4.3.1 市价单支付价差
为什么说市价单的成本是半个价差?作者给了两种论证。
论证一:往返交易。Amy 先用市价单买入、再用市价单卖出一只债券。最优买价 100、卖价 102。她买入付 102,卖出得 100(假设报价不变),两笔共亏一个价差 2。她为两次即时交易付了一个价差,所以每笔交易的成本是半个价差。
论证二:相对价值。如果 Amy 不知情,关于债券价值我们只知道有人愿以 100 买、有人愿以 102 卖;没有其他信息时,最好的价值估计是两者的平均 101,即中间价(midpoint)。她以 102 买入价值 101 的债券,多付的 1 就是为即时性付的钱;卖出时以 100 卖出价值 101 的债券,又付了 1。
半价差就是用市价单获得即时性的价格。在交易成本分析中,常用“有效半价差”\(|P_{\text{成交}}-M|\) 度量单笔交易的这部分成本。
白话解释:两种论证在说同一件事,只是记账方式不同。论证一是“往返记账”:买进卖出一圈,亏一个价差,平摊到两笔。论证二是“逐笔按公允价值记账”:每笔都和中间价比较,差额就是成本。论证二更常用,因为大多数交易并不会马上反向平仓。中间价被当作公允价值的估计,前提是交易者不知情;如果你知道价值其实是 103,以 102 买入反而是赚的。这就是为什么后面的成本度量要区分“报价价差”(屏幕上的 ask − bid)、“有效价差”(成交价相对中间价,可以因价格改善而更小)和“实现价差”(相对几分钟后的中间价,用来扣掉逆向选择部分)。
4.3.2 价格改善
在价格可以协商的市场中,市价单有时能以优于当前报价的价格成交,这叫价格改善(price improvement):有交易者愿意站到当前最优价前面,给到来的市价单更好的价格。这常发生在价差宽而市价单小的时候。
原书例子:AnnTaylor 在 NYSE 报 23.35 买(500 股)/ 23.45 卖(1,000 股)。Tom 市价卖 300 股,专家以 23.38 买入,比最优买价好 3 美分。专家当然更想以 23.35 买,但交易所规则禁止他以公众愿意买入的同一价格买入(公众订单优先),所以他必须改善价格才能参与。
4.3.3 市场冲击
大额市价单难执行得多:愿意承接大额交易的对手不好找——他们可能对这个工具没兴趣,或者害怕与可能掌握价值信息的人交易。为了吸引对手,大额不耐心交易者必须移动价格:买家抬高出价,卖家压低要价。所付的溢价和所给的折价称价格让步(price concessions),为成交而移动价格的效应称市场冲击(market impact,又称价格冲击 price impact)。
冲击随订单规模增大,通常是大单最重要的交易成本;大额市价单为流动性付出的往往远超半个价差。冲击大小取决于市场的可得流动性:小市场中小单也可能冲击显著,大市场中数百万美元的订单也可能冲击不大。
原书例子:Martha 要买 400 张三月浓缩橙汁期货,当时报价 84.20 买 / 84.25 卖(美分/磅),前一日所有月份共成交 6,505 张。她把订单分成两张 200 张的市价单。第一位经纪人立即以 84.25 买 20 张、84.40 买 30 张、84.70 买 150 张;当天晚些时候市场为 84.55 / 84.60,第二位经纪人以 84.60 买 5 张、84.80 买 75 张、85.00 买 45 张、85.15 买 75 张。为完成交易,价格被推高了 0.90 美分(84.25 → 85.15)。量化实战部分会计算各批次的均价。
金融直觉:市场冲击可以分成两部分理解。临时冲击是你吃掉了订单簿上几档挂单,等新的挂单补进来价格会部分回落,好比大宗商品临时缺货时的溢价。永久冲击是市场从你的大单中“读出”了信息,修正了对价值的估计,价格不再回去。Martha 第二批开始时市场已从 84.20/84.25 变成 84.55/84.60,说明第一批的冲击大部分没有消退。实务中常用的经验式是冲击与“订单量 / 日均成交量”的平方根成正比,这里的 400 张接近前一日全部月份成交量的 6%,冲击 0.9 美分对一个价差只有 0.05 的市场来说是 18 个价差,相当可观。
4.3.4 执行价格不确定性
市价单的成交价取决于执行那一刻的市况,而市况可能迅速变化,所以有以比预期更差的价格成交的风险,来源有两个:下单到执行之间报价的变化,以及大单所需的不可预测的价格让步。担心这种风险的交易者可以改用限价单。
于是市价单的成本可以写成
A 股对照:A 股的“市价申报”与原书的市价单不完全相同。沪深交易所提供若干种市价申报类型(例如“最优五档即时成交剩余撤销”“最优五档即时成交剩余转限价”,深市还有“对手方最优价格”“本方最优价格”等),具体可用类型因交易所和板块而异,且都受涨跌停价格约束。另外,主板、科创板、创业板对连续竞价阶段的限价申报设有“有效申报价格范围”(俗称价格笼子),申报价不能偏离基准价太远,这在客观上限制了单笔订单造成的冲击。
4.4 限价单
限价单(limit order)是以最优可得价格交易、但不劣于指定限价的指令:买单成交价不高于限价,卖单不低于限价。在连续市场中,新限价单到达后先尝试成交;不能立即成交的部分作为挂单等待,直到有人愿意以限价成交、到期或被撤单。挂单存放在限价订单簿(limit order book)中,由经纪商、交易所甚至交易商维护。
原书图 4-1 是 Island ECN 上 Cisco 订单簿顶部的快照(2002-01-28 11:57:28):最新成交 19.74,当日订单 11,336 笔、成交约 442 万股;买方 19.74、19.73、19.72、19.71、19.70……层层排列,卖方从 19.76 开始,另有一千多笔订单未显示。可以看到电子订单簿中价格层次密集,单笔规模多为 100 股级别。
成交概率取决于限价:买单限价太低、卖单限价太高都不会成交。高价买单和低价卖单是积极定价的(aggressively priced),最容易成交。
4.4.1 限价的位置
“市场”(the market)指以最优卖价为上界、最优买价为下界的价格区间。按限价相对于这个区间的位置,限价单分为(原书表 4-1):
| 限价位置 | 买单 | 卖单 |
|---|---|---|
| 高于最优卖价 | 可立即成交 | 在市场后面 |
| 等于最优卖价 | 可立即成交 | 在市 |
| 买卖价之间 | 在市场内(做出新市场) | 在市场内(做出新市场) |
| 等于最优买价 | 在市 | 可立即成交 |
| 低于最优买价 | 在市场后面 | 可立即成交 |
- 可立即成交的限价单(marketable limit order):买单限价 ≥ 最优卖价,或卖单限价 ≤ 最优买价,提交即可执行。它像市价单,但限制了最多能让步多少价格。用它代替市价单,可以给执行价格和流动性成本设一个上限。限价极高的买单本质上就是市价单。
- 在市(at the market):挂在最优买价的买单或最优卖价的卖单,提交者做市(make the market)。
- 做出新市场(make a new market):限价落在买卖价之间,改善了当前最优价。
- 在市场后面 / 远离市场(behind / away from the market):买单限价低于最优买价、卖单高于最优卖价。名称来自手工订单簿时代,这些订单票据放在更积极订单的票据后面。
积极程度排序:可立即成交 > 做出新市场 > 在市 > 在市场后面。
4.4.2 挂单限价单是交易期权(本章核心)
挂出限价单的人,给了别人“想交易时就能交易”的能力。别人可以选择是否与之成交,所以挂单限价单就是一个交易期权:
- 限价卖单是看涨期权:任何人都可以按限价向你买入;
- 限价买单是看跌期权:任何人都可以按限价卖给你;
- 行权价就是限价。
形式化一点:设你挂出限价为 \(L\) 的买单,工具的真实价值为 \(V\)。理性的对手只在 \(V<L\) 时卖给你,对手从中得到 \(L-V\);不成交时为 0。对手方的收益为
这正是行权价为 \(L\) 的看跌期权的收益。限价卖单的对手收益为 \(\max(V-L,0)\),即看涨期权。对你而言,这是一个卖出的期权:成交时你恰好处在不利的一侧。
推导拆解:分情况写出对手的选择。
- 若 \(V<L\):对手把价值 \(V\) 的东西以 \(L\) 卖给你,赚 \(L-V>0\),他会选择成交。
- 若 \(V\ge L\):卖给你会亏或不赚,他不成交,收益为 0。
- 两种情况合起来就是 \(\max(L-V,0)\)。你的收益恰好是它的相反数 \(-\max(L-V,0)\le0\),这是卖出看跌期权(short put)的到期收益形状,只是没有收到权利金。
那你图什么?图的是“如果对方是因为想要即时性而不是因为知道 \(V<L\) 才来成交”,你就能以低于中间价的价格买到。限价单的期望收益 \(=\) 从不知情对手那里赚到的半价差 \(-\) 被知情或更快的对手行权造成的期权损失。这两项谁大,决定了挂单是否划算。
作者强调这一观察极其有用,它能帮助理解:流动性是什么;为什么许多市场离不开经纪商;为什么市场会集中;交易者如何选择下单策略;最小价格变动单位应定多大;为什么快的交易者比慢的占优。
与期权合约的区别。期权合约是立权人卖给特定买方的权利,买方无论是否行权都付了权利金;而挂限价单的人并没有出售期权,而是免费授予整个市场,任何想行使的人提交一张市价单或可立即成交的限价单即可。
限价单期权价值的决定因素(对他人而言):
- 限价(最重要)。远离市场的限价单期权价值很小,因为大家会先与价格更好的订单成交;在市的订单对想立即交易的人有价值;价格特别好的订单会被马上抢走。
- 预期挂单时间。挂得越久,别人越可以等待观望:价值上升就吃你的卖单,下跌就吃你的买单。长区间内价值变化更大,所以预期挂得久的限价单期权更值钱。不过有价值的限价单常很快被别人吃掉或被挂单者撤销,所以靠近市场的限价单主要对想立即交易者有价值。
- 价格波动率。波动越大,期权越值钱:价值在挂单者来得及撤单之前大幅变化的可能性越大。能在撤单前快速执行的交易者在波动市场中尤其看重限价单。
推论:波动市场中买卖价差更宽。交易者不愿白送期权价值,所以在市场波动时把限价单挂得离市场更远,以降低期权价值,于是价差变宽。这与期权定价中“波动率越高,期权越贵”是同一个道理,也是做市模型中价差随波动率扩大的直观来源。
金融直觉:把三个决定因素对应到 CFA 学过的期权定价参数,会更好记。限价相对市场的位置对应价内/价外程度(\(S\) 与 \(K\) 的距离):远离市场的限价单是深度虚值期权,几乎不值钱。预期挂单时间对应到期期限 \(T\)。波动率对应 \(\sigma\)。在 Black–Scholes 里,平值期权价值近似为 \(0.4\,S\sigma\sqrt{T}\),所以期权价值大致与 \(\sigma\sqrt{T}\) 成正比。挂单者要让“价差补偿”覆盖这份期权价值,价差就要随 \(\sigma\sqrt{T}\) 同向变化。这也解释了高频做市商为什么频繁撤改单:缩短有效挂单时间 \(T\),就是在降低自己卖出的期权价值。
侧栏“期权合约就是被出售的限价单”。愿意在某个未来日期之前一直履行限价单的交易者,可以通过卖出期权合约把订单卖给他人,让对方为所获得的流动性付费;代价是放弃随时撤单的权利(没人会买可以随时撤销的订单)。例子:你要去北极探险,想在离开期间以 100 美元卖出某股票。与其挂限价卖单,不如卖出行权价 100 的看涨期权:股价涨过 100 时两种方式都大概率以 100 卖出,但卖期权还多得一笔权利金。不过两者并不完全相同:如果价格先升破 100 再跌回,限价单会在升破时成交,而期权买方未必在那一刻行权,跌回后更不会行权——你仍持有股票,外加权利金。
白话解释:这个侧栏其实就是 CFA 里的备兑看涨(covered call)策略:持有股票同时卖出看涨期权。作者的观点是,备兑看涨等于“把一张长期有效、不可撤销的限价卖单打包卖掉”。权利金就是市场为这张不可撤销的限价单支付的价格。普通限价单之所以拿不到权利金,是因为你保留了随时撤单的权利,对手方不会为一份随时可能消失的期权付钱。
4.4.3 提供流动性的补偿
限价单交易者为送出免费期权希望得到的补偿是更好的价格:买方希望以买价买入(用市价单得付卖价),卖方希望以卖价卖出。但补偿未必能拿到:只有成交才能拿到好价格;市场远离订单时可能永远不成交,如果仍然要交易就得追价(chase the price),最终价格可能比一开始就用市价单更差。
第 14 章(买卖价差)将说明:价差会调整到使限价单策略的预期平均价格优于市价单策略,两者的平均差额就是提供流动性的补偿;没有补偿就没人愿意提供流动性。
侧栏“用限价单追价”。Jill 要买 500 股 GM,NYSE 报价 48.05 / 48.11,她挂 48.05 的限价买单。GM 上涨,订单没有成交;市场变为 48.15 / 48.20 时,她撤单改下市价单,以 48.20 成交。如果原限价单成交,她比一开始用市价单少付 6 美分;实际上她多付了 9 美分。
4.4.4 限价单的两大风险
风险一:执行不确定性(execution uncertainty)。价格远离订单、没能成交而后悔。确定要交易的人最担心这一点。积极定价可以提高成交概率;非常想确保成交就用市价单。这些做法降低执行不确定性,但提高交易成本。
风险二:事后后悔(ex post regret)。价格朝限价移动并穿过它(买单是下跌、卖单是上涨),订单成交,随后市场继续朝不利于新头寸的方向移动。所有交易者都会遇到事后后悔,但它特别困扰只靠向不耐心交易者提供流动性获利的交易商:他们不愿与比自己更了解未来价值的人交易,否则多数时候会站在错误一边。这种风险称为逆向选择风险(adverse selection risk),是事后后悔最重要的原因。
两种风险此消彼长:
- 把订单挂得远离市场:成交价更好、事后后悔风险更低,但成交概率下降;
- 挂得靠近市场:成交快、暴露于逆向选择的时间短,但成交价更差。
金融直觉:事后后悔和拍卖中的“赢者诅咒”是一回事。你在拍卖中赢了,往往说明别人都估得比你低,你很可能出价过高。限价单成交了,往往说明有人愿意以你的价格和你成交,而他可能知道你不知道的事。对做市商来说,最该警惕的不是没成交,而是成交得太顺利:一张大单一口气扫穿好几档(如下面 Andy 的例子),通常意味着对方急着出货且可能有理由。
后续章节会在多种情境下回到事后后悔:聪明交易者提取限价单期权价值(第 11 章)、虚张声势者诱使他人提供流动性(第 12 章)、交易商与更知情者交易(第 13 章)、大交易者伪装成小交易者(第 15 章)。
侧栏“事后后悔的例子”。Andy 是夜间在 GLOBEX 交易 S&P 500 指数期货的交易商,通常在买价挂买单、卖价挂卖单。芝加哥时间 2:30,他以最优买价 901.05 挂 20 张买单;市场为 901.05 / 901.20,最优买价上包括他在内共 30 张。五分钟后来了一张 50 张的市价卖单:系统先与 901.05 的 30 张成交,再以 901.00 成交 12 张、900.90 成交 8 张。之后市场为 900.90 / 901.20;下一分钟新的限价单使价差收窄到 900.95 / 901.00。Andy 以 901.05 买了 20 张,如果立即卖出只能得 900.95;合约乘数为 250 美元,亏损 \(250\times0.10\times20=500\) 美元。大单穿透多档、限价买单被扫到后价格继续下行——这就是逆向选择。
4.4.5 限价单代表不在场的交易者
许多交易者用限价单告诉经纪人自己愿意交易的条件,由经纪人代为盯市,这样他们可以一边处理其他事务一边参与市场。原书例子:Sandy 想在七月糖期货跌破每磅 10 美分时买 5 张,不自己盯盘,而是给经纪人一张 10 美分的限价买单。
量化实战:订单簿撮合与限价单的成交概率
本章的思想直接决定了三类量化工作:
- 交易成本模型:半价差、市场冲击、价格改善是成本模型的基本组成,Martha 的例子可以用来演示冲击和成交均价(VWAP)的计算。
- 做市与被动执行:“限价单 = 免费期权”是 Glosten–Milgrom、Avellaneda–Stoikov 等做市模型中“价差随波动率和逆向选择扩大”的直观来源;挂单时间越长期权价值越大,解释了高频做市为什么要频繁撤改单。
- 回测偏差:限价单回测必须同时模拟执行不确定性(没成交的机会成本)和事后后悔(成交后的不利漂移),否则会严重高估被动策略的收益。最常见的错误是“价格触及限价即视为成交”,并且不考虑成交与后续价格走势的相关性。
实战一:一个最小的价格-时间优先订单簿
下面实现一个极简的限价订单簿:同价位按到达先后排队(价格优先、时间优先,第 06 章详细讨论各种优先规则),市价单从最优价位开始逐档吃单。用它复现 Andy 的例子,再计算 Martha 的成交均价。
请把紧接着的第一段代码原样保存为 lob.py,第二段代码以及第 04b、05 章的代码都通过 from lob import LimitOrderBook 调用它,运行时须与 lob.py 在同一目录(或把该目录加入 PYTHONPATH)。
# lob.py —— 极简限价订单簿:价格优先、时间优先(price-time priority)
from collections import deque
import itertools
class LimitOrderBook:
def __init__(self, tick=0.01):
self.tick = tick
self.bids, self.asks = {}, {} # price -> deque[[oid, owner, qty]]
self._ids = itertools.count(1)
self.trades = [] # (price, qty, aggressor_side, passive_owner)
# 价格统一按 tick 取整,避免浮点误差
def _p(self, price):
return round(round(price / self.tick) * self.tick, 10)
def best_bid(self): return max(self.bids) if self.bids else None
def best_ask(self): return min(self.asks) if self.asks else None
def _match(self, side, qty, limit=None):
"""用到达订单(买 side='B' / 卖 side='S')吃对手簿,返回剩余数量。"""
book = self.asks if side == "B" else self.bids
while qty > 0 and book:
best = min(book) if side == "B" else max(book)
if limit is not None and ((side == "B" and best > limit) or (side == "S" and best < limit)):
break
queue = book[best]
while qty > 0 and queue:
oid, owner, q = queue[0]
fill = min(q, qty)
self.trades.append((best, fill, side, owner))
qty -= fill
if fill == q: queue.popleft()
else: queue[0][2] -= fill
if not queue: del book[best]
return qty
def limit(self, side, price, qty, owner="anon"):
price = self._p(price)
rest = self._match(side, qty, price) # 可立即成交部分先成交
if rest > 0: # 剩余部分挂入订单簿(排在同价位队尾)
book = self.bids if side == "B" else self.asks
book.setdefault(price, deque()).append([next(self._ids), owner, rest])
return rest
def market(self, side, qty):
return self._match(side, qty, None)
def depth(self, levels=5):
b = [(p, sum(o[2] for o in self.bids[p])) for p in sorted(self.bids, reverse=True)[:levels]]
a = [(p, sum(o[2] for o in self.asks[p])) for p in sorted(self.asks)[:levels]]
return b, a
from lob import LimitOrderBook
# ---------- 1. 复现 Andy 的事后后悔(S&P 500 期货,tick=0.05) ----------
ob = LimitOrderBook(tick=0.05)
ob.limit("B", 901.05, 10, "other") # 先到的 10 张
ob.limit("B", 901.05, 20, "Andy") # Andy 排在同价位之后
ob.limit("B", 901.00, 12, "other")
ob.limit("B", 900.90, 15, "other")
ob.limit("S", 901.20, 25, "other")
print("卖单到达前:", ob.depth())
ob.market("S", 50) # 50 张市价卖单穿透三档
print("成交:", [(p, q, who) for p, q, _, who in ob.trades])
print("卖单到达后:", ob.depth())
ob.limit("B", 900.95, 5, "other"); ob.limit("S", 901.00, 5, "other") # 新限价单收窄价差
bid = ob.best_bid()
print(f"Andy 买入价 901.05,此刻可卖价 {bid},亏损 = 250×{901.05-bid:.2f}×20 = {250*(901.05-bid)*20:.0f} 美元")
# ---------- 2. Martha 的橙汁期货:大单的市场冲击 ----------
lots = {"第一批": [(20, 84.25), (30, 84.40), (150, 84.70)],
"第二批": [(5, 84.60), (75, 84.80), (45, 85.00), (75, 85.15)]}
arrival_ask = 84.25
allq = allv = 0
for k, v in lots.items():
q = sum(a for a, _ in v); val = sum(a * p for a, p in v)
allq += q; allv += val
print(f"{k}: {q} 张, 均价 {val/q:.3f}")
print(f"全部 {allq} 张均价 {allv/allq:.3f},较下单时最优卖价高 {allv/allq-arrival_ask:.3f} 美分/磅")
运行输出:
卖单到达前: ([(901.05, 30), (901.0, 12), (900.9, 15)], [(901.2, 25)])
成交: [(901.05, 10, 'other'), (901.05, 20, 'Andy'), (901.0, 12, 'other'), (900.9, 8, 'other')]
卖单到达后: ([(900.9, 7)], [(901.2, 25)])
Andy 买入价 901.05,此刻可卖价 900.95,亏损 = 250×0.10×20 = 500 美元
第一批: 200 张, 均价 84.610
第二批: 200 张, 均价 84.971
全部 400 张均价 84.791,较下单时最优卖价高 0.541 美分/磅
几点说明:
- 订单簿正确复现了原书的成交序列:50 张卖单先吃掉 901.05 的 30 张(先到的 10 张、再是 Andy 的 20 张),再吃 901.00 的 12 张和 900.90 的 8 张。Andy 的订单被成交,恰好是因为一个大卖家在扫簿——这就是逆向选择。
- Martha 第二批的均价比第一批高 0.36 美分,说明第一批的冲击没有完全消退(市场从 84.20/84.25 变成了 84.55/84.60)。分批执行减少了单次冲击,但前一批留下的持久冲击(permanent impact)会抬高后一批的成本。(精读笔记中两批均价分别记为约 84.63 和 84.95,按书中数字重算应为 84.610 和 84.971。)
实战二:限价单的成交概率与逆向选择
现在用蒙特卡洛模拟回答三个问题:(1)限价离中间价越远,成交概率降多少?(2)波动率如何影响成交概率?(3)存在知情交易时,成交后的价格会怎样走?
模型设定(价格以 tick 为单位):
- 中间价从 0 出发,每步以概率 \(q/2\) 上跳 1 tick、\(q/2\) 下跳 1 tick;\(q\) 越大波动越大。
- 一部分路径是“信息事件”(比例 \(p_{\text{info}}\)):价格有方向,上跳概率多 \(\kappa\)、下跳概率少 \(\kappa\)(或相反),代表知情者推动的趋势。
- 在 \(-d\) tick 处挂限价买单;中间价触及 \(-d\) 即视为成交(这是乐观假设,现实中还要排队)。
- 到期末 \(T=100\) 步仍未成交,则用市价单追价,成交价为 \(M_T+1\)(半价差为 1 tick)。
- 基准:一开始就用市价单买入,成本为 1 tick。
在没有信息事件时,中间价是鞅。设 \(\tau\) 为首次触及 \(-d\) 的时刻,由可选停止定理(optional stopping theorem,见第 02 册)\(E[M_{\tau\wedge T}]=0\)。限价单策略的成交价在成交时等于 \(M_\tau=-d\),未成交时等于 \(M_T+1\),所以
也就是说,在没有逆向选择的世界里,“先挂限价单、不成交再追价”的平均成本总是低于市价单,省下的恰好是“成交概率 × 半价差”。下面的模拟验证这个结论,并看信息事件如何改变它。
推导拆解:先解释两个记号。\(\tau\) 是“中间价第一次跌到 \(-d\)”的时刻,它是随机的,有的路径第 3 步就到,有的永远不到;\(\tau\wedge T\) 读作“\(\tau\) 与 \(T\) 取小”,即 \(\min(\tau,T)\),表示“成交就停在成交时刻,没成交就停在期末”。
- 把成本写成一个式子。 成交时成本 \(=-d=M_\tau\);未成交时成本 \(=M_T+1\)。两种情况都可以写成“停下时的中间价”\(M_{\tau\wedge T}\),未成交时再加 1。用示性函数(条件成立取 1,否则取 0)写:成本 \(=M_{\tau\wedge T}+1\cdot\mathbf 1\{\tau>T\}\)。
- 两边取期望。 期望是线性的,\(E[\text{成本}]=E[M_{\tau\wedge T}]+P(\tau>T)\),因为示性函数的期望就是该事件的概率。
- 用可选停止定理。 中间价是鞅(每步期望变化为 0),而 \(\tau\wedge T\) 不会超过 \(T\),是一个“有界停时”。定理说:在不偷看未来的规则下停下来,鞅的期望仍等于起点 \(M_0=0\)。直观上,公平的赌局不管你用什么“见好就收”的规则,平均都赢不了钱。所以 \(E[M_{\tau\wedge T}]=0\)。
- 整理。 \(E[\text{成本}]=P(\tau>T)=1-P(\text{成交})\)。
金融含义:没有逆向选择时,成交那一刻省下的半价差是净赚的,而没成交时追价的“价格漂移”平均为零(鞅),所以挂单总是划算。逆向选择破坏的正是第 3 步:有信息时价格不再是鞅,“跌到你的限价”和“之后继续跌”是相关的。
import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
def simulate_paths(n=100_000, T=100, q=0.5, p_info=0.0, kappa=0.04):
"""中间价(单位:tick)的离散随机游走。
每步以 q/2 概率上跳、q/2 下跳;信息事件(概率 p_info)中价格有方向性:上跳概率多 kappa、下跳少 kappa。"""
direction = np.where(rng.random(n) < 0.5, 1, -1) * (rng.random(n) < p_info)
p_up = q / 2 + kappa * direction
p_dn = q / 2 - kappa * direction
u = rng.random((n, T))
steps = (u < p_up[:, None]).astype(int) - ((u >= p_up[:, None]) & (u < (p_up + p_dn)[:, None])).astype(int)
return np.cumsum(steps, axis=1) # M_1..M_T,M_0 = 0
def limit_then_chase(M, d, half_spread=1):
"""在 -d tick 挂限价买单;中间价触及即视为成交;到 T 未成交则用市价单追价(M_T + 半价差)。"""
filled = M.min(axis=1) <= -d
exec_px = np.where(filled, -d, M[:, -1] + half_spread)
regret = (M[:, -1] + d)[filled] # 成交后到期末的盯市盈亏(正=有利)
return dict(
成交概率=filled.mean(),
成交后盯市盈亏=regret.mean() if filled.any() else np.nan,
未成交时追价成本=exec_px[~filled].mean() if (~filled).any() else np.nan,
策略平均成本=exec_px.mean(),
)
rows = []
for p_info in [0.0, 0.4]:
M = simulate_paths(p_info=p_info)
for d in [1, 2, 4, 8]:
r = limit_then_chase(M, d); r.update(信息事件比例=p_info, 限价距中点=d); rows.append(r)
res = pd.DataFrame(rows).set_index(["信息事件比例", "限价距中点"])
print("基准:市价买单成本 = 半价差 = 1 tick(相对初始中点)")
print(res.round(3).to_string())
print("\n波动率对成交概率的影响(d=4,无信息事件):")
for q in [0.2, 0.5, 0.8]:
M = simulate_paths(q=q)
print(f" 每步跳动概率 q={q}: 成交概率 {limit_then_chase(M, 4)['成交概率']:.3f}")
# 鞅情形的理论检验:E[成本] = (1 - 成交概率) × 半价差
M = simulate_paths(p_info=0.0)
for d in [1, 4]:
r = limit_then_chase(M, d)
print(f"d={d}: 模拟平均成本 {r['策略平均成本']:.3f},理论值 {(1-r['成交概率'])*1:.3f}")
运行输出:
基准:市价买单成本 = 半价差 = 1 tick(相对初始中点)
成交概率 成交后盯市盈亏 未成交时追价成本 策略平均成本
信息事件比例 限价距中点
0.0 1 0.889 -0.015 8.886 0.101
2 0.780 -0.003 7.995 0.198
4 0.574 -0.016 6.345 0.412
8 0.260 -0.006 3.783 0.717
0.4 1 0.871 -0.441 10.737 0.508
2 0.757 -0.779 9.653 0.828
4 0.568 -1.199 7.838 1.108
8 0.295 -1.518 4.984 1.148
波动率对成交概率的影响(d=4,无信息事件):
每步跳动概率 q=0.2: 成交概率 0.370
每步跳动概率 q=0.5: 成交概率 0.573
每步跳动概率 q=0.8: 成交概率 0.653
d=1: 模拟平均成本 0.095,理论值 0.111
d=4: 模拟平均成本 0.426,理论值 0.429
怎么读:
- 成交概率随限价距离迅速下降:从距中点 1 tick 的约 89% 降到 8 tick 的约 26%。
- 波动率越大,成交概率越高(\(d=4\) 时从 37% 升到 65%)。这对挂单者是好事,但同时意味着对手方手里的期权更值钱——所以 4.4.2 节说波动市场中价差会变宽。
- 没有信息事件时,成交后的盯市盈亏接近 0(只有模拟误差),策略平均成本与理论值 \(1-P(\text{成交})\) 吻合(差异在蒙特卡洛误差范围内),全部低于市价单的 1 tick。
- 有信息事件时,成交后盯市盈亏显著为负,而且限价越远越负(\(d=8\) 时约 −1.5 tick):价格能一路跌到你的远端限价,往往是因为有人知道价格该跌。这就是逆向选择——你的订单恰恰在你最不希望成交的时候成交。同时“未成交时的追价成本”也更高:没成交往往是因为价格涨走了。两头受损之后,\(d=4\) 和 \(d=8\) 的策略平均成本已经超过了直接用市价单的 1 tick。
白话解释:第 4 点的“两头受损”可以这样记:信息事件里,价格要么一路向下(你的买单成交,然后继续亏),要么一路向上(你的买单不成交,最后高价追入)。不管哪种,你都站在知情者的对面。没有信息时,成交与否和之后的走势无关,平均下来省钱;有信息时,成交与否本身就携带了未来走势的信息。这就是为什么评价被动执行不能只看“成交了的那部分省了多少”,必须把成交和未成交两类订单放在一起、按条件期望分别统计后再加权。
回测启示:
- “触及即成交”高估了成交概率,现实中还需要排在你前面的订单先被吃掉;更严格的做法是要求价格穿过限价,或在逐笔数据中模拟队列位置。
- 必须把“成交”与“成交后价格走势”联系起来评估。只统计成交价比市价单好多少,会把逆向选择的损失漏掉。
- 未成交的订单不能简单丢弃,必须按策略逻辑计入追价成本或机会成本。
本章小结
订单是交易指令,下单策略是交易成败最重要的决定因素。市价单需求即时性,小额市价单的成本是半个价差,大额市价单还要支付随规模增大的市场冲击,并承担执行价格不确定性;价差宽、单子小时可能获得价格改善。限价单通过向市场免费授予交易期权来提供流动性:限价卖单是看涨期权,限价买单是看跌期权,行权价就是限价。期权价值随限价接近市场、挂单时间延长、波动率上升而增大,所以波动大时价差变宽。限价单的补偿是更好的平均价格,代价是执行不确定性和事后后悔,而事后后悔的主要来源是逆向选择。一句话概括:市价单不确定成交价格,限价单不确定是否成交。
| 概念 | 公式或要点 |
|---|---|
| 中间价 | \(M=(P_{\text{ask}}+P_{\text{bid}})/2\) |
| 小额市价单成本 | 半价差 \((P_{\text{ask}}-P_{\text{bid}})/2\) |
| 市价单总成本 | 半价差 + 市场冲击(随规模增大)+ 执行价格不确定性 |
| 价格改善 | 以优于当前最优报价的价格成交 |
| 可立即成交限价单 | 买单限价 ≥ 最优卖价;给成本设上限 |
| 限价单即期权 | 对手收益:买单 \(\max(L-V,0)\)(看跌),卖单 \(\max(V-L,0)\)(看涨) |
| 期权价值决定因素 | 限价位置、预期挂单时间、波动率 |
| 波动与价差 | 波动大 → 挂单远离市场 → 价差变宽 |
| 无信息时的限价策略成本 | \(E[\text{成本}]=(1-P(\text{成交}))\times\) 半价差 |
| 逆向选择 | 成交后价格继续不利;限价越远、知情交易越多越严重 |
练习
基础
- 最优买价 50.10、最优卖价 50.16。分别计算中间价、价差、市价买单的半价差成本(以 bp 表示)。 答案:中间价 50.13,价差 0.06,半价差 0.03,约 6 bp。
- 当前报价 20.00 / 20.05。判断以下订单的类别:限价 20.05 的买单;限价 20.02 的卖单;限价 19.98 的买单;限价 20.00 的卖单。 答案:可立即成交;做出新市场;在市场后面;可立即成交。
- 为什么说“市价单不确定成交价格,限价单不确定是否成交”?各举一个这种不确定性造成损失的例子。
- 用期权的语言解释:为什么你在重大公告前应当撤掉挂在市场附近的限价单?
进阶
- (原书第 1 题)什么时候应该用限价单而不是市价单?请从紧迫度、信息、波动率、价差四个角度回答。
- (原书第 5 题)限价单和报价向市场提供期权。波动率上升时价差会怎样变化?用本章的模拟代码验证:把 \(q\) 从 0.5 提高到 0.8,固定成交概率为 50%,需要把限价挂远多少? 提示:价差应变宽;可以对 \(d\) 做网格搜索。
- (原书第 6 题)如果你不能快速调整限价(例如手工交易),应该把订单挂得离市场近还是远?结合执行不确定性与逆向选择的权衡回答。
- (原书第 7 题)有些电子系统允许指数化限价单(indexed limit orders),其限价与某个指数挂钩随之调整。交易者为什么喜欢它?它与第 02 章 Lisa 的期权限价单有何关系? 提示:防止标的或大盘变动后限价单变成过时报价被吃掉;现代做市系统让报价随参考价自动调整也是同样道理。
- 修改模拟:让成交条件变为中间价穿过 \(-d\)(即 \(M\le -d-1\)),成交价仍为 \(-d\)。成交概率和策略平均成本如何变化?这说明“触及即成交”的回测假设偏向哪个方向?
- 在模拟中把 \(\kappa\) 调大到 0.08,找出使限价策略平均成本等于市价单成本(1 tick)的最小 \(d\)。这个结果对做市商的报价宽度有什么启示?
原书推荐习题:第 4 章思考题共 9 题(PDF p.101),本章涉及第 1、3、5、6、7 题,推荐重点做第 5、6、7 题。
原书对照
- 原书第 4 章 Orders and Order Properties,本章覆盖 PDF 第 81–91 页(原书页码约为 PDF 页码减 13)。
- 开篇与 4.1 订单是什么(侧栏“订单例子”):p.81–82;4.2 重要术语:p.82–84;4.3 市价单(侧栏 AstroPower、AnnTaylor、橙汁期货):p.84–86;4.4 限价单(图 4-1、表 4-1、图 4-2,侧栏“期权合约就是被出售的限价单”“用限价单追价”“事后后悔例子”):p.86–91。
- 第 4 章其余部分(止损单、MIT、跳动敏感订单、有效期与其他指令、小结与思考题)见第 04b 章。