跳到正文

研究指南

股票组合与模拟研究

模拟策略没覆盖自己买的股票:检查测试股票池的范围与盲区

固定模拟篮子可能从未观察你日志中的某只股票。因此输出里没有它,不能证明规则拒绝该笔交易,也不能证明当时没有机会。比较信号之前,先用证券身份、生效成员和可用观察建立覆盖台账,不能只对显示名称,更不能只看最后成交名单。

本指南把五条合成请求与一个有版本的双股美元篮子比较,不读取用户日志,也不扫描市场。覆盖核对是外部方法,不证明 CoTrading 已有任意股票池选择、全市场观察或持续监控服务。固定篮子和有限观察区间始终是结论的一部分,不能在摘要里省略。

先取得实际观察范围

取得实验真正使用的篮子、版本、生效时间与市场币种约定。计划笔记里的建议股票列表,不证明某次运行已经消费该列表。应保留运行引用或本例明确输入,与成员快照并列,让他人能够独立重建覆盖范围。参考小篮子不能默认解释成可配置的全市场证券库。

合成篮子中,A 从二〇二六年一月一日生效,到一月五日之前结束;B 从一月三日生效,到一月六日之前结束,时间统一使用 UTC。这些是虚构证券和日期,不代表真实股票支持清单,不构成推荐,也没有声称日期恰好属于某个交易所的开市会话。

日志侧输入应为待核对证券与观察时间列表,不能只保留已经匹配的模拟交易。篮子外请求也要保留,否则正好隐藏本题要查的盲区。若只从未来赚钱的交易开始核对,覆盖分母还会依赖结果;报告必须说明请求集如何形成,而不是把五条示例当成完整市场。

先解决证券与时间身份

使用能区分市场、股份类别及必要币种的规范证券身份。夹具只使用精确 A、B 键,并拒绝空身份。真实别名映射需要独立确认,类似公司名称或代码文本不代表同一上市证券。身份未知属于输入问题,不能写成规则已判断不买,也不能把未识别上市地自动分到默认市场。

Python datetime 文档区分带时区与不带时区时间。本例要求明确偏移。一月一日 08:00、偏移 +08:00,与该日 UTC 00:00 是同一瞬间,成员结论一致。不带偏移的时间会报错,不能按研究者电脑的本地时间猜测,更不能事后选择有利于匹配的时区。

这种时间比较不等于交易会话对齐。真实日历、节假日、盘中截止和数据可得延后,需要另一层输入准备。样例只回答一个瞬间是否处于声明成员区间,不证明价格可成交或市场当时开门。日级日志若只给日期,也应先制定明确解释,不能把缺失时刻伪装成精确时间。

明确成员边界政策

区间包含起点、不含终点,这能让恰好交接的瞬间只归属一个有效区间。提供的每段区间长度为正,同一股票没有重叠范围。真实导入器也应带着这些检查,不能依赖图表日期看起来有序。重复或重叠区间一旦出现,应先处理成员来源冲突,再计算覆盖。

边界约定改变会改变结果。A 在一月五日 UTC 零时的请求已经区间外,即使一张旧成员清单仍有 A。复核时应使用当时对机会生效的版本,不是后来正在使用的列表,否则历史覆盖范围会在已知结果后静默扩大。新增成员的观察不能自动补写此前未覆盖期。

Python hashlib 文档支持为序列化篮子建立摘要。程序核对分类过程中成员表示没有变化。这只是内容身份,不是可信冻结时间的认证;生效证据和审批仍应另存。摘要变化时也要检查具体差异,不能只用一个新哈希取代旧范围说明。

成员通过后再核对观察可用性

成员资格和行情可用性是两个关口。已覆盖股票缺报价时返回 covered_quote_unknown,不借另一股票价格、不把后来报价往前搬,也不假设零收益。有限正报价只让请求在这个小夹具中可观察,不代表交易条件成立,更不代表交易已经可执行。

