跳转至

第 9 课 一笔订单怎样进入市场

行情表记录已经发生的市场活动。策略要把一个判断变成持仓,还要走过订单、撮合与成交。

适合谁读懂第一段策略代码的读者
前置知识价格、信号和持仓
建议用时75 分钟
本课成果画出信号到成交的时间线

回测中的十元为什么没有买到

小岚在周三晚上运行策略,程序告诉她“可以买入”。她在回测报告里看到周三收盘价是 10.00 元,于是把买入价也写成 10.00 元。第二天真正观察市场时,最便宜的卖单已经是 10.08 元。

这八分钱来自哪里。周三的信号要等收盘数据完整以后才能算出,10.00 元只是最后一笔历史成交留下的记录。等小岚准备下单时,卖方愿意接受的价格已经变化。策略做出了判断,却还没有获得任何资产。

这段小插曲揭开了量化研究中很重要的一段距离。行情描述过去发生了什么,订单表达你想做什么,成交才说明市场实际给了你什么。

交易所把买方与卖方放到同一套规则里

市场里不断有人提交买卖意愿。买方写明愿意支付的价格和数量,卖方写明愿意接受的价格和数量。交易所或其他交易场所提供共同规则,把这些意愿按价格、时间等条件排列;当买卖条件能够匹配时,双方产生一笔成交。股票代码和公司名称告诉我们交易对象是谁,订单簿则让我们看见此刻有哪些意愿仍在等待。

交易所不是卖给投资者股票的商店,它更接近一座按照公开规则运行的市场。券商通常负责把客户订单送往交易场所,交易所负责组织报价和撮合,结算机构再处理资金与证券的交收。初学回测可以把这条链条简化成下单、成交和记账三步,但要知道屏幕上的价格来自参与者之间已经完成的交易,不是平台为每个人长期保留的固定售价。

假设某只虚构资产的订单簿只有下面几档。订单簿可以先理解成尚未完成的买卖意愿清单。

买方等待区 买入数量 卖方等待区 卖出数量
9.99 元 200 份 10.01 元 100 份
9.98 元 400 份 10.02 元 250 份
9.97 元 500 份 10.03 元 500 份

此时最高买价是 9.99 元,最低卖价是 10.01 元。两者相差 0.02 元,这个距离叫买卖价差。最近一笔成交也许是 10.00 元,可这不代表还有人愿意继续按 10.00 元卖出。

如果小岚立刻买入 300 份,她会先拿走 10.01 元的 100 份,再拿走 10.02 元的 200 份。平均成交价要按照每个价格实际买到的数量加权,不能把 10.01 与 10.02 简单相加后除以二。先算两档各花多少钱,再除以总数量。

成交金额 = 100 × 10.01 + 200 × 10.02 = 3005
平均成交价 = 3005 ÷ 300 ≈ 10.0167

屏幕上的最低卖价只有 10.01 元,较大的订单却得到 10.0167 元的平均价格。订单沿着多个价位成交的现象常被称为冲击或滑价的一部分。真实市场还会有更多参与者、撤单、排队和撮合规则,教学表只保留了理解机制所需的骨架。

把已经完成的手算压缩一下,平均成交价可以写成下面的关系。公式里的 \(p_k\) 是第 \(k\) 档的成交价格,\(q_k\) 是这一档实际成交的数量,分母把各档数量相加。字母 \(k\) 只是给不同档位编号,本例有两档。

\[ \bar p=\frac{\sum_k p_kq_k}{\sum_k q_k} \]

把 10.01、100、10.02 和 200 放回公式,会再次得到约 10.0167 元。公式没有创造新规则,只是让很多档位也能使用同一种写法。

K 线把一天压缩成四个价格

研究者不可能从一根日 K 线还原全天每笔成交。K 线是某个时间区间的价格摘要,日 K 线把一个交易日压缩成一条记录。它通常只保留四个代表性价格,并经常附带成交量与成交额。成交量表示期间内完成交易的数量,成交额表示这些交易按金额汇总后的规模,两者都不能直接告诉我们每一笔订单在队列中的位置。

字段 它记录什么 它没有告诉你什么
开盘价 当日第一笔成交,或市场规则定义的开盘价格 你的订单是否排在第一笔
最高价 当日出现过的最高成交价格 该价位有多少数量可成交
最低价 当日出现过的最低成交价格 你的买单能否在低点排到
收盘价 当日最后一笔成交,或规则定义的收盘价格 收盘后才产生的信号能否倒回去成交

两个完全不同的盘中过程,可以留下同一组开高低收。

