主题
第3章:A股交易制度与真实约束
上一章解决了“从哪些股票中选”的问题:交易所、板块、上市状态和风险警示共同定义了股票池。但股票进入股票池,并不表示策略发出信号后就一定能按屏幕上的价格成交。回测中的一行买入记录,在现实中必须经过信息出现、下单、撮合和结算;任何一环不成立,纸面收益都不能变成账户收益。
本章要建立从信号到成交的现实约束。我们会理解交易日内怎样形成价格,T+1 和涨跌停怎样限制买卖,停牌和退市怎样阻断退出,以及复权、费用、滑点和流动性为何会改变回测结果。学完后,你应能审查一句“次日买入”究竟指什么、是否买得到、按什么价格成交、付出了多少成本。
这些约束也是后续课程的地基。下一章将计算收益与风险;如果价格口径、成交时点或成本先错了,再精确的年化收益和最大回撤也只是精确地描述一个不存在的策略。
一笔交易怎样真正发生
从信号到持仓有一条时间链
量化策略不能只记录“哪天选中了哪只股票”,还要沿着下面的时间链逐步回答问题:
| 顺序 | 交易环节 | 必须确认的事实 |
|---|---|---|
| 1 | 信息可得 | 数据在什么时点已经对市场参与者可见 |
| 2 | 生成信号 | 策略在什么时点完成计算 |
| 3 | 提交订单 | 当时是否允许报单,使用什么申报方式 |
| 4 | 市场撮合 | 价格、队列和对手盘是否支持成交 |
| 5 | 成交或失败 | 实际成交多少,未成交部分怎样处理 |
| 6 | 扣费与结算 | 扣除哪些成本,股份何时成为可卖持仓 |
读表时最重要的是顺序:不能先用收盘后才完整获得的数据计算信号,再假设自己已经按当天收盘价买入;也不能因为某日 K 线出现过一个价格,就认定订单一定在那里成交。一个可信的回测至少要分别记录信号时点、下单时点、成交价格规则、成交数量和未成交处理。
例如,策略使用当日收盘价和收盘后发布的数据打分,那么最早只能在之后可下单的时段交易。若假设次日开盘成交,还要检查次日是否停牌、开盘是否触及涨跌停、集合竞价是否有足够的对手盘,以及订单规模是否会影响价格。
集合竞价与连续竞价解决不同问题
集合竞价是在一段时间内集中接收买卖申报,再按照“能够实现最大成交量”等原则一次确定成交价。沪深市场通常在开盘前进行开盘集合竞价,并在收盘前进行收盘集合竞价。开盘申报阶段中还存在不可撤单的时间窗口;具体时段和可撤单规则应以交易所当时有效规则为准。
连续竞价则是在交易时段内持续撮合买卖申报。常见的限价申报遵循价格优先、时间优先:更有利的价格排在前面;价格相同时,较早进入系统的申报优先。它意味着“我愿意按涨停价买”并不等于立刻成交,因为同一价格前面可能已有很长的买单队列,而且没有足够卖单。
对回测来说,开盘价、收盘价都不是自动属于策略的价格:
- 用开盘价成交,隐含订单已及时进入集合竞价,并能按撮合结果获得所需数量。
- 用收盘价成交,隐含订单符合收盘阶段的交易安排,并有足够流动性。
- 用当日最高价或最低价成交,通常更不可信,因为那只是市场曾经出现的极端价格,不代表策略订单能排到并成交。
集合竞价和连续竞价的精确时段、申报类型及异常情况下的安排可能调整。研究数据库应保存交易日历和当日交易状态,不要仅凭固定钟点推断某笔历史订单必然有效。
T+1限制的是卖出时点
当日买入的股票通常不能当日卖出
A 股股票现货交易通常实行 T+1:在交易日 T 买入的股票,要到下一个交易日才可以卖出。因此,一个依靠“当天买入、当天止损”来控制个股风险的股票策略,在普通 A 股账户中无法照搬执行。
T+1 不表示所有资金和证券都要静止一天。股票卖出后得到的资金,通常可以在当日继续用于证券交易,但一般要到下一交易日才能转出到银行账户;ETF、可转债等其他证券可能适用不同的回转交易规则。本课程讨论股票策略时,不能把其他品种的 T+0 经验混进来。
T+1 对策略有三项直接影响:
- 当日买入后即使价格急跌,也不能靠卖出这笔新持仓立即退出。
- 日内最高、最低价不能被随意组合成“低点买、高点卖”的回测路径。
- 调仓程序必须区分昨日可卖持仓与今日新增、尚不可卖的持仓。
若策略原本持有 1,000 股,今日又买入 500 股,通常仍可卖出原有的 1,000 股,但不能卖出今日新增的 500 股。回测若只保存合计持仓而不记录持仓批次,容易错误放大可卖数量。
涨跌停限制价格,却不保证成交
价格边界因板块和证券状态而异
涨跌幅限制通常以前一交易日收盘价为基础,结合除权除息等情形计算当日价格边界,并按最小价格变动单位取整。常见制度可用下表建立直觉,但历史回测必须使用当日、当证券实际适用的规则,不能用今天的规则覆盖全部历史。
| 市场或状态 | 常见日涨跌幅限制 | 研究时特别注意 |
|---|---|---|
| 沪深主板普通股票 | 10% | 风险警示、新股初期和特殊交易日可能不同 |
| 创业板、科创板普通股票 | 20% | 制度启用日期不同,不能把 20% 回填到更早历史 |
| 北交所普通股票 | 30% | 流动性与投资者适当性也不同于沪深市场 |
| 沪深主板风险警示股票 | 通常为 5% | 创业板、科创板及特殊情形不能机械套用此值 |
注册制下沪深新股上市后的若干初始交易日,以及北交所新股上市首日,可能不设通常的日涨跌幅限制,并配套盘中临时停牌等机制。退市整理、重新上市或交易所认定的其他特殊情形也可能采用不同规则。策略应维护随日期生效的规则表,而不是只写一列 is_limit_up 后假定其算法永远不变。
“触及涨停”不等于“不能买”,一字板才暴露出极端情形
股票到达涨停价后,仍可能有卖单进入并成交;跌停时也可能出现买单。因此,仅凭收盘价等于涨停价,就把全天所有买单判为无法成交,会过度悲观。真正需要模拟的是订单进入时的价格、队列和对手盘。
一字涨停通常指开盘价、最高价、最低价和收盘价都在涨停价附近,全天几乎没有更低价格;一字跌停则相反。它们揭示了日线回测最常见的失真:
- 策略在一字涨停日按涨停价买入,但盘面可能只有大量封单、几乎没有卖量,现实中排队也买不到。
- 策略在一字跌停日按跌停价卖出,但可能没有足够买盘,现实中无法退出。
- 用“当日成交量大于零”就认定自己的订单全部成交也不够,因为少量成交可能发生在长队列前方,且轮不到策略订单。
因此,日频回测至少应把停牌、开盘即封板、下单时点处于价格边界、成交量过低等情形列为不可成交或保守成交;更精细的研究需要分钟或逐笔数据估计实际可成交数量。无法成交的订单应按事先规则延期、取消或部分保留,不能在事后挑选对收益最有利的处理方式。
停牌与退市会让退出通道消失
停牌期间没有可供策略成交的市场
停牌表示证券在指定时间暂停交易,原因可能包括重大事项、异常波动核查或上市状态变化。停牌期间价格不更新,不等于风险停止变化;公司和市场信息仍在累积,复牌后价格可能一次性跳变。
可信的组合回测应当:
- 保留停牌前已经持有的股票,而不是按最后收盘价假装卖出;
- 禁止新买入停牌股票,也不能用停牌期间不变的价格计算“低波动”并把它当成安全;
- 明确停牌持仓的估值方法和现金占用;
- 复牌后继续检查涨跌停和流动性,因为“恢复交易”仍不保证能够退出。
若停牌股票持续占用仓位,组合可能无法按目标权重调仓。实盘中其他可交易股票的权重会被动改变,这种偏离也应体现在组合净值和风险暴露中。
退市不是以最后一个方便价格自动清仓
公司可能经历风险警示、终止上市决定、退市整理期以及摘牌等阶段,但具体流程取决于退市类型和当时规则,并非所有股票都有相同的整理交易安排。摘牌后,股份可能进入其他转让安排,却不代表仍能像交易所上市股票一样及时、足量成交。
回测不能因为历史行情在某天结束,就按最后一个收盘价自动卖出;也不能直接从样本中删除退市公司。前者可能虚构流动性,后者会制造幸存者偏差。合理做法是保留当时已持有的头寸,按照真实可交易阶段、价格和费用处理,无法可靠估计时采用明确且保守的损失假设,并单独报告其影响。
除权除息与复权价格
价格下调不一定代表投资者亏损
现金分红、送股、转增和配股会改变股票价格、股数或股东现金。除权除息是在相应权益生效时,对证券参考价格进行调整,使权益变化不会被误读为普通市场涨跌。
假设某股票股权登记日收盘价为 10 元,每股派发现金红利 0.50 元,忽略税费和市场波动,除息参考价约为:
其中,
送转和配股的参考价需要同时考虑股数变化、配股价格和配股比例。此处的关键不是背公式,而是始终把价格、持股数量、现金分红和认购现金流放在同一套账户中计算。
三种价格口径回答不同问题
| 价格口径 | 怎样处理公司行动造成的断点 | 适合回答什么 | 主要风险 |
|---|---|---|---|
| 不复权价格 | 保留市场当时真实报价 | 当时能否成交、涨跌停价是多少 | 直接计算长期收益会把除权除息误当成价格损失 |
| 前复权价格 | 通常保持最新价格不变,向前调整历史价格 | 观察接近当前价格尺度的连续走势 | 历史数值会随后来公司行动改变,不能充当当时真实成交价 |
| 后复权价格 | 通常保持较早价格不变,向后调整后来价格 | 展示长期持有的累计增长轨迹 | 数值可能远离实际报价,不能直接用于下单或成交判断 |
“前复权一定用于回测、后复权一定用于研究”不是可靠规则。不同数据商对配股、红利税、再投资和复权因子的处理可能不同。稳健做法是保存不复权行情和逐次公司行动,以一致的复权因子计算连续收益,并核对总收益是否包含现金分红。
尤其要避免把复权价与真实交易规则混用:成交价、涨跌停价和订单金额应基于当时的不复权报价;收益序列则要正确计入分红、股数变化和现金流。若直接拿前复权收盘价判断历史上是否涨停,可能得到根本不存在的价格边界。
显性费用只是交易成本的一部分
佣金、印花税与过户费的方向不同
股票交易的显性费用通常包括以下几类:
| 成本 | 常见收取方向 | 计算基础 | 回测注意点 |
|---|---|---|---|
| 券商佣金 | 买入和卖出 | 成交金额 | 费率因账户与券商而异,常有单笔最低收费,必须使用自己的真实合同口径 |
| 证券交易印花税 | 卖出 | 卖出成交金额 | 当前 A 股按卖出方向征收;税率和政策可能调整,应按历史生效日维护 |
| 证券交易过户费 | 买入和卖出 | 成交金额 | 沪深市场现行标准通常按双向计收,具体市场和历史阶段需核对 |
截至本章编写时,A 股证券交易印花税常用现行口径为卖出成交金额的 0.05%,沪深 A 股过户费常用现行口径为成交金额的 0.001%、双向收取。佣金由账户约定决定,不能把宣传中的低费率直接套给所有投资者;规费是否已包含在佣金报价中也应向券商确认。上述数字用于说明量级,不应覆盖历史费率或替代最新官方规则。
若买入金额为
其中,
滑点是模型价格与实际价格的差
滑点是策略假设的基准价格与实际成交价格之间的偏差。买入成交价高于模型价、卖出成交价低于模型价,都会侵蚀收益。它可能来自报价变化、报单延迟、买卖价差以及订单只能分批成交。
冲击成本更强调订单本身对市场的影响。若策略要在一只日成交额很小的股票上快速买入大量股份,主动吃掉卖盘会把后续成交价越推越高;卖出则可能把价格越压越低。资金规模越大、交易越急、股票越不活跃,冲击通常越明显,而且不是固定费率能够完整描述的。
流动性就是在较短时间内以接近当前价格完成交易、又不显著推动价格的能力。成交额高不保证任何时点都流动,日成交量也不能回答某一分钟有多少对手盘。评估可交易性时,至少应同时观察成交额、买卖价差、订单金额占同期成交额的比例、价格是否接近涨跌停,以及成交是否集中在少数时段。
一个简单的容量约束可以写成:若计划交易金额为
其中,
不同板块不能共用一套成交假设
板块差异不只体现在涨跌幅限制,还涉及首次上市阶段、盘中临时停牌、申报数量、投资者适当性和盘后交易安排等。以常见竞价申报为例,沪深主板和创业板买入数量通常以 100 股为一手或其整数倍;科创板单笔申报通常至少 200 股,此后可按 1 股递增;北交所竞价交易单笔申报通常至少 100 股,此后可按 1 股递增。卖出不足最低申报数量的零股,一般需要一次性申报卖出。规则若有更新,应以对应交易所和交易日期为准。
这些差异会造成真实的组合偏差。假设模型要求所有股票等权,但账户资金较小,200 股科创板高价股的最低买入金额可能远高于目标权重;直接向下取整又可能变成零持仓。回测若允许买入任意小数股,就虚构了无法实现的分散化。
因此,每只证券每天至少应关联以下交易属性:
- 所属交易所与板块,以及当日适用的涨跌幅规则;
- 是否停牌、风险警示、退市阶段或处于新股特殊交易期;
- 当日涨跌停价、最小价格变动单位和最低申报数量;
- 当时可用的申报与交易时段;
- 不复权成交行情、成交量和成交额;
- 适用的费用、税率和公司行动。
历史制度会变化,所以这些字段应当带有生效日期。用一套当前参数回测十年前的数据,看似统一,实质上改变了当时投资者面对的市场。
把约束写进回测订单
从本章开始,“买入某股票”应被改写成一条可以审计的订单规则。例如:在交易日 T 收盘后生成信号;T+1 参加开盘集合竞价;若证券停牌或买入订单无法在价格限制内成交,则本次取消;成交数量按申报单位向下取整,且不超过目标金额和设定的成交额参与率;按实际成交金额收取买入费用。卖出也要单独规定跌停、停牌、部分成交和 T+1 持仓限制。
下面这张检查表可以用于审查任何日频回测:
| 检查项 | 必须回答的问题 | 常见的乐观假设 |
|---|---|---|
| 信息时间 | 信号所需数据在下单前已经可得吗 | 用收盘后信息按当日收盘成交 |
| 交易状态 | 当时是否停牌、退市阶段或受特殊规则约束 | 行情缺失时仍按前收盘买卖 |
| 价格限制 | 订单方向上是否存在涨跌停阻塞 | 一字涨停能买入、一字跌停能卖出 |
| 成交价格 | 基准价为什么能被策略获得 | 默认所有订单精确按开盘价或收盘价成交 |
| 成交数量 | 对手盘和申报单位是否支持目标数量 | 允许小数股,或成交量很小时仍全额成交 |
| 持仓结算 | 今日买入数量是否已经可卖 | 对 A 股股票执行日内止损 |
| 成本 | 是否覆盖双边费用、税、滑点和冲击 | 只扣一个固定佣金率,忽略卖出税费和容量 |
| 公司行动 | 分红、送配和除权是否进入账户 | 把除息跌幅当亏损,或把复权价当真实成交价 |
约束的目的不是把所有回测都做成逐笔撮合,而是让模型复杂度与结论强度匹配。只用日线数据时,应承认无法知道队列位置,并采用一致、保守、可复核的成交规则;策略表现若只在最乐观假设下成立,就不应被视为可交易收益。
本章小结
- 一笔真实交易要依次经过信息可得、生成信号、报单、撮合、扣费和结算;K 线出现过某个价格不代表策略能在那里成交。
- 集合竞价集中确定开盘或收盘价格,连续竞价按申报持续撮合。价格优先、时间优先意味着涨停价排队也可能买不到。
- A 股股票通常实行 T+1,当日新买入股份不能当日卖出;回测必须区分可卖持仓和当日新增持仓。
- 涨跌幅、上市初期安排和申报规则会因板块、证券状态与历史时期不同。触及涨跌停不必然零成交,但一字板常使买入或卖出假设严重失真。
- 停牌会阻断交易,退市也不能按最后一个方便价格自动清仓;忽略它们会同时低估流动性风险和制造幸存者偏差。
- 不复权价格描述真实报价,复权价格用于形成可比走势。成交判断用真实报价,收益计算则要完整处理分红、股数变化和现金流。
- 佣金、印花税和过户费只是显性成本;滑点、冲击成本与流动性决定大额订单能否实现纸面价格。
- 一个可信回测必须写清信号时点、下单时点、成交条件、数量取整、未成交处理、历史制度和完整成本。
下一章将以这些可成交、口径一致的价格和现金流为基础,学习简单收益率、复利、波动率、最大回撤以及风险调整后指标。只有先保证交易过程真实,收益与风险的计算才有经济意义。