跳到正文

研究指南

股票回测与实验

一只股票调出的参数能换股票吗:固定参数做迁移测试

参数在一组股票上选出来,并不意味着代码能接收别的代码,就已经验证所有股票。应在选参前保留目标组,把候选参数冻结后原样运行。无交易、缺输入和执行失败股票都留在表里,最终报告才描述原先保留的组,而不是只剩下成功者。

本文建立开发组到迁移组的运行账,限制在同一市场与币种。标准库小实验使用虚构会话回报,不是真实证券历史。方法属于外部研究流程,CoTrading能力仍为规划或待核实;一次迁移也不能建立全市场适用性。

先明确迁移的对象

冻结策略公式、参数值、输入变换、评分期间、费用、成交时点与账户假设。这些应共同迁移。只保留一个周期数字,却改变复权或缺失规则,就不能单独判断该参数对其他股票是否适用。真实引擎版本也应相同,避免把兼容变化混入迁移结果。

把问题收窄为:在相同协议下,开发组选出的候选,在事先指定目标组是否仍满足约定条件。不能顺势外推到未测试市场、币种或流动性环境。迁移失败能够说明当前候选与范围的关系,不代表整个策略家族从此都不可能有效。

跨股票迁移与时间留出也要分开。同一历史日期上的两组股票共享市场环境,回报可能高度相关。股票组隔离不等于未来证据。如果两种隔离都重要,应同时设计证券与时间边界,不能拿一种替代另一种,或者把同一行情中的多股结果当作多次独立预测。

在看目标表现之前保留名单

保存开发和目标清单、稳定证券身份、成员生效日期与选择理由。按约定分组层级确认交集为空。不同股票代码或股份类别,也可能属于同一发行人或经济敞口;代码字符串不同不一定满足研究需要的隔离。映射有缺口时,保留待核实,不应自动当作不同主体。

GroupShuffleSplit官方文档介绍按组分离,并指出多次随机折的测试组未必互不重叠。本文只用一份固定保留组,不做反复随机切分。来源支持分组的概念区别,并不认证股票之间具备金融或统计独立性。

解释表现之前,比较两组历史覆盖、上市时长、报价缺失和复权政策。目标股历史不足,应该保留明确输入失败。看到结果不好后换一只更容易的股票,会改变保留组。确实需要替换时,先规定规则,保留原始排除清单及原因,不能只展示后来满意的名单。

只在开发组选择参数

合成规则观察上一期已经完成的开盘至收盘回报。如果该特征严格超过阈值,本期开盘建立单位敞口,收盘退出,否则空仓。费用零,比例敞口为数学简化,因此下文交易次数指一周期往返,不是原始成交行数;一次活跃往返在真实账中通常至少有进出两腿。

阈值候选为零和百分之二。开发股DA回报为[0.03,0.04,-0.02,0.01,-0.03],DB为[0.03,0.02,-0.01,0.01,-0.02]。对每个候选分别计算两股复合结果,取描述性分数之和,较高者胜,同分选较小阈值,实际选出百分之二。

scikit-learn评价指南说明,把测试结果拿来调参会损害评价含义。这里选择函数只接收开发字典,目标结果从未传入;目标执行器拿到的是已经选定的固定阈值。这个调用边界比事后补写一句“未调参”更容易检查。

把每一只保留目标股都运行或登记

目标TA回报为[0.03,-0.02,0.01,0.03,-0.01],TB五个值均零,TC表示数据缺失。三者都属于原始清单,在可用数据上统一使用百分之二阈值,不因目标成绩变化规则。

目标状态一周期往返数策略复合回报
TA完成2负2.98%
TB无交易00%
TC缺失不可用不可用

TA因为前一期特征满足条件,参与第二期负百分之二和第五期负百分之一,复合结果为0.98×0.99−1,即负百分之二点九八。TB没有任何合格特征,零成本玩具账户平仓不动,零回报是有效结果。TC根本没有计算结果,不能与TB合并。