路径甲 10.00 → 10.50 → 9.80 → 10.20
路径乙 10.00 → 9.80 → 10.50 → 10.20

两条路径的开盘价都是 10.00
最高价都是 10.50
最低价都是 9.80
收盘价都是 10.20

假设策略同时设置 9.90 元止损和 10.40 元止盈。路径甲先碰止盈,路径乙先碰止损,日 K 线却无法告诉我们真实顺序。只用日线回测时,研究者需要采用保守且明确的规则,或者改用更细粒度的数据。凭日线最低价宣称订单恰好在最低点全部成交,也缺少订单队列与可成交数量的证据。

市价单与限价单交换了什么

市价单强调尽快与当前可用订单匹配。它没有为成交价设置明确边界,所以流动性较弱或行情快速变化时,平均价格可能明显偏离刚才看到的报价。

限价买单会写出可以接受的最高价格。限价卖单则写出可以接受的最低价格。价格边界得到控制以后,成交就不再确定。小岚提交 10.00 元限价买单,而最低卖价一直停在 10.20 元,她的订单会等待;到期或主动撤销时,可能一份也没有买到。

想优先控制什么 常见选择 得到的好处 需要接受的代价
尽快参与市场 市价单 更容易立刻与现有订单匹配 成交价缺少明确上限或下限
不突破价格边界 限价单 最差可接受价格写得清楚 可能等待、部分成交或不成交

订单类型没有脱离场景的优劣。策略频率、资产流动性、订单大小和市场规则共同决定合适做法。突破策略希望尽快进入市场,可能更关注成交概率;等待价格回落的策略愿意牺牲部分成交机会,可能更关注价格边界。回测若无法模拟精细订单簿,至少应把费用、滑点和未成交假设写出来,并用更差的成交条件重新计算。

打开下单与成交模拟器

在实验里先买入小数量,再逐步增加订单规模。观察订单怎样吃掉前几档卖盘,以及平均成交价和未成交数量怎样变化。

从信号走到账本的六个时刻

市场信息依次经过收盘数据、规则判断、等待成交、提交订单、成交回报与更新账本

图中的六个场景依次表示市场产生记录、规则读取数据、等待可交易时点、订单进入市场、买卖撮合,以及结果写入账本。每一步都会给下一步增加现实约束。

周三收盘策略的完整时间线可以写成下面这样。

sequenceDiagram
    accTitle: 收盘信号到下一交易日成交
    accDescr: 周三市场收盘以后数据才完整,策略随后计算信号并安排订单,订单在周四进入市场,满足价格和数量条件后产生实际成交,最终写入持仓账本
    participant M as 市场
    participant S as 策略
    participant O as 订单系统
    participant L as 账本
    M->>S: 周三收盘数据完整
    S->>S: 计算指标与信号
    S->>O: 安排周四订单
    O->>M: 周四进入市场
    M-->>O: 回报成交价与数量
    O->>L: 更新现金、持仓和费用

信号是策略根据已知信息得出的判断。订单写明资产、方向、数量、时机与价格条件。订单送入市场以后,还可能处于等待、部分成交、全部成交、撤销或被拒绝等状态。成交回报记录市场实际匹配的价格和数量,账本必须按照回报更新。持仓与现金只有在成交后才应改变。

如果订单只成交 60%,账本就只能增加已成交的 60%。剩余部分可能继续等待,也可能按规则撤销。把“发出订单”直接写成“获得全部持仓”,会把市场的不确定性从回测里抹掉。

市场规则会改变可执行结果

交易时间、最小交易数量、价格最小变动单位和涨跌限制都可能影响订单。资产停牌时,即使策略信号很强,也没有可用的连续交易机会。成交量很小的资产,历史价格虽然存在,却未必容得下研究者设定的订单规模。

这些限制不要求初学者一次掌握所有交易所细则。研究一种资产以前,应查清对应市场的官方规则,并在研究说明里写出使用了哪些简化。虚构教学数据可以忽略部分制度细节,真实研究不能把这种简化悄悄带过去。

订单簿中的买盘、卖盘、价差与成交

图的左侧是等待中的买单,右侧是等待中的卖单。买一与卖一之间仍有距离时不会自动成交,新的市价买单会从卖一开始逐档匹配。每档数量有限,订单越大,平均买入价越可能向上移动。

数据粒度要与研究问题相配

日线适合研究按日形成、按日调整的规则,却无法还原每个价位的排队与盘中先后。使用日线模拟市价单时,研究者只能采用公开且一致的简化假设,并通过滑点、成交量上限和更差价格检查结论。策略若依赖盘口深度、秒级变化或极低延迟,日线数据从一开始就无法支持这个问题。

