跳到正文

研究指南

股票回测与实验

股票策略加的过滤条件有用吗:逐块关闭再比较

股票策略增加过滤条件后,开发表现可能改善,但可观察机会也同时改变。检查其作用,应先证明模块化实现与原基线等价,再关闭一个声明模块,在相同条件下重跑。先匹配机会变化,再解释最终净表现,不能只有两个收益数字就宣称独立贡献。

本文交付开关矩阵、新增/消失/改期交易表和合成结果。方法属于外部扩展,不证明CoTrading已有模块系统。单市场、单币种,输入是人工指定的入场前过滤标记与虚构后续回报,不是实际扫描器或历史盈利研究。

按可执行边界定义模块

写清核心信号、每个过滤器的输入、信息截止、输出和缺失政策。成交量与趋势各有明确开关,不能叫“关成交量”,却同时修改核心阈值、股票池或仓位。字段名称相同,也不代表过滤器内部规则相同,模块版本要保存。

已有策略是单体时,先改成全开等价模块,固定输入后比较信号、目标、成交和账户。重构本来就变了行为,就不能把接下来差异只归于一个过滤器。保留原实现作为参考,尤其检查缺失值和异常分支,而不只核验几条普通正信号。

backtesting.py策略文档介绍逐步数据可见与回调,提示过滤输入必须在其影响的决策前可得。本文使用声明的合成标记,没有执行该库,也没有验证产品接入;真实过滤器需要另查数据时点,不能直接把当天收盘成交量用于当天开盘选择。

冻结控制和开关矩阵

目标模块之外的代码、数据、期间、费用、初态、执行和仓位都固定,每个变体另列许可变化。单项消融相对基线只改一个开关,同时关闭两个是另一干预,应从本次比较拒绝,不能靠名字仍称单项。

基线打开成交量和趋势,V只关成交量,T只关趋势。核心在过滤前接受五个预定机会。每个获准机会代表一个按顺序发生的单位敞口持有期,费用零,资本按获准回报连乘。信号身份与后续结果分列,过滤规则不读取待评价回报。

这些假设排除了现金竞争和重叠持仓。真实多仓组合要完整重跑,因为新增交易可能占用资金并挤掉后面交易。只对旧已完成交易表删行,不能复现这个机制;过滤器影响机会进入执行,但最终成交仍取决于账户和市场约束。

验证全开基线等价

五个记录包含身份、入场前已知的两个布尔标记和后来回报。原基线是两个条件同时通过,模块执行全开后必须得到相同机会身份,代码实际断言,而不是假设重构天然无害。只有比较通过,才继续解释关闭模块的变化。

保存重构前引用及预期结果,缺失和失败处理也要对照。一边把缺失当拒绝、一边当通过,即使正常行一致也已经改了基线。看见这种差异,应先修正模块边界并重新验收,不要带着不等价基线继续生产收益差表。

基线冻结后只保存同一份参考,不应每跑一个变体又偷偷修改基线。如果公共代码改变,整份对照上下文作废重建,并保留原记录。运行次序和版本引用应能证明所有变体面对的是同一组共同条件。

五个机会的主例

机会成交量门槛趋势门槛后续回报
1通过通过正2%
2不通过通过负3%
3通过不通过正1%
4通过通过正4%
5不通过不通过负1%

基线只保留一和四,1.02×1.04−1为百分之六点〇八。关成交量新增二,1.02×0.97×1.04−1为百分之二点八九七六;关趋势新增三,1.02×1.01×1.04−1为百分之七点一四〇八。不是简单相加,因为资本按期间复合。

机会五在两个单项变体中仍被另一开启过滤器拒绝。这说明消融效果有条件性:必须在剩余规则不变的背景解释,不能把观察到的差额当作过滤器独立、普遍的未来因果价值。其他输入路径可能得出不同结果。

先按机会匹配,再看总额

使用稳定机会或信号身份,连接入场退出时点。仅变体存在为新增,仅基线存在为消失,两边同身份而时点不同为改期。真实账还要数量和价格,才能把改期与缩量分开,不应只靠临近日期找一笔看起来像的交易。

