跳到正文

研究指南

股票回测与实验

停牌股票为何净值还在:区分回测估值前填与可成交行情

股票没有可成交bar时,回测权益里仍可能保留它的价值。所有权没有消失,估值政策可以沿用最后观察收盘,但旧标记只是会计输入,不是新市场观测。待卖订单仍须等待符合条件的原始行情,不能因为估值表已经前填,就把旧价当成新的交易机会,更不能据此声称停牌风险已经处理完毕。

本文用一个合成账户,把原始观察、估值标记和执行判断分成三条链。本地参考引擎静态代码有不同的交易与估值视图,但独立标准库夹具没有运行它。CoTrading的精确缺bar处理和停牌数据集成仍为规划或待核实。这里验证声明机制,不提供真实历史停复牌业绩。

缺资料不能直接判定正式停牌

股票缺一行可能是休市、停牌、尚未上市、供应商中断或下载不完整。市场日历可以解释部分情况,却不能给每个个股缺口确定原因。没有外部状态证据时保留未知,不能因为价格表稀疏,就编造一个正式停牌标签,再把后续计算称为已经使用交易所事件资料。

Investor.gov停牌与延迟说明介绍监管及非监管情形与交易所决定,为实际市场提供背景,不是稀疏CSV的自动分类器。真实诊断应把带日期的证券身份与正式状态证据连接,同时独立记录下载bar是否存在,两类证据不能互相替代。

本例四个索引是已经给定的共同会话。A在零期有原始bar,一、二期缺行,三期重新出现。缺口成因没有指定,不假装已经下载到正式停牌和复牌记录。后来bar只说明在夹具里资料重新可用,不独立证明交易所已经发布某个具体恢复交易公告,也不能据此推断缺口期间的真实可交易范围。

三条序列分别保留权限

原始序列保持缺行状态,不先填平。有效观察要求开盘与收盘有限且为正,成交量有限且非负。估值序列只向前携带最后有效观察收盘,并记录按给定会话计的年龄,不向后借未来值。因此从未有过观察的股票,标记仍未知,不能用后来的第一笔价格反填到之前。

执行序列要求当前请求会话确有有效原始bar,且本保守政策要求正成交量。零量且价格有效时,观察存在、估值可以更新,但不能执行。零量与缺量、非法量不同,任何一种都不能因为账户急于退出,就被加工成一条正量行情。实际零量字段的含义也应先核供应商约定,而非一概当作交易所规则。

脚本采用Python Decimal文档中的有限数检查。开盘为None、NaN、无穷或无法解析的内容,会使bar验证失败,不产生订单。十进制计算便于手工核账,却不能补回缺失观察、证明市场状态,也不能保证每条正量日线都足以在现实中获得给定成交。

先重建持仓估值为何没有消失

账户初始现金一千、零股、没有历史标记。零期原始开盘十、收盘十、量一百,以十买四十股、费用一,现金599、库存四十,估值标记十、年龄零、权益999。开仓后比初始资本少一,准确来自完成买入的费用,不能把这笔成本留到未来某个缺行情日才扣。

一、二期退出条件都请求卖出,但原始bar不存在,两次均拒绝,没有订单、佣金或库存变化。现金始终599、股数四十、累计费一,标记仍十,年龄分别一和二,所以会计权益两行都为999。这条平线反映陈旧标记政策,并非观察到股票真实市场收益为零,也不是已确认能够按十变现。

拒绝状态和估值字段应一起展示。只画权益,会看不到请求为何未退出;只给拒单,又看不到账户仍然拥有资产。股数、原始行存在、报价年龄、现金与权益说明不同环节,不能压成一个可用标记。特别是净值平稳时,年龄上升提示的是观测不确定性,而不是风险已经下降。

新bar出现后执行并解释跳变

三期给定原始开盘八、收盘八点五、量一百,仍然要求退出的订单按开盘八卖四十股,扣费净收319。最终现金与权益918、零持仓、累计费用二。当天收盘八点五成为新鲜估值观察、年龄归零,但此时已经没有股份由这个收盘标记估值;它不能替换更早实际开盘的卖价。