更细的数据也不会自动带来更可信的答案。分钟线会增加盘中顺序,却仍然省略分钟内部的逐笔队列;逐笔数据更接近市场事件,同时带来更大的存储量、更复杂的时间戳和更严格的清洗要求。研究者应先写清策略需要辨认的最短时间尺度,再选择能够提供这类证据的数据。

中国股票市场还要检查哪些制度

A 股研究常遇到交易单位、价格涨跌限制、停牌和交收制度。具体规则会随板块、产品与时期变化,编写回测时应查交易所当期规则。课程这里只保留通用原则,程序不能把没有成交机会的日期当成自由买卖,也不能把今天适用的制度直接套到多年以前的历史数据。

复权价格适合计算连续收益,真实下单仍要使用当时可成交的名义价格与最小变动单位。研究数据、信号价格和成交价格各自承担不同职责,不能因为都叫价格就混成一列。

容易弄错的地方

当收盘价参与信号计算时,最终数值要到收盘以后才完整。回测又让订单按同一个收盘价成交,相当于把已经结束的时点重新打开。更稳妥的写法是把订单移到下一可交易时点,或使用能够证明当时可执行的细粒度机制。

限价单到达目标价格,只说明市场曾经触碰这个价位。你的订单前面可能已经排着其他买方,目标价位的可卖数量也可能不足。回测把每张限价单都当作足量成交,通常会高估执行能力。

日 K 线保存了价格范围,却没有保存盘中完整顺序。同一天同时触发止损和止盈时,日线数据无法单独裁决谁先发生。采用保守处理、补充分钟或逐笔数据,都是可以说明的选择。

市场规则和流动性属于策略条件的一部分。忽略停牌、数量限制和成交容量,程序仍能画出顺滑曲线,但那条曲线描述的交易可能无法实际发生。

一分钟自测

小岚提交 10.00 元限价买单,全天最低卖价始终是 10.20 元。她的账本会自动增加持仓吗?

查看答案不会。没有卖方愿意在 10.00 元或更低价格匹配,订单可能继续等待或被撤销。没有成交回报,现金和持仓就不应变化。

本课术语

词语 先这样理解
资产 可以交易或持有的对象
订单簿 尚未完成的买卖意愿清单
撮合 按市场规则匹配买卖订单
K 线 某个时间段成交信息的摘要
市价单 优先与当前可用订单匹配的指令
限价单 带有可接受成交价格边界的指令
买卖价差 最高买价与最低卖价之间的距离
部分成交 一张订单只有部分数量完成匹配

课后练习

1 辨认字段

日内成交过的最低价格属于哪个 K 线字段。这个字段能否证明你的订单在该价位全部成交?

提示先区分市场留下的价格记录与你的订单执行结果。
答案它属于最低价,也常写作 low。最低价只能证明当日出现过该价格,不能证明你的订单排到了队列前方,也不能证明该价位有足够数量。

2 计算平均成交价

最低两档卖盘分别是 10.01 元 100 份、10.02 元 250 份。现在用市价单买入 200 份,忽略后续变化,平均成交价是多少?

提示第一档全部买完以后,还需要从第二档买入 100 份。
答案成交金额为 100×10.01 + 100×10.02 = 2003 元,平均成交价为 10.015 元。

3 排时间线

把周三收盘数据、策略信号、订单进入市场、周四成交和账本更新按先后排列。

提示账本依据实际成交回报更新。
答案周三收盘数据完整,策略随后形成信号并安排订单。订单在周四进入市场,满足条件后得到成交回报,最后根据实际价格和数量更新账本。

4 动手实验

在订单模拟器里逐步提高订单数量,记录平均成交价格和未成交数量。再写一句解释,说明数字为什么发生变化。

提示查看每个价格档位能够提供多少数量。
答案订单变大后会消耗更多卖盘档位,后续数量只能在更高价格匹配,因此平均买入价通常变差。若可用卖盘总量不足,还会留下未成交部分。

5 开放思考

只有日 K 线时,你会怎样处理同一天既触发止损又触发止盈的情况?

评价要点答案应说明日线缺少盘中先后。可以选择按更保守结果处理,也可以放弃这笔无法判定的交易,或改用更细数据。无论选择哪一种,都要在研究报告中公开规则,并做替代假设测试。
离开本页前
试着完整说出一笔交易的顺序。市场先留下可用数据,策略据此形成信号,订单随后进入市场,满足条件才会成交,账本最后按照实际价格和数量更新。能解释其中任何一步为何不能跳过,就可以进入下一课。