跳到正文

研究指南

股票回测与实验

怎样把股票回测交给别人复现:打包到独立重跑验收

股票回测说明如果依赖作者聊天、工作目录或私有文件,就还不能交给别人独立复现。把可执行策略、生效配置、数据前置条件、运行环境和预期结果组成包,再真正换目录运行。只有截图和最终利润的压缩包,不满足这个要求。

本文生成并核验含可分发合成数据的标准库小包,属于外部导出方法,不证明CoTrading已有按钮。市场和币种在真实研究中明确,样例也不建立任何真实行情分发权,更不验证历史股票成绩。方法复现与原市场结果复现要分别标注。

规定要复现什么

声明接手者应得到精确成交与净值、容差内指定指标,还是只用不同输入重现方法。这是不同交付。本文要求相同源码、配置和数据字节下,精确得到合成成交清单和期末金额,不只检查程序能启动。

记录源运行,所有前置条件不引用旧聊天。初始账户、信号时序、费用、末期估值和随机性写清。若原策略会调用模型或实时服务,冻结合法可保存的输出,或披露仍存在外部依赖;不能把未冻结服务隐藏在“完整离线”标签里。

完整离线合成包与需要授权数据的真实复现要分开。历史价格不可得时,不换成虚构价格后宣称原绩效复现。合成可以检验方法,但保留自己的身份和限制,避免接手者把演示结果当成原账户或研究成果。

建立最小可执行目录

样例含策略、runner、配置、数据、预期和说明六个载荷,再加manifest。六文件有摘要,manifest是额外成员。runner从自己的文件位置解析路径,不让新的工作目录意外找到作者原本地输入,也不要求接手者知道仓库结构。

文件用途
strategy.py固定信号与账户函数
runner.py核验、执行与比较
config.json初始现金1000
data.json价格100、102、101、104
expected.json精确成交与期末1003
README.txt环境、命令和数据状态
manifest.json环境描述及载荷摘要

编码和结构值显式,真实包还要对应依赖与解释器要求。此处Python 3.12以上、仅标准库,没有演示安装独立引擎、恢复数据库或模型环境。不能因为小包无需第三方,就说所有真实回测也能这样直接运行。

不可分发数据就保留取得契约

真实输入不允许分享时,不放入包,写清合法取得流程:提供者、数据集和版本、证券映射、区间、日历、复权、模式与可得完整性引用。凭证留在包外,由接手者通过合适本地机制配置;不能嵌作者令牌解决访问前置条件。

这样的包是条件复现,不是完整离线运行。提供者若不再提供相同快照,应披露;不要承诺公共接口能恢复不可得授权修订版。访问成功也不等于版本相同,要核对真实输入身份,不能拿最新数据直接覆盖预期后宣布一致。

本文使用自己虚构四价,可以包含全部输入,同时另造缺数据情况,确认明确阻断。没有联系真实供应商,也没有判断任何真实数据能否分发。权限和数据可得性不是运行脚本能凭空消除的问题,必须体现在交接限制中。

使用载荷前先核验归档

Python zipfile文档提供创建和读取接口。生成器只写已知平铺文件名,提取时拒绝绝对和父目录跳转路径,再按manifest核对必需载荷字节。示例归档自己生成,不处理任意远程代码,也不声称完整沙箱。

摘要相对参考发现变化,不在攻击者能同时替换数据与清单时认证作者。包来源可信度另行建立,不能因为自带哈希吻合就执行未知策略。真实交接可以把清单摘要另存可信记录,让接手者知道比较基准来自哪里。

任何载荷包括配置或预期改变,都形成新版。不能为了失败运行变绿直接编辑expected。说明文件更新也可能改变字节摘要,区分文档版本与行为版本,但两者都留痕。预期结果不是可以随意迁就当前输出的缓存。

用包内输入实际执行策略