有效成员的 NaN 或非正报价属于无效输入,会拒绝。处理顺序也有意义:篮子外股票的报价不会拿来制造篮子内机会。应保留这些范围外行,并说明验证全部来源报价属于另一项数据质量任务,不能把未运行的验证包装成策略已经拒绝该证券。

完整流程还应区分特征历史缺失与当前报价缺失。两者都可能阻断规则评价,补救方式却不同。本例只有一个报价字段,没有完整特征可得引擎。以后增加财务或新闻条件,也要附各自可得边界,不能继承股票在篮子内这一事实,便声称当时所有条件都已知。

逐条阅读五个请求

A 在一月二日请求时成员有效,报价 100,返回 observable。B 同日在一月二日请求,但要一月三日才加入,所以是 outside_effective_interval。C 在一月三日请求,从来没有成员记录,返回 outside_basket。这些结果都发生在规则比较之前,不能改写成策略选择不同。

B 在一月三日已是成员,但报价 None,返回 covered_quote_unknown。A 恰好在一月五日终点请求,又得到 outside_effective_interval。五条中只有一条可观察,两条区间外、一条篮子外、一条行情未知,总状态数仍勾稽为五。输出没有把缺失和不覆盖压成同一个“没交易”。

一比五只描述这个输入请求集,不是全市场机会覆盖估计,因为请求并非完整的交易所证券与会话总体。程序明确打印 rule_rejection_count=not_inferred。四条不可用请求不能标为规则主动拒绝,可观察的那条也尚未经过策略判断。覆盖率、触发率和成交率应使用各自清楚的分母。

用独立边界挑战分类

等价时区测试保持证券和价格不变,只检查时间解释。精确终点请求检查区间政策,B 缺报价则在成员为真时检查数据可用性。这些是不同机制,只验证 A 名字存在的测试会漏掉全部差别。主例和反例应一并交付,不靠某一个成功匹配宣称核对完整。

程序另行拒绝无时区时间及有效股票的 NaN 报价。不要将它们替换成方便的未覆盖状态,因为来源错误与证券确实不在范围内是不同证据。修复需要记录输入修订并重新运行,不能只编辑汇总计数。原失败记录也应保留,供复核者判断覆盖变化究竟来自哪里。

若后续真的扩大篮子,应建立新的生效版本,并说明旧盲区从何时开始可观察。不能因为看到了被错过的赢家,补入证券后回头声称旧策略本会捕获它。新范围可以支持新的观察实验,却不能替换旧范围的结果,这一点也适用于人为挑选的液性参考股票。

运行与交接覆盖台账

下载完整示例,保存 R642.py,以 Python 3.12 或更新版本运行 python R642.py。程序只使用标准库、合成成员、请求及报价。断言验证五个状态和计数、时区等价、无时区拒绝、非有限报价拒绝与篮子内容未变,不访问凭据或行情服务。

交付可观察证券列表、排除请求及理由、篮子身份、边界约定与未解决数据。下一阶段机会匹配器应先消费这张台账,避免把范围缺口归为人的执行偏离。报告可以展示简短摘要,但须能回到逐条请求,而不是只留一个覆盖百分比,让未覆盖原因在汇总中彻底消失。

审核摘要时还应确认请求时间没有被后来成交时间替代。一个真实买入发生得较晚,不代表此前应触发的观察已经处于新篮子内。机会时点、实际成交时点和成员生效时点分别保留,才能解释是范围改变、行情缺失还是交易者动作不同。本例只处理声明时点,不作这些额外因果推断。

可复用的更新检查可以先比较旧新成员差异,再验证生效区间,最后重跑请求分类。只有成员证据改变的行才解释为范围更新;行情修订造成的变化应单独注明,不能合并成“模型表现改善”。这样的变更说明让下游匹配报告能够使用正确版本,也防止分类修复被误读为新的盈利能力。

常见问题

篮子外是否代表策略拒绝这只股票?

不是。声明范围内没有观察它,规则拒绝必须有实际计算过的条件依据。

成员有报价就保证产生信号吗?

不能。observable 只通过当前覆盖检查,规则所需输入与条件还须独立评价。

相关阅读