added = sorted(variant.keys() - baseline.keys())
removed = sorted(baseline.keys() - variant.keys())
retimed = [key for key in baseline.keys() & variant.keys()
           if baseline[key]['entry_exit'] != variant[key]['entry_exit']]

本例机会独立,V只新增二、T只新增三,消失和改期集合都为空,也明确报告。不能推断所有真实消融只能增加交易,资金、冷却期或退出变化可能删去或改期后续机会。若目标改变但无法成交,还需单列未执行原因。

完整例另外改变一个匹配基线机会的退出时点,断言识别为改期,而非一笔新增加一笔消失。它检验匹配器,不假装主例过滤器自然产生了改期。主例结果与独立工具反例的用途应分开说明,避免混合两个输入讲故事。

反例:多个模块一起变

同时关成交量与趋势被守卫拒绝,因为相对基线有两个变化。不能只给变体起其中一个模块名字来规避。后续确实想做多模块实验,也需要自己的设计与解释,不应在当前单项表中混入,然后宣称单一条件起作用。

换股票池、降低费用或改变初始现金,同样不是干净的过滤器消融。先查控制引用,再归因;必须纠正输入错误时,基线和变体都在新共同上下文重跑,保留旧比较,不能只重跑结果不满意的一边。

变体失败或缺输出保持不可用,不把执行错误当零收益,也不从开关矩阵删除。表中写清哪些实际运行、哪些无法检查交易变化。完整性本身是一道验收门槛,最终收益方向不能弥补没有跑完的事实。

解释开发结果的范围

合成路径中关成交量变差,关趋势变好,描述的是这些机会和零成本假设,不证明成交量对未来收益有独立因果影响,也不等于应该从真实策略删趋势。样本很少、路径已见,任何后续选择都需要记录探索历史。

scikit-learn评价指南说明用评价结果调整选择的风险。消融如果指导新策略开发,保存全部尝试,为最终版本寻找新的独立证据。继续使用相同有利开发路径,不会因换一个开关名称就变成确认。

除利润外,还要看机会数、敞口、成本、集中与不完整交易。过滤器可能把活动压得很少,漂亮百分比只靠一两次观测。把这些操作差异放在收益旁边,读者才知道比较的是更好筛选,还是机会和资本使用方式改变。

交付逐次干预账

每行保存基线引用、变体开关、唯一许可变化、运行身份和交易匹配输出。新增交易应能追到原本被哪一个模块挡住;仍被挡住的机会五也保留理由,避免只展示被接纳者,误以为观察了全部信号域。

真实策略模块没有现成开关时,需要先做等价重构,其验证也属于交付,而不是默认已经完成。本文手工布尔标记不提取真实成交量或趋势,只验证模块控制与机会账。拓展到实际指标后,需要再检查阈值、缺失和时点,不能继承本例的等价结论。

机会身份也不应按是否盈利重建。若只有赚钱往返被保留,消融新增的亏损机会二就可能消失,收益差额无法解释。先冻结全机会清单,再执行模块判断,能让拒绝与接受都留下记录,也便于追查样本选择问题。

运行与验收

下载完整示例。使用Python 3.12或更新版本,运行python R623.py。标准库断言全开基线等价,三结果为百分之六点〇八、二点八九七六和七点一四〇八,新增二/三,改期识别正确,并拒绝双开关干预。

验收要求基线等价、每变体只改目标、每笔变化可匹配或解释。归档开关、输入时点、共同控制、交易差异和全部结果。模块、数据、执行、费用或账户政策变化后重建,保留旧包。本例不验证真实过滤器、通用模块化工具或产品端到端能力。

常见问题

能从收益差推断过滤器独立因果价值吗?

不能。差额以剩余策略、输入和执行假设为条件。

关闭过滤器只会新增交易吗?

真实有状态组合不一定,新增活动可能改变现金、持仓与后续时点。

相关阅读