跳到正文

研究指南

股票策略开发

把一句股票策略写成可回测规格:股票池、信号、退出与成交时点

把一句股票想法变成可回测策略,第一步是写确定规格。“买强势股,动量减弱就退出”没有说明用什么窗口、何时判断、持有状态怎样延续,也没有说明规则冲突时谁优先。合格规格应当让另一位实现者只看输入和规则,就能产生同一段示例信号。

本任务交付策略契约、正常路径、冲突路径和之后的执行时间表。Python只是手工确认规格的一种实现,不是通用自然语言解析器,也没有测试任何AI生成服务。CoTrading自然语言策略能力仍为规划或待核实。以下股票名称和数据全部虚构,不表示真实投资结论。

把模糊词替换成字段

先选一个市场。本例使用虚构美股US:ALFA,资金为美元现金账户。输入是按时间排序的每日完整收盘价,以及分开提供的下一交易日开盘价。股票池在研究前冻结;真实池还要有历史成员生效日、退市处理和代码变更规则,不能只拿当前代码表向过去延伸。

“强势”在本例中定义为:完整收盘价严格大于最近三个完整收盘价的算术平均,包含当日。至少三条观察才允许判断,不足时目标为零。相等也为零。三日窗口只是为了能手算的教学选择,不是推荐的投资参数。若要改为大于等于或排除当日,必须另写一版规格。

“持有”定义成每天的目标状态,而不是只在上穿当日发送一次事件。当天符合条件,即使昨天已经符合,也再次输出做多状态。“退出”定义为条件不成立时目标归零。本例只允许零或一,一表示满足单独的做多分配资格,不表示再下一张全额买单,也不是买卖方向值。

单独写清信息与执行时点

收盘完成之后才形成信号,最早影响后续指定可交易开盘。决策行、数据截止、计划执行行和实际执行状态分别保存。目标为一并不证明已经买到股票,因为缺开盘、资金不够或执行限制都可能使订单无法完成。信号验收与成交验收不能混在一个布尔值里。

Investor.gov订单说明提醒,最后成交价并不保证是市场订单执行价格。本例使用给定下一开盘作为模拟约定,并不承诺真实订单恰好以该价成交,也不能据此推断已经连接交易所或券商。实际实现应保留价格来源和偏差假设。

如果要继续实现账户,需要补充做多比例、整数股取整、现金预留、佣金与滑点,以及每天重平衡还是只在状态改变时调整。本文验证信号和排程,不把一个短函数说成已经完成整个扣费撮合引擎。规格表可以先写完整这些字段,后续账户实现再逐项验收。

冲突优先级要先于代码

增加明确布尔输入“风险阻止”。若当天阻止为真,即使价格比较成立,目标也必须为零。顺序是先检查历史长度,再检查风险阻止,最后执行数字比较。读者不应猜测“买强势”是否压过“风险期间不持有”。优先级属于策略含义,不应由代码分支偶然决定。

还要说明阻止只取消新建仓,还是请求已有仓位退出。本例选择后者,因此目标归零;实际能否卖出仍由后续执行层判定。风险阻止在这里是显式政策输入,不是新闻自动分类,也不是模型自动给出的风险意见。读者若要引入外部事件,必须补充数据来源与可得时间。

未知风险状态不能默认等于假。本例提供完整的阻止集合;真实契约应拒绝未知输入,或写明保守默认。否则缺风险数据就会悄悄授权持仓,即使均线计算没有任何错误,最终行为也偏离要求。这类输入错误应独立保留状态和验收样本。

手算正常路径

收盘价依次为十、十、十、十二、十三、九、八,索引从零开始。前两行历史不足。第三个十等于最近三个十的均值,因此严格大于条件不成立。索引三用十二与十、十、十二的均值比较,得到一;索引四的十三也满足条件,继续输出一。

索引五的九低于十二、十三、九的均值,目标回到零;索引六仍为零。因此完整收盘信号为[0, 0, 0, 1, 1, 0, 0]。其中连续两个一表示持续持有状态,不是连续买入两次全部目标。若执行层把每个一当新增订单,便会产生规格以外的重复加仓。

