Skip to content

第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. 当日买入后即使价格急跌,也不能靠卖出这笔新持仓立即退出。
  2. 日内最高、最低价不能被随意组合成“低点买、高点卖”的回测路径。
  3. 调仓程序必须区分昨日可卖持仓与今日新增、尚不可卖的持仓。

若策略原本持有 1,000 股,今日又买入 500 股,通常仍可卖出原有的 1,000 股,但不能卖出今日新增的 500 股。回测若只保存合计持仓而不记录持仓批次,容易错误放大可卖数量。

涨跌停限制价格,却不保证成交 ​

价格边界因板块和证券状态而异 ​

涨跌幅限制通常以前一交易日收盘价为基础,结合除权除息等情形计算当日价格边界,并按最小价格变动单位取整。常见制度可用下表建立直觉,但历史回测必须使用当日、当证券实际适用的规则,不能用今天的规则覆盖全部历史。

市场或状态常见日涨跌幅限制研究时特别注意
沪深主板普通股票10%风险警示、新股初期和特殊交易日可能不同
创业板、科创板普通股票20%制度启用日期不同,不能把 20% 回填到更早历史
北交所普通股票30%流动性与投资者适当性也不同于沪深市场
沪深主板风险警示股票通常为 5%创业板、科创板及特殊情形不能机械套用此值

注册制下沪深新股上市后的若干初始交易日,以及北交所新股上市首日,可能不设通常的日涨跌幅限制,并配套盘中临时停牌等机制。退市整理、重新上市或交易所认定的其他特殊情形也可能采用不同规则。策略应维护随日期生效的规则表,而不是只写一列 is_limit_up 后假定其算法永远不变。

“触及涨停”不等于“不能买”,一字板才暴露出极端情形 ​

股票到达涨停价后,仍可能有卖单进入并成交;跌停时也可能出现买单。因此,仅凭收盘价等于涨停价,就把全天所有买单判为无法成交,会过度悲观。真正需要模拟的是订单进入时的价格、队列和对手盘。

一字涨停通常指开盘价、最高价、最低价和收盘价都在涨停价附近,全天几乎没有更低价格;一字跌停则相反。它们揭示了日线回测最常见的失真:

  • 策略在一字涨停日按涨停价买入,但盘面可能只有大量封单、几乎没有卖量,现实中排队也买不到。
  • 策略在一字跌停日按跌停价卖出,但可能没有足够买盘,现实中无法退出。
  • 用“当日成交量大于零”就认定自己的订单全部成交也不够,因为少量成交可能发生在长队列前方,且轮不到策略订单。

因此,日频回测至少应把停牌、开盘即封板、下单时点处于价格边界、成交量过低等情形列为不可成交或保守成交;更精细的研究需要分钟或逐笔数据估计实际可成交数量。无法成交的订单应按事先规则延期、取消或部分保留,不能在事后挑选对收益最有利的处理方式。

停牌与退市会让退出通道消失 ​

停牌期间没有可供策略成交的市场 ​

停牌表示证券在指定时间暂停交易,原因可能包括重大事项、异常波动核查或上市状态变化。停牌期间价格不更新,不等于风险停止变化;公司和市场信息仍在累积,复牌后价格可能一次性跳变。

可信的组合回测应当:

  • 保留停牌前已经持有的股票,而不是按最后收盘价假装卖出;
  • 禁止新买入停牌股票,也不能用停牌期间不变的价格计算“低波动”并把它当成安全;
  • 明确停牌持仓的估值方法和现金占用;
  • 复牌后继续检查涨跌停和流动性,因为“恢复交易”仍不保证能够退出。

若停牌股票持续占用仓位,组合可能无法按目标权重调仓。实盘中其他可交易股票的权重会被动改变,这种偏离也应体现在组合净值和风险暴露中。

退市不是以最后一个方便价格自动清仓 ​

公司可能经历风险警示、终止上市决定、退市整理期以及摘牌等阶段,但具体流程取决于退市类型和当时规则,并非所有股票都有相同的整理交易安排。摘牌后,股份可能进入其他转让安排,却不代表仍能像交易所上市股票一样及时、足量成交。

回测不能因为历史行情在某天结束,就按最后一个收盘价自动卖出;也不能直接从样本中删除退市公司。前者可能虚构流动性,后者会制造幸存者偏差。合理做法是保留当时已持有的头寸,按照真实可交易阶段、价格和费用处理,无法可靠估计时采用明确且保守的损失假设,并单独报告其影响。

除权除息与复权价格 ​

价格下调不一定代表投资者亏损 ​

