两次股票回测日期不同怎么比:同时报告全期与共同区间
两份起止日期不同的股票回测,回答的是不同历史问题。保留原全期报告,再用共同输入覆盖和账户初态建立新的共同期实验。裁剪净值后都归一化为一,不一定消除原持仓、费用和累计资本的影响,不能冒称已按相同条件重跑。
本文交付全期与共同期双栏、排除会话清单和重启状态。标准库样例使用合成索引和一股目标,属于外部比较方法,不验证CoTrading功能;只处理一个市场和币种,不把不同市场日历简单拼接成共同机会。
查实际覆盖,不只看标题日期
取得每次消耗的会话键、信号资格、首个可执行成交、最后估值与未解决订单。标为一月至三月的报告,也可能因热身、缺报价或停牌只有部分可用观测。先查实际机会,再说两次日期有交集,不能只用页面起止文字判断。
保留原策略、配置、数据、费用和初始状态。不同策略可以比较,但共同控制要说明。重建共享历史时,不要悄悄把旧股票池替换成今天仍存续的成员,那样改变了历史研究对象,不只是日期对齐。
backtesting.py API文档介绍初始现金、指标热身和执行时序,说明日期标签之外还有这些控制。本文自行实现简化重启,不证明产品能从任意快照恢复任意策略,真实接口的支持范围仍需另查。
计算共同日程与排除项
对实际合格会话取交集,保存仅A、仅B和共有的日期。交集为空就拒绝共同期排名。分别年化不可能制造双方都没有同时观察过的行情,不能因为最后都变成百分比就称为相同环境比较。
说明缺口处理。本例交集为连续索引二至五;真实市场可能不连续,要遍历核验后的共同日历,或拒绝当前实现不支持的缺口。不能只取最小最大值就循环,把中间原本被排除的会话又悄悄加回来。
保留计算指标需要的更早历史。某日不计分,不代表应从信息输入中删除;反过来,保留历史也不自动继承其交易。信息历史与账户历史是两个政策。上一期已知信号能否在共同起点成交,也必须按固定时序确认。
冻结共同账户初态
本文在共同首个可执行会话之前,统一现金一千、持股零、待单零,零费用、一股目标。真实研究还需统一费用表、仓位、手数、撮合与末期估值,不能只让第一行净值相同,而账户实际承担不同风险。
若问题要求继承持仓,应定义一份共同快照及出处,再让两个策略一致承接。不能各带原来累计资本和仓位,仍称同起点实验。换初态政策就是换问题,应另标实验,不能和本文平仓重启结果混排。
边界订单也要记录。共同开始之前已经知道的信号,按规则可以在开始执行;旧运行已成交的订单,不能无依据重复成为新成交。保留原信号身份与新执行身份,解释重启产生的订单来自哪里,避免重复计账。
主例:两份不同全期运行
价格索引零至五为[100,110,90,95,105,100]。在成交索引t,前一期价格达到阈值就目标一股,否则零;按当前位置价格交易股数差,再估值。信号使用此前已知价格,没有用未来成交价决定目标。
A阈值一百,运行一至五,先在一百一十买入,后来九十五退出,期末九百八十五。B阈值一百零五,从二开始,在九十买、九十五卖,按原期间期末一千零五。后续买入若在最后同价估值,不立即增加利润,但剩余敞口仍保留。
| 实验 | 计分索引 | 初始资本 | 期末权益 |
|---|---|---|---|
| 原A | 1至5 | 1000 | 985 |
| 原B | 2至5 | 1000 | 1005 |
| 共同期A | 2至5 | 1000 | 1005 |
| 共同期B | 2至5 | 1000 | 1005 |
A原全期亏损和B原全期盈利,仍是各自实验的有效描述,不因共同期增加就删除。排除账显示A独有索引一,B没有独有会话。原A承受较早入场价格,这正是原比较需要保留的差异,而不是后来可以改写的错误。
从声明状态实际重跑
共同账户在二之前平仓开始,两规则都看到前价一百一十,按九十买入,之后九十五退出,共同期末都一千零五,即百分之〇点五。在其他路径上两阈值可能不同;这里只是在当前输入上得到相同共同结果,不能推广为策略等价。
shared = sorted(set(a_sessions) & set(b_sessions))
if not shared:
raise ValueError('no common period')
common_a = run(shared[0], shared[-1], threshold_a)
common_b = run(shared[0], shared[-1], threshold_b)
代码依赖本例已验证的连续日程,账户函数显式恢复现金与股数,再逐次形成目标和成交,没有借旧净值,也没有事后减早期利润。真实日历扩展时,应把共同会话清单直接传入执行,不应忽视不连续情况。
末值对剩余证券一致估值,不能丢弃。真实强平及费用政策也应相同,一份报告忽略未平仓,会再次造成输入不一致。共同起点只解决一部分比较条件,并不自动保证终点处理已经一样。
反例:归一化不是新执行
原A在索引二已持有一股,成本一百一十,按九十估值后权益九百八十。裁剪后以此为基数,得到985/980−1,约百分之〇点五一〇二〇四〇八。重启账户从一千开始,重新按九十买一股,结果严格为百分之〇点五。
两数接近但不同。归一化缩放的是继承路径,没有执行新初态。加入费用、杠杆、整股或更大原敞口后,差别可能更大;原理不取决于本例差额是否显眼,不能因为小就把两种操作混称重跑。
代码断言原全期与重跑准确末值,并在约定容差下确认裁剪比率不等于零点〇〇五。另一个反例让两日期集合不相交,在任何运行之前就拒绝排名。这是覆盖失败,与账户边界不一致属于不同机制,都需要保留。
发布双栏并标清解释
原全期和共同期结果各有日期与运行引用,同时展示,不能用新版覆盖旧版,也不应说共同结果“纠正”了原A亏损。两者回答的期间问题不同,原结果仍有其历史含义。决定偏好哪一个,应与研究问题一致。
年化指标、交易次数和回撤分别从各自声明区间重算,显示样本量和频率。把短期结果乘一个时间因子,不会变得和长历史同样有信息。两策略共同期一致,也不证明其他期间一致,需要按新输入重新运行。
共同期来自已经观察的报告,属于历史分析,不自动是新留出。如果看完这张表才选策略,后续研究要保留选择历史。不能把旧数据重新切一次,就宣传独立样本外确认;信息是否被看过,不由文件名或日期筛选函数决定。
导出重启状态和排除证据
交付包括原覆盖键、共同键、各自排除项、初态现金股数待单,以及首个共同期信号和成交。核对A旧路径在二时的九百八十与新账户一千,能直接说明为什么不能复用。检查者应能逐行解释哪笔旧交易没有继承、新交易为何需要产生。
真实系统若无法清理或重新定义待单,应停止宣称同条件重启,记录接口限制。可以另做继承路径对照,但不能把能力不足藏在图表归一化之下。策略若使用账户历史特征,也要规定是否重置这些状态,不然现金相同,决策内部记忆仍可能不同。
输入更新后还需检查共同集合是否改变。新增一日历史可能改变热身资格,恢复报价可能补回原缺口,都会形成新版共同实验。保留变更清单,避免旧结果与新覆盖指标混在一起,让差异看起来来自策略而非可得数据。
运行与验收
下载完整示例。使用Python 3.12或更新版本,运行python R621.py。标准库断言核对原末值九百八十五和一千零五,共同会话[2,3,4,5]、重启末值均一千零五、裁剪A比率百分之〇点五一〇二〇四〇八,以及无交集被拒。
验收要求共同输入、初态、费用和终点政策符合问题,排除日期保留,两份旧报告和新成交账都可查。覆盖、数据、策略或重启政策变化后重新比较,保留旧版,不混用分数。本文检验合成覆盖和账户重建,不认证真实历史股票池、行情可得性或未测试引擎能力,也不提供未来收益结论。
常见问题
裁剪再归一化就是同起点吗?
不是。可能保留新政策不允许继承的仓位和资本影响。
无共同会话怎么办?
拒绝共同期排名,原各自历史摘要仍可清楚标注后展示。