规则观察价格上涨,目标一股或零,下一价格成交。在[100,102,101,104]上,索引二以一百零一买一股,三以一百零四卖出,现金一千变一千零三,末期无股、费用零。这个结果来自计算,而不是只打印预设常量。

预期成交为[[2,1,101],[3,-1,104]],此导出数量正为买、负为卖,方向契约明确。预期包含全序列,避免抵消交易错误只要期末相同就通过。真实多证券、多币种和部分成交模式需要更详细事件键,本例没有覆盖。

runner从包内路径加载策略,读配置和数据,执行并比较结构结果,不依赖仓库导入或用户site包。完整生成器含全部源码,接手者不需要网上下载隐含脚本,也不需恢复作者聊天里某个没有保存的代码片段。

独立目录与进程回放

Python subprocess文档说明参数列表、工作目录、输出捕获和返回码。样例另建目录恢复包,使用runner绝对路径和不同工作目录,启动python -I -B runner.py,真正观察子进程输出。

隔离标志减少意外路径依赖,不固定操作系统或Python实现。这里是在同机相同解释器的新进程,不是跨平台认证。真实报告应记录实际环境,不能因为换了文件夹就声称在任何机器都可重现。

核对退出码后解析真实结果,再比较成交和末值。进程启动成功不代表必需产物完整。错误日志需足以区分缺输入、无效数据和策略异常,同时去掉凭证。失败时保留原记录,不能只发布最后一次顺利运行的截图。

两种不同失败边界

独立成功后,样例把自己本地数据换成[1,2,3],下一子进程在执行策略前因摘要不符失败。这是完整性错误,不是可与原结果比较的新市场实验。不能更新清单接受它,仍沿用原包版本。

另一组恢复时没有data.json,明确报告缺必需文件,模拟取得条件未满足。不补零,不临时联网取样例行情,也不借作者缓存。两种错误与策略正确执行后亏钱不同,都需要先解决输入或交付问题,再谈绩效。

脚本只恢复自己的临时合成文件,结束清理专用演示目录。生产导出应选批准的持久位置,保留包、清单和回放记录。本文没有测试长期保存、备份和断电耐久,临时目录成功不提供这些保证,不能照搬清理政策到研究档案。

建立接手者验收单

让接手者从空目录按README执行,记录命令、环境、返回码和结构比较。不能在报错后由作者手工补一个未说明的私有文件,再把整个流程记为无需前置条件。新增必需项应回写说明,生成新版,再从独立目录重新验收。

空目录还能避免旧输出或多余模块碰巧帮当前包通过。保留恢复成员清单,核对没有读到包外路径;若结果需要上次残留文件,说明包并不自足。真正应长期留存的结果另导出到有明确版本的位置,不让临时测试目录兼任生产研究档案。

实际行情需要重新取得时,记录取得版本与预期是否一致;不一致就先标条件未满足,不能悄悄改数据或预期。接手者知道必须提供什么,比收到一个看似完整却总去作者电脑找路径的包更有用。依赖外部服务的部分也要单列可复现范围。

运行与验收

下载完整示例。使用Python 3.12或更新版本,运行python R626.py。它生成完整合成包,在隔离独立子进程核验期末一千零三及两笔成交,再检查篡改与缺数据拒绝,没有凭证或外部服务。

接手者不靠聊天即可执行,输入已包含或取得条件明确,独立结果满足声明契约,才接受。保存实际命令、环境、返回码、比较与限制。策略、配置、数据、环境或预期变化后重建并保留旧版,不以新预期覆盖旧失败。

本例只验证合成便携回放,不展示产品已有导出按钮,也不保证受限真实输入离线长期可得。真实交付仍需合法数据、完整环境与相应控制,不能把方法示范说成实际账户或模型已经复现。

常见问题

不含授权数据的包完全离线可复现吗?

不是。保留合法取得条件和快照可得性限制。

换目录运行证明跨平台兼容吗?

不能。只验证当前测试环境的目录和进程独立。

相关阅读