现金分红、送股、转增和配股会改变股票价格、股数或股东现金。除权除息是在相应权益生效时,对证券参考价格进行调整,使权益变化不会被误读为普通市场涨跌。

假设某股票股权登记日收盘价为 10 元,每股派发现金红利 0.50 元,忽略税费和市场波动,除息参考价约为:

Pex=Pclose−D=10−0.50=9.50 元

其中,Pex 是除息参考价,Pclose 是登记日收盘价,D 是每股现金红利。股价从 10 元变为约 9.50 元,并不表示股东凭空亏损 5%;股东同时获得了每股 0.50 元现金。实际开盘价由市场交易形成,税费、预期变化和其他公司行动也会使它偏离参考价。

送转和配股的参考价需要同时考虑股数变化、配股价格和配股比例。此处的关键不是背公式,而是始终把价格、持股数量、现金分红和认购现金流放在同一套账户中计算。

三种价格口径回答不同问题 ​

价格口径怎样处理公司行动造成的断点适合回答什么主要风险
不复权价格保留市场当时真实报价当时能否成交、涨跌停价是多少直接计算长期收益会把除权除息误当成价格损失
前复权价格通常保持最新价格不变,向前调整历史价格观察接近当前价格尺度的连续走势历史数值会随后来公司行动改变,不能充当当时真实成交价
后复权价格通常保持较早价格不变,向后调整后来价格展示长期持有的累计增长轨迹数值可能远离实际报价,不能直接用于下单或成交判断

“前复权一定用于回测、后复权一定用于研究”不是可靠规则。不同数据商对配股、红利税、再投资和复权因子的处理可能不同。稳健做法是保存不复权行情和逐次公司行动,以一致的复权因子计算连续收益,并核对总收益是否包含现金分红。

尤其要避免把复权价与真实交易规则混用:成交价、涨跌停价和订单金额应基于当时的不复权报价;收益序列则要正确计入分红、股数变化和现金流。若直接拿前复权收盘价判断历史上是否涨停,可能得到根本不存在的价格边界。

显性费用只是交易成本的一部分 ​

佣金、印花税与过户费的方向不同 ​

股票交易的显性费用通常包括以下几类:

成本常见收取方向计算基础回测注意点
券商佣金买入和卖出成交金额费率因账户与券商而异,常有单笔最低收费,必须使用自己的真实合同口径
证券交易印花税卖出卖出成交金额当前 A 股按卖出方向征收;税率和政策可能调整,应按历史生效日维护
证券交易过户费买入和卖出成交金额沪深市场现行标准通常按双向计收,具体市场和历史阶段需核对

截至本章编写时,A 股证券交易印花税常用现行口径为卖出成交金额的 0.05%,沪深 A 股过户费常用现行口径为成交金额的 0.001%、双向收取。佣金由账户约定决定,不能把宣传中的低费率直接套给所有投资者;规费是否已包含在佣金报价中也应向券商确认。上述数字用于说明量级,不应覆盖历史费率或替代最新官方规则。

若买入金额为 B,卖出金额为 S,买卖佣金率分别为 cb、cs,过户费率分别为 tb、ts,卖出印花税率为 d,暂不考虑最低佣金和其他费用,一次完整交易的显性成本为:

C=B(cb+tb)+S(cs+ts+d)

其中,C 是总显性成本。现实计算还要对每笔委托分别应用最低佣金、费用取整和不同市场口径。小额分散下单时,单笔最低收费会使实际费率显著高于名义佣金率;把一天的所有股票合并后只收一次最低佣金,会低估成本。

滑点是模型价格与实际价格的差 ​

滑点是策略假设的基准价格与实际成交价格之间的偏差。买入成交价高于模型价、卖出成交价低于模型价,都会侵蚀收益。它可能来自报价变化、报单延迟、买卖价差以及订单只能分批成交。

冲击成本更强调订单本身对市场的影响。若策略要在一只日成交额很小的股票上快速买入大量股份,主动吃掉卖盘会把后续成交价越推越高;卖出则可能把价格越压越低。资金规模越大、交易越急、股票越不活跃,冲击通常越明显,而且不是固定费率能够完整描述的。

流动性就是在较短时间内以接近当前价格完成交易、又不显著推动价格的能力。成交额高不保证任何时点都流动,日成交量也不能回答某一分钟有多少对手盘。评估可交易性时,至少应同时观察成交额、买卖价差、订单金额占同期成交额的比例、价格是否接近涨跌停,以及成交是否集中在少数时段。

一个简单的容量约束可以写成:若计划交易金额为 Q,同期市场成交额为 V,则参与率为

r=QV