只加一层执行延迟,在七行可见范围内得到下一开盘目标[0, 0, 0, 0, 1, 1, 0]。最后收盘对应的后续开盘没有出现在样例中,因此不能补造行情,不能把最后信号当作已完成交易。对齐应按交易日索引,不能简单认为日历明天一定开市。

冲突路径形成独立验收

把风险阻止设在索引四。当天价格仍满足强势定义,但优先级使收盘目标变零,得到[0, 0, 0, 1, 0, 0, 0]。它与“相等时输出零”的边界不同,实际检验的是两条同时成立规则的裁决。只验证正常路径无法发现优先级写反的问题。

独立标准库样例位于docs/growth/research/round-5/examples/R572.py,核心分支如下:

if i < 2 or i in risk_blocks:
    target = 0
else:
    average = sum(closes[i - 2:i + 1]) / 3
    target = int(close > average)

运行python docs/growth/research/round-5/examples/R572.py。程序断言正常序列、风险冲突序列、下一开盘目标和三个相等收盘的边界。这些是可执行验收样本,不能证明任意自然语言都能自动准确生成策略,也不能证明模型生成的其他逻辑已经通过检查。每增加一个新规则,都应补一条能区分实现差异的样本。

交给独立实现者时的完成标准

把股票池、输入字段、窗口、比较运算、热身、冲突优先级和执行约定放进同一版本,再附上固定数据与预期输出。第二份实现如果不同,先按日期和阶段解释首个差异,再跑大样本。类名不同通常不改变策略;相等时处理不同则改变策略,需要规格层面明确决定。

需求变化时,正文规则、验收序列和实现一起更新。记录哪些修改改变信号,哪些只改变数量或费用。“最近”“流动性好”“小仓位”“及时”等词,要继续变成可测字段或显式外部依赖。完成条件是另一份代码无需作者再次解释原句,就能复现正常和冲突两条路径。此后才进入历史数据、账户成本和市场约束验证,避免把自然语言理解偏差埋在漂亮回测曲线下面。

下载完整示例,保存为R572.py,使用Python 3.12及以上运行python R572.py。仅使用标准库与合成数据。

让审阅不依赖原对话记忆

把规格和样例交给另一个读者,但不给最初那句口语描述,请其独立推导第一个完整窗口、首次合格行、风险冲突行与首次退出。如果仍需作者解释“强势原本是什么意思”,规格就还有未解决依赖。这个步骤检验交付工件是否充分,而不是检验两个人是否记得同一场讨论。独立推导结果应与预期序列并列保存。

变更日志按影响层记录。把严格大于改成大于等于,是决策逻辑变化;增加佣金,是账户算术变化;推迟到更晚开盘,是执行排程变化。即使用户只说一句“保守一点”,也要把含义分解成可验证字段,不能让实现者自由理解后同时修改三层。每层变化配对应验收输出,后续差异才有解释。

对于不支持的目标值和缺必填输入,接口应明确拒绝。较小但能拒绝未定义情况的契约,比自动猜测后总能返回一段信号的宽接口更好核对。本例的风险集合已明确、价格已给定、信号只有零一,这些都是输入前提。如果后来增加仓位比例、外部新闻或多股票排名,应更新模式、冲突表与样例,不能用这一次手工通过的结果为新增功能背书。

最后把规格编号写入每次信号输出,避免同名规则升级后无法分辨使用哪版。验收者先核编号,再核输入与序列,才比较执行差异。样例测试通过可以作为交接条件,不能代替未来真实数据中的覆盖检查,也不能据此承诺任何收益;这些后续依赖应随规格一起列出,保持每项结论的证据范围清楚。

常见问题

这是自动策略生成器吗?

不是。它是一个手工明确规则及其确定实现,用于展示验收方式。

为什么目标和订单分开?

目标状态可能连续出现,也可能无法成交,混用会造成重复买入或虚假成交。

相关阅读