账户从旧标记权益999变成清仓现金918,下降八十一。其中四十股从旧标记十到实际执行八损失八十,退出费用一解释剩余部分。不要用后来收盘八点五来缩小开盘损失,标记更新和订单执行是两个有先后顺序的事件。输出时间和字段语义应让读者能够直接检查这种区别。

完整现金桥为一千减401加319等于918,价格损失八十、费用二。缺口期间没有隐藏资金转移。若因缺bar先把股票价值置零,后来再把同样股份恢复,就会制造另一种与所有权和成交无关的跳变;库存不能由行情覆盖状态决定存在与否,估值未知也不等于股份为零。

用伪造bar控制暴露错误机制

故意错误的控制在一期把最后估值十复制成开盘与收盘,并伪造正量,于是以十卖出四十股,最终现金998、费用二,比合法原始bar路径高八十。优势完全来自编造了低价重新出现之前的成交,不是选股更准确,也不是一种更可靠的缺失资料处理策略。

同一个前填操作用于估值可能有声明理由,传到执行层就可能越权。列名叫已补价格,不能告诉下游哪一种用途得到授权。正式路径从不进入造bar分支,断言要求两条缺行都没有订单,并在三期按八卖出。这个反例改变的是执行证据,而不是只给成功路径换一个不利价格。

真实管线可以通过原始观察掩码和不可覆盖的来源编号实现结构隔离,不让会计序列写回市场表。若后来补数,先保存新来源和取得版本,再分别比较原始行、可执行条件及订单变化。今天供应商回补一行,也不能单独证明当时账户已经拿到或能够按该价成交。

从未观察与新鲜零量另行检验

独立控制声明已有四十股,但整个两期窗口没有任何价格。股票标记和总权益保持未知,库存仍四十。不能记零价值、向未来借价或删除所有权。这检验的是报告资料不完整,不是在估计资产真实价值;真实研究若需要替代估值,应另列方法、来源和不确定性,而不是混入可成交bar。

另一个控制提供新鲜价格但成交量零,年龄归零,卖出仍被阻止,四十股继续保留。新鲜与可执行不是同一个条件,最近收到一个值,并不自动授权交易。这个政策只是本夹具明确选择,不声称所有市场的零量数据都有相同含义,也未实现集合竞价、盘口深度或实际部分执行。

例子分别测试非法开盘,截取前三行后账本与完整运行前缀完全一致,末行不强平。把未来重新出现的开盘改成一百,也不能改变此前两次拒绝与旧标记。这样可防止未来资料与数据截断倒过来制造历史成交,不把两种不同边界只靠一次最终余额检查带过。

运行后定位真正交接边界

下载完整示例,使用Python 3.12及以上执行python R602.py,只需标准库。原始数据、请求和价格均为合成,输出正式账本、伪造控制、初始无标记及零量控制,不连接交易所、状态供应商、券商或产品服务。缺口原因在输出范围内仍然未知,不因代码运行就升级为已核停牌。

诊断实际运行时,导出原始行、对齐会话、估值前填结果、报价年龄、待执行请求和实际订单,找出缺行第一次变成可执行的地方。没有证据的成因继续保持未知。正确携带估值能保留所有权可见性,却不能认证清算价值、消除停牌风险或证明全部停复牌都已建模,交接报告应把这些不同结论分开。

无初始标记控制从给定已有持仓状态开始,现金599不代表本窗口又完成一次买入,费用零也只指该短窗口没有成交。它专门检查未知估值是否错误清空库存,不参与主例的收益比较;真实账户需另接进入流水,不能把不完整状态控制当作完整历史业绩。

常见问题

净值不变是否表示股票真实平价交易?

不是,本例可能只是把旧观察标记带过缺行,会话年龄会揭示这种限制。

前填收盘能否执行待卖单?

本契约不能,必须有当前有效原始bar并满足声明执行条件,否则现金和股数不变。

相关阅读