其中,r 表示订单金额占同期市场成交额的比例。r 越高,订单越可能影响价格。但不存在对所有股票、行情和执行方式都安全的统一阈值;用全天成交额计算出的低参与率,也可能掩盖开盘几分钟内集中成交造成的冲击。

不同板块不能共用一套成交假设 ​

板块差异不只体现在涨跌幅限制,还涉及首次上市阶段、盘中临时停牌、申报数量、投资者适当性和盘后交易安排等。以常见竞价申报为例,沪深主板和创业板买入数量通常以 100 股为一手或其整数倍;科创板单笔申报通常至少 200 股,此后可按 1 股递增;北交所竞价交易单笔申报通常至少 100 股,此后可按 1 股递增。卖出不足最低申报数量的零股,一般需要一次性申报卖出。规则若有更新,应以对应交易所和交易日期为准。

这些差异会造成真实的组合偏差。假设模型要求所有股票等权,但账户资金较小,200 股科创板高价股的最低买入金额可能远高于目标权重;直接向下取整又可能变成零持仓。回测若允许买入任意小数股,就虚构了无法实现的分散化。

因此,每只证券每天至少应关联以下交易属性:

  • 所属交易所与板块,以及当日适用的涨跌幅规则;
  • 是否停牌、风险警示、退市阶段或处于新股特殊交易期;
  • 当日涨跌停价、最小价格变动单位和最低申报数量;
  • 当时可用的申报与交易时段;
  • 不复权成交行情、成交量和成交额;
  • 适用的费用、税率和公司行动。

历史制度会变化,所以这些字段应当带有生效日期。用一套当前参数回测十年前的数据,看似统一,实质上改变了当时投资者面对的市场。

把约束写进回测订单 ​

从本章开始,“买入某股票”应被改写成一条可以审计的订单规则。例如:在交易日 T 收盘后生成信号;T+1 参加开盘集合竞价;若证券停牌或买入订单无法在价格限制内成交,则本次取消;成交数量按申报单位向下取整,且不超过目标金额和设定的成交额参与率;按实际成交金额收取买入费用。卖出也要单独规定跌停、停牌、部分成交和 T+1 持仓限制。

下面这张检查表可以用于审查任何日频回测:

检查项必须回答的问题常见的乐观假设
信息时间信号所需数据在下单前已经可得吗用收盘后信息按当日收盘成交
交易状态当时是否停牌、退市阶段或受特殊规则约束行情缺失时仍按前收盘买卖
价格限制订单方向上是否存在涨跌停阻塞一字涨停能买入、一字跌停能卖出
成交价格基准价为什么能被策略获得默认所有订单精确按开盘价或收盘价成交
成交数量对手盘和申报单位是否支持目标数量允许小数股,或成交量很小时仍全额成交
持仓结算今日买入数量是否已经可卖对 A 股股票执行日内止损
成本是否覆盖双边费用、税、滑点和冲击只扣一个固定佣金率,忽略卖出税费和容量
公司行动分红、送配和除权是否进入账户把除息跌幅当亏损,或把复权价当真实成交价

约束的目的不是把所有回测都做成逐笔撮合,而是让模型复杂度与结论强度匹配。只用日线数据时,应承认无法知道队列位置,并采用一致、保守、可复核的成交规则;策略表现若只在最乐观假设下成立,就不应被视为可交易收益。

本章小结 ​

  • 一笔真实交易要依次经过信息可得、生成信号、报单、撮合、扣费和结算;K 线出现过某个价格不代表策略能在那里成交。
  • 集合竞价集中确定开盘或收盘价格,连续竞价按申报持续撮合。价格优先、时间优先意味着涨停价排队也可能买不到。
  • A 股股票通常实行 T+1,当日新买入股份不能当日卖出;回测必须区分可卖持仓和当日新增持仓。
  • 涨跌幅、上市初期安排和申报规则会因板块、证券状态与历史时期不同。触及涨跌停不必然零成交,但一字板常使买入或卖出假设严重失真。
  • 停牌会阻断交易,退市也不能按最后一个方便价格自动清仓;忽略它们会同时低估流动性风险和制造幸存者偏差。
  • 不复权价格描述真实报价,复权价格用于形成可比走势。成交判断用真实报价,收益计算则要完整处理分红、股数变化和现金流。
  • 佣金、印花税和过户费只是显性成本;滑点、冲击成本与流动性决定大额订单能否实现纸面价格。
  • 一个可信回测必须写清信号时点、下单时点、成交条件、数量取整、未成交处理、历史制度和完整成本。

下一章将以这些可成交、口径一致的价格和现金流为基础,学习简单收益率、复利、波动率、最大回撤以及风险调整后指标。只有先保证交易过程真实,收益与风险的计算才有经济意义。