股票策略买卖逻辑怎么测:入场条件消失是否应该立即卖出
股票入场触发不自动等于持续持有条件。事件可以只在一瞬间成立,已有仓位却一直有效。先把生命周期写成明确状态,规定退出优先级和冷却计数,再核对预期目标序列。只用一列买入布尔值,无法完整表达“进一次、继续持有、退出后等待”的契约。
本指南构造十一期合成路径,包括空仓、做多和冷却。CoTrading状态路径工具仍为规划或待核实。样例验证目标状态与原因,不声称任何订单已经成交,也不证明特定市场的可卖限制已满足。没有价格和利润,检验重点是代码是否按声明管理生命周期。
条件之前先定义生命周期
先回答三个问题:什么创造新机会,什么维持已有仓位,什么终止仓位?突破事件可能只出现一次,计划却持有到另一个失败或期限条件。如果每天用突破真假直接决定持仓,事件消失就会导致非预期卖出。这不是阈值调得太严,而是把不同含义混成同一条件。
输入每个完整决策期的两个布尔值:入场与退出。它们由上游已计算规则提供,本例不再计算价格指标。这样可以把生命周期语义与指标算术隔离,读者不用争论均线怎么算,就能确认当触发消失时应不应该继续持有。上游可得性仍需另验。
使用明确符号状态,避免多个互相矛盾标记。Python枚举官方说明介绍带名称的枚举成员,脚本用来表示空仓、做多和冷却。名字本身不提供策略逻辑,真正行为来自下面预先冻结的转移顺序,不能只定义几个枚举就称状态机完成。
冻结转移优先级
做多时退出为真,转冷却并设置剩余两期;退出为假就继续做多,即使入场已假。已做多又遇入场,不增加数量、不新记一次进入。持有分支因此不依赖重复入场资格,这也是本题与单笔交易计划字段检查不同的地方。它覆盖跨多期存量状态。
冷却时,每个后续完整决策期消耗一格,目标保持零。把计数减到零的当期仍属于冷却,下一期才允许进入。这个约定排除了“等两天”常见的差一格理解。若改成计数归零当期就能买,必须另写预期序列,不应靠循环分支位置偶然决定。
空仓时如果入场退出同时为真,退出阻止入场;否则入场为真转做多,没有事件就等待。优先级在看任何后续结果前确定。另一种裁决也可研究,但属于不同契约,不能为了更多成交,把相同输入临时解释成先退出再立即买回。
目标状态与实际订单分开
目标一代表希望处于做多,不代表每天新增一个满仓买单;零代表希望非做多。本例不计算股数、现金和市场许可。状态转移以后可能需要订单,但不是订单已执行证明。不能把输出一直接写成系统已经买到,也不能因输出零就把真实数量清掉。
真实适配需要分别保存目标和实际仓位。退出受阻时,目标可能进入冷却,账户仍持股,这个分支应有执行感知契约。本信号夹具没有悄悄解决它。实际引擎若只在成交后改变持仓状态,要明确与这里的决策状态区别,再添加对应验收,而不是混用变量。
还需决定冷却从退出决策还是确认成交开始。本例从决策转移开始;若退出延迟,另一约定会得到不同时间线。不能从其他策略借来冷却一词,就默认计时相同。配置中保存起点、单位和是否包含终点,后续才可准确解释何时重新允许机会。
入场与持有正常路径
索引零入场真、退出假,空仓转做多并记录首次进入。索引一入场消失、退出仍假,目标继续一。这一行直接测试错误:若代码把入场资格当持有要求,就会提前变零。持续持有不是由作者事后解释,而是预期输出里明确的一条状态转移。
索引二再次入场,已有做多,所以目标仍一,原因继续持有而非重新进入。只看目标值可能发现不了内部重复买入,因此还统计明确进入原因。在完整账户中,应继续断言股数和订单不增加,不能让同一目标每期都加仓。本文只验证对应状态层事件数。
索引三入场与退出都真,退出优先,目标零,剩余冷却二。同一决策不能退出后立即回做多。输出前态、可见输入、后态与理由,读者可以独立核冲突,不需要运行收益回测。冲突分支必须有单独样本,正常上涨路径无法验证优先级是否写反。
冷却边界逐格计数
索引四有入场,但消耗第一格冷却,剩一,目标零;索引五消耗第二格,剩零、状态回空仓,但本行目标仍零。这里状态结束与允许新进入不是同一个时刻,说明为什么仅保存计数最终为零,还不足以证明代码没有早买一格。
索引六新入场允许,目标一;索引七退出又开启两格;八、九即使入场真仍零;十才再次进入。完整目标序列为[1,1,1,0,0,0,1,0,0,0,1],真正进入三次,分别零、六、十。没有把每个真触发都当成新增交易。
路径覆盖触发消失、重复入场、同日退出冲突和两次冷却到期。没有价格,因此不从好看曲线反推规则正确。若另一实现输出不同,先定位首个前后态差异,再查对应分支,而不是先更换参数直到最终进入次数碰巧一致。序列与原因都应比较。
执行状态验收文件
下载完整示例,保存R575.py,用Python 3.12及以上运行python R575.py。只使用标准库与合成输入,源文件为docs/growth/research/round-5/examples/R575.py,不联系任何服务,也不读取外部持仓或当前日期。
断言核完整序列、触发消失仍持有、已有仓位不重进、退出优先、两格阻止与三次进入。输出每行前态、输入、冷却、后态、目标和理由。删除一个转移理由也可能使验收不完整,所以不应只留下零一列表;账中这些字段组成可检查的解释链。
脚本逐个截断事件前缀,要求共同历史输出完全一致,追加后面事件不能改写早期转移。这只验证该状态逻辑在此夹具的因果性,不证明上游市场特征或外部退出标签历史可得。若增加隐藏时间或模型判断,还需单独做依赖隔离,不在这里假装已经覆盖。
明确错误控制是什么
错误控制把每个入场标记直接转目标。它在索引一放弃仓位,又在冷却中尝试暴露,即使输出仍是合法零一,也不是批准算法。代码更短不能说明语义正确。验收应对照声明状态,不以某条控制路径以后赚更多作为改写原规则的理由。
另一错误隐藏在相同目标后:每次入场真都算一次新交易。明确进入原因计数可发现这类生命周期问题,完整账户再核实际数量和执行单。若只测目标类型和长度,两种错误都有可能通过。边界夹具需要能区分这些错误,不能仅复述实现预期。
修改规则时保留契约版本
事件定义、优先级、计数语义、初态和预期路径一起归档。改持有或退出时,先找首个变化,再比较任何回测结果。冷却调整不应意外改变入场含义,或者每期重置仍有效仓位。重启若从存档状态继续,也要明确剩余计数,而不是默认所有实例从空仓开始。
接市场执行前,按实际支持加入退出受阻、部分成交和恢复状态夹具,未支持分支保留可见。完成条件是另一位实现者无需口头补充,就能重现每项转移、冲突与边界理由。目标状态可验收之后,才继续研究订单和现金,不能将这一步通过升级成策略在真实市场已可交易。
另有初始空仓冲突测试,第一次就同时给入场与退出,必须保持空仓,理由为退出阻止进入。它与已有做多转冷却的冲突前态不同,检验同样优先级是否一致。交接时一起比较前态、理由和目标,不能另一份程序恰好得到相同持有次数就认定生命周期相同。若恢复存档状态,还需对应保存计数,不能默认这条空仓样本覆盖恢复分支。
常见问题
入场条件消失就必须卖吗?
只有持有规格如此规定才需要,本事件入场例持有到独立退出。
第二个冷却期也是买入期吗?
本约定不是,下一期才重新允许进入。