股票回测配置怎么写:让证券代码、数据源、引擎与币种对应
股票回测配置应在输出收益前拒绝市场、币种和数据假设不一致的运行。先建立明确证券主表,再让每个代码对应行情源和执行引擎。供应商名称本身不能说明价格应该套用哪个市场规则,也不能证明所有金额可以进入同一个现金账户。
交付物是最小配置契约和逐字段预检报告。本例使用虚构数据源与教学证券标识,不是CoTrading已开放的配置接口,相关产品能力仍为规划或待核实。Python验证器只做本地检查,没有实际拉取行情、连接券商或实现外汇换算,不能把配置通过等同运行成功。
用证券主表代替字符串猜测
每个研究标识对应市场、交易币种和生效区间,供应商代码另外保存。没有交易所或命名空间的ALFA可能有歧义,数字后缀也不是所有真实证券的通用上市地保证。无法解析就拒绝,不能采用供应商碰巧返回的第一个同名对象,然后继续计算看似合理的收益。
本例显式映射US:ALFA、US:BETA到美股与美元,HK:00005到港股与港元,CN:600000到A股与人民币。这些只是固定测试映射,不表示前缀解析器覆盖所有真实股票。生产主表还需处理股类、上市地变化和同名证券,并保留可追溯的市场或发行人来源。
SEC官方EDGAR接口说明介绍了包含标识和交易代码的公司申报元数据。公司资料可以支持研究映射,但公司申报标识不是完整历史交易所证券标识。保存映射来源与有效期间,不能假设今天的代码自然代表过去所有交易,尤其要注意更名与股类差异。
数据能力与引擎路由分开
给每个数据源登记支持市场、频率、价格字段、币种和复权约定。本例fixture_us只支持美股,fixture_hk只支持港股,fixture_cn只支持A股。显式能力表可以让错误定位到来源不匹配,而不是等到后面出现空数据才猜测网络或策略出了问题。
引擎字段选择市场执行约定,必须匹配证券主表。即使真实供应商覆盖多个市场,也不代表港美股可以共用交易日历、数量规则和费用。来源检查与引擎检查分开,分别输出错误。只改对来源,不应消除仍然存在的引擎错误;这正是逐字段预检的价值。
运行前声明必需价格字段。策略按下一开盘成交,就需要可用开盘;只有收盘的数据源仍可能画出曲线,却不能因此补造成交。预检应拒绝缺字段,不随手选一列代替。下载成功和适合指定策略,是两个验收条件,不能只看接口返回非空。
日期、频率与资金也要验证
采用明确ISO日期,开始早于结束。Python日期时间官方文档提供了样例使用的日期解析。能解析日期并不说明当天是交易日,随后仍需连接所选市场日历,确认首条有效观察、节假日和开盘时点。不能用简单日历加一代替下一交易日。
绩效区间与热身抓取区间分开。需要一百二十条观察的信号,可能要抓取绩效开始之前的价格。不能把热身算进可投资表现,也不能删掉热身后,把初期信号缺失归因于策略失败。运行清单保存两段日期,并说明从哪一天才允许形成订单与净值。
初始资金要求正且有限,频率属于支持集合,账户币种明确。本例接受日级与正资金;更完整的输入模式还应在算术前拒绝非数字、无限和缺值。教学验证器假设已经给定适当类型,不宣称任意JSON输入都经过完整加固。范围说明要与实际检查一致。
看懂合法最小配置
合法示例包含US:ALFA和US:BETA,引擎US,币种USD,来源fixture_us,开始二〇二六年一月一日,结束六月三十日,资金一万,频率1d。返回空错误列表,只表示这些本地契约检查通过,不表示每个请求日期都有行情,更不表示已生成信号和成交。
配置、主表版本和来源能力版本一起保存。另一个研究者应能恢复某代码为什么被分给某引擎。如果引用表不断变化,即使配置文件字节完全相同,其含义也可能改变。例如供应商调整代码映射后,旧文件可能读到另一个证券,不能只靠配置文件哈希声称完全复现。
真实运行前抽一只证券人工核对解析后的上市地、币种、原始时间戳和首个可执行价格。这一步可发现同属美股美元、却选错股类的情况,补充模式检查无法识别的语义错误。人工核对范围应如实记录,不把抽查一只写成全池逐条验证。
混市场与混币种反例
把US:BETA换成HK:00005,其余保留美股引擎、美元账户和仅美股来源。验证器为该证券返回三项:引擎不符、来源不符、币种不符。它们不是重复提示;只修来源,仍然保留执行规则错误和现金单位问题。多错误并列能帮助一次修正全部必要字段。
不能仅把账户标签USD改成HKD,或把不同币种数字视为同一单位来“修复”。没有外汇层时,混币种价格不能直接汇总到一个现金账户。本指南把人民币A股、港元港股、美元美股分别研究。真正跨币种还需带日期汇率、各币种现金账户及兑换费用,属于额外设计,不能从一张配置表推断已实现。
另外三个负例分别是资金零、日期反向、裸代码ALFA无法解析。它们在不同字段失败,报告保留对应原因。不要不断启动回测尝试随机组合,直到某次不抛错;运行不报错可能只是错误市场恰好也有同名数据。应先用确定契约排除歧义,再取得行情证据。
执行与维护预检
标准库文件为docs/growth/research/round-5/examples/R594.py,核心路由分别判断:
market, currency = master[symbol]
if market != config['engine']:
errors.append('engine:' + symbol)
if market not in sources.get(config['source'], set()):
errors.append('source:' + symbol)
if currency != config['currency']:
errors.append('currency:' + symbol)
运行python docs/growth/research/round-5/examples/R594.py。断言合法配置为空、混篮子三错齐全、零资金被拒、反向日期被拒、裸标识被拒。程序不调用任何真实引擎,也不创建账户,因此输出不能作为服务可用性或产品能力证明。
真实研究在获取数据后再增加第二阶段:必需列、唯一有序时间戳、区间覆盖和热身长度。保留无法核实状态,影响运行含义时先停止比较收益。来源、引擎、标识映射、币种或频率变化后重新检查。验收条件是每只证券的行情与规则路由可追溯,并且之后的覆盖有证据,而不是目录里出现一个净值文件。
下载完整示例,保存为R594.py,使用Python 3.12及以上运行python R594.py。仅使用标准库与合成数据。
配置含义也需要版本
保存应用默认值之后的解析配置,并同时保留用户原始配置。空来源字段如果继承默认,升级后即使原文件不变,也可能运行不同来源。解析工件应写明实际来源、引擎、日历、账户币种,以及映射所用引用表版本。这样“同一配置重跑”才有可检查含义,不只是文件名看起来相同。
警告与拒绝分开。已知证券但热身覆盖不足,可能是抓取后的覆盖问题;未知证券则连路由都无法建立。不能为跑完流程,把币种不一致自动降级成警告。复核旧结果时使用当年保存的引用表,不用今天主表代替;旧引用找不到,就明确写复现不完整,而不是重新猜一个合理市场。
默认项还要显示其来源,例如用户明确选择、项目配置继承或程序默认,避免后续审阅把隐含行为当成主动研究决定。本例没有实现产品配置继承,只说明实际管线必须增加的工件。预检通过后输出的解析配置应成为回测输入的一部分,直到数据覆盖、信号和成交检查结束都保留。这样绿色检查不是随运行消失的一瞬间状态,而是可以回看“究竟验证了什么”的证据。
配置报告还应说明没有检查什么,例如没有连接行情、没有验证逐日价格,也没有实现外汇层。缺少这些证据时,就保留相应后续步骤,不能因为字段全部合法便跳过。明确范围能让下一位执行者知道从哪里继续,而不必重新猜测绿色结果代表哪一层成功。
股票列表至少包含一只可解析证券。空列表返回symbols_empty,因为本股票运行契约没有定义有意的纯现金基线。样例明确断言拒绝这个输入,避免没有请求任何股票、仅写出初始现金曲线,也被标为一次成功股票策略运行。若需要纯现金比较,应另建明确基线,而不是依赖空输入偶然通过。
常见问题
一个供应商能覆盖多个市场吗?
可以,但每只证券仍需匹配引擎、币种和日历,供应商名称不能替代这些字段。
空错误列表是否证明回测跑通?
只证明本配置契约通过;行情覆盖、信号和执行需要各自证据。