回测收益全靠一两只股票怎么办:移除主要贡献者再跑
股票策略开发收益集中在一两只股票时,按明确规则移除贡献者,再完整重跑剩余组合。直接从原收益减去赢家贡献,不能重建新实验:释放资金会改变权重、股数、现金和后续交易。有效对照应是两条完整账户路径,并说明资金如何重新分配。
本文干预三条虚构股票价格路径,检验候选对主要贡献者的依赖。规则使用已经看过的开发结果,属于脆弱性检查,不是独立留出,也不是新的选股建议。保持同一市场与币种;CoTrading能力规划或待核实,计算为独立外部扩展。
先勾稽贡献再挑剔除对象
从冻结候选的持仓、成交、估值和费用开始。贡献单位应与组合绩效一致,金额利润、加权收益贡献和单股自身涨幅不是同一数量。先证明股票贡献与现金效应能够勾稽原组合,再按贡献排序;账未核对时,最大贡献者也可能只是漏记成本或估值错误。
说明已实现、未实现、股息及费用是否包含,亏损者与不活跃股票同样保留。某股贡献大,可能是配置大,不一定是其独立表现特别强。干预解释中保留原敞口,不能只展示一个贡献比例,就把大小仓位的差别说成策略对股票的必然依赖。
FINRA集中风险说明讨论资产表现和相关持仓如何形成集中。本文剔除重跑是原创敏感性操作,来源没有规定这个算法,更没有认证删除盈利股就能形成更安全或更优策略。政策动机与计算证明应分开。
冻结剔除与资金再分配规则
事先确定开发观察区间、贡献指标、移除数量、平局处理和最少剩余股票数。本例只删除第一期利润贡献最大的一只,同分按证券身份顺序决定。不能不断删除,直到剩余结果符合预期,再只展示最后一次,看起来像预先规则。
释放资金可以留现金,也可以按原仓位规则重新分配,或者采用其他明确政策,这些回答不同问题。本文每期边界对剩余股票等额再平衡,因此其获得资本高于原组合。要把这一选择写出来,不能让读者以为只是把一只股票从图上拿走。
信号与其他执行假设保持冻结。如果股票池本身参与横截面排名,剔除后还应重新形成信号,不能沿用原目标权重。排名策略少了第一名时,第二名可能进入组合。账户应从起始状态沿新股票池重新推进,而不是继承旧交易表的大部分行就宣布完成。
主例:原始三股账户
初始资金三百,三股起始价格都一百。A路径[100,120,120],B为[100,100,110],C为[100,90,90]。在两个持有期间的开头等额再平衡,费用零、允许碎股,没有缺失或拒单。这些为可检查的数学简化,不代表真实市场交易规则。
第一次分配每股一百,各一股。首期贡献A正二十、B零、C负十,净值三百一十。按冻结规则删除A,因为其首期贡献最高。这个选择使用了已见信息,不能在报告里改称样本外发现,也不能把贡献排序当作未来选股信号。
不剔除时,第二期开头将三百一十平均分配,每股约一百零三点三三三三三三。只有B第二期上涨百分之十,原组合期末约三百二十点三三三三三三。程序保存每次目标股数和实际股数变化,能够追到再平衡,而不只是给出两个余额。
从同一初始资金重跑剩余账户
重跑前删除A,恢复初始三百,再向B和C各分配一百五十,股数各一点五,而不是原来一股。首期B贡献零、C负十五,剩二百八十五。这已经不同于直接从三百一十减去A的二十,后者会得到二百九十。
第二期开头,各配置一百四十二点五。B增加十四点二五,C不变,最终二百九十九点二五。这里重新生成两次配置,并没有把原成交表的A删除后继续求和。剩余股票更大的仓位,同时放大了首期C亏损和第二期B收益。
| 账户路径 | 首期净值 | 期末净值 |
|---|---|---|
| 原A/B/C再平衡组合 | 310 | 320.333333 |
| B/C重新分配资金重跑 | 285 | 299.250000 |
| 原期末减A的二十贡献 | 并非重跑 | 300.333333 |
减法捷径最终与重跑相差约一点〇八三三三三。原因是剩余敞口一路变化,不是只有赢家那一项消失。如果A原资本留现金,又会得到另一结果,需要独立标注的账户模拟,不能把不同资金政策混在同一张“剔除后”图里。
保留目标、成交与贡献桥
每期核心操作如下,完整代码保存目标与成交变化,附该期净值:
target = {s: equity / len(universe) / prices[s][t]
for s in universe}
fills = {s: target[s] - shares[s] for s in universe}
contributions = {s: target[s] * (prices[s][t+1] - prices[s][t])
for s in universe}
equity += sum(contributions.values())
在零费用、即时成交假设下,目标价值用完可用资金,利润桥能够勾稽。真实引擎还需明确先卖后买、可用现金、手数、费用和拒单。碎股简化不验证任何市场的实际最小交易单位,也没有测试资金交收或融资本金限制。
数值采用明确容差核验,身份和剔除成员精确比较。脚本使用Python isclose检查浮点结果。为了吻合显示值而提前舍入全部股数,会改变模型,不能把舍入后恰好一致当作原路径验收。
不同机制的失败检查
第一个反例是从原期末减赢家原利润,得到三百点三三三三三三,不是完整重跑的二百九十九点二五。断言明确要求二者不同,避免一份看起来合理的减法报告通过表面检查。只显示“收益少了多少”而不列权重,可能掩盖这类错误。
第二个边界是剩余股票池为空,等权配置没有分母。代码拒绝空清单,不除以零,也不静默返回未变的盈利曲线。真实政策可以规定全现金,但必须在解释干预前确定,不能在发现空集时临时采用最方便的结果。
剔除后剩余股票若数据或执行失败,也要保留。资金时序改变可能影响可行性,不能因此把失败股票又删掉。未完成重跑时应报告不可用,不给没有完成的股票填零贡献。若失败让有效股票池再次变化,说明当前实验尚未按预定范围完成。
解释干预能够证明什么
原路径期末超过三百,重新分配后的残余路径略低于三百,说明在当前分配政策下对剔除A敏感。它不证明A贡献了全部经济价值,不意味着应该回避A,也不预测剩余策略未来必亏。已观察利润和可持续性是不同层次的问题。
剔除规则已经用了开发结果,不能把重跑包装成独立样本外检验。保留为脆弱性诊断,再决定是否需要新证据。更改移除数量、贡献期间或资金分配,又形成新的探索版本;全部尝试都应留在账中,不能只展示最符合叙事的一条。
逐期检查干预是否真正进入执行
交付时对照原组和残余组的成员数、目标价值、目标股数、实际股数变化及期末估值。第一期B和C从一股变成一点五股,是资金重新分配生效的直接证据。第二期目标价值从原来的约一百零三点三三三三三三变成一百四十二点五,则证明后续配置也重新计算。
检查者还应确认初始资金仍是三百,而不是删除A时顺便把本金缩成二百。缩本金后看百分比可以回答固定敞口子组合的问题,却不是本文“同本金重新配置”的干预。把本金政策单独成列,能避免两个名称相同的剔除实验实际承担完全不同资本。
实际运行与验收
下载完整示例。使用Python 3.12或更新版本,运行python R614.py。仅用标准库和合成价格,断言A被选中、残余首期各一点五股、期末二百九十九点二五、结果不同于减法,以及空股票池被拒绝。
归档原贡献表、冻结移除规则、完整剩余清单、资金政策、目标成交账和两次运行引用。先勾稽首期贡献与第二期再分配,再接受最终比较。没有变更权重的结果,无法解释干预;只有最后余额也不足以排除偷用原成交的实现。
贡献定义、快照、候选、费用或再分配政策变化时重新运行,保留旧版本。示例只检验简化账户变换,不提供真实历史成绩,也没有验证自动化产品功能。接入真实股票前,费用与整股约束需要实际执行,不能直接把本例股数照搬到市场。
常见问题
删除原成交导出的赢家行就可以吗?
不能实现本文的再分配重跑,剩余目标和账户路径都需要重新生成。
这是策略的独立有效性测试吗?
不是。剔除依据已见贡献,属于探索性脆弱性检查。