不能在TA上再比较两个阈值,挑好看的替换原参数,那会把目标重新变成开发对象。第二轮探索可以有价值,但必须保留首次迁移输出,并为新候选寻找新证据。原先的负结果不能因为后续优化而从历史中消失。

汇总之前先实现状态

关键执行逻辑先区分输入不存在与触发集为空,再计算回报:

if series is None:
    return {'status': 'missing', 'trades': None, 'score': None}
selected = [series[t] for t in range(1, len(series))
            if series[t-1] > threshold]
status = 'no_trades' if not selected else 'completed'

完整样例连乘被选中的回报,并保留状态。正式版本还应根据真正可观察字段区分执行失败、历史不足、不支持证券和拒单。不要假设已有引擎记录了所有精细错误类别,更不能在没有事件证据时编出具体未成交原因。

汇总需要明确分母。这里三份目标中两份可评价,只有一股有活跃往返。若算可评价股票等权平均,应包含TA和TB,明确排除缺数据TC及覆盖率;这只是描述统计,不自动等于共享现金可执行组合的收益。是否将空仓股现金再分配给其他股票,会改变组合,不能默默处理。

两种反例分别检查

第一项验收是开发与目标身份互斥,发现交集就应在选参前停止。需要发行人隔离时,也按主体映射重查;标签不一致但映射未知,不代表隔离已经成立。股票更名、换代码、不同股份类别等情况,都需要与研究分组意图一致处理。

另一机制是把缺失填成零回报。这样TC会伪装成第二个已成功测试的平仓股票,表面覆盖由二变三。程序断言TC保持不可用,TB合法零回报保持零,避免把信息空白变成稳健性证据。失败运行即便产生部分文件,也不能据此升级为完整目标结果。

还要检查选择函数边界。若目标评分已经参与选参,事后保存冻结参数并不能撤回泄漏。保存选择时间、开发评分表和候选引用,顺序早于目标执行。研究者此前探索过目标组时,应披露历史并收窄结论,不能用“这次脚本没有调用”证明从未看过。

建立逐股交接账

每股记录名单版本、数据起止、缺失比例、参数引用、执行状态、往返数量和结果产物。参数列应能逐行核对,确认目标没有特殊覆盖配置。对数据缺失的TC,也保留要求补充的具体输入和下一次检查条件,不能只写一个没有解释的空格。

复核时抽查TA两个触发期及TB一个有效但不触发的时期。这样能同时证明正信号路径和合法空仓路径,而不仅是查看汇总分数。真实交易若有手数、费用或停牌限制,应按统一规则重新执行,不能在迁移组放宽限制以得到更多交易,再与开发组直接比较。

目标清单更新还应注明变化是否独立于结果。如果因为历史数据恢复而补回TC,可以建立覆盖修订版,关联原来的缺失状态;如果看过TA亏损才将它移除,则属于改变研究对象,不能只刷新最终名单而隐去先前选择。两种变化对解释的影响不同,版本记录应能让读者分辨。

运行样例并接受有限结论

下载完整示例。使用Python 3.12或更新版本,运行python R612.py。标准库程序在DA、DB选出百分之二,随后报告TA两次往返、约负零点〇二九八回报,TB无交易零回报和TC缺失。断言检查组互斥、参数不在目标上重选,以及缺失与无交易分离。

验收要求原始目标清单每股都有结果或原因,数据和执行假设可比,目标没有重新调参。导出两组成员、逐股覆盖、冻结配置、运行引用与失败输出。不能隐藏TA亏损,也不能因为TB没有活跃交易就从分母中拿掉,从而改变原问题。

成员、历史、公司行动或输入变化后,保留原迁移并建立新版本。增加目标组或新期间可以扩充证据,但每次增加都有自己的选择历史。本文只检验零调参迁移和状态账,不证明任何真实股票组盈利,也不确认产品端已经实现批量迁移工作流。

常见问题

未碰过的股票组也算未来测试吗?

不算。跨股与跨时间是不同问题,可能共享同一市场环境。

无交易股票应从表中删除吗?

不应。保留有效无交易状态,与缺失和执行失败分开。

相关阅读