Files
fidc-backtest-engine/docs/manual-zero-reinvestment-20260915.md
T

4.3 KiB

人工零仓位与可选红利再投的一致性

2026-09-15。开发候选,未发布生产;完整目标保持未完成。

已核对的模型和反例

ALV position_model.py::_handle_dividend_payable 与FIDC现有再投都是参考价、整手、零费用的历史账务模型,不是市场委托;两边默认再投关闭。只有显式开启该模型时,才出现本轮组合问题:用户已清仓并在派息前将人工仓位设为0%,派息日仍账务买入100股。完整回放已在修复前实际复现。

修复不把这项功能改成开盘市价单,不改变原参考价或整手定量。没有人工零仓位时,清仓本身不能作为猜测用户设置的依据,继续按原已声明的再投模型计算。

控制优先级

  • 只读取已校验、绑定运行审计的人工仓位/权重事件。上海交易日00:00是当前历史模型的结算入账时点,不是券商成交时间;使用此时已经生效的最新 (effective_at, sequence)
  • 已生效的人工Scale 0、Set 0禁止可选再投。明确的人工分配中,证券权重0或被排除也只让该证券分红留为现金,不替它买其他股票。
  • 同时刻按真实序号,输入数组顺序不能改变结果。较晚才生效的零仓位或恢复不得倒改早先结算;Restore覆盖旧人工限制,但不代表强制100%仓位。旧日级控制保留日级粒度。
  • 没有人工限制、恢复跟随或非零且未排除该证券时,保留原再投模型,不对价格、手续费或分红金额另加比例计算。
  • 分红到账、实际成交、送转/换股等既有金融事实不会因0%被抹掉。0%停止的是可选新增分配,不伪造清仓或强制卖出已有/T+1持仓。

正常结算与迟到回报经济重放使用同一控制判断,控制源显式传递,不能只在策略下单层截断。日志包含 runtime_zero_exposureruntime_zero_allocation、生效时间/序号以及 cash_retained=true

金额口径

原100股×8.95元的账本已经扣895元,但新成交记录的浮点乘积可能输出894.9999999999999。现在记录与现金扣账使用同一个微元金额,输出895和-895;保留原价格、股数、零费用和旧历史结果,不将显示尾差当成真实资金差额。

验证和边界

新增六项专项:有效0%、无控制的原模型、时间/序号/旧日级/恢复组合、逐股0和排除、迟到权益重放、显式0%不读取无用的再投价格且坏现金仍原子失败。清仓0%样例最终现金49998、持仓0;没有0%仍100股、8.95、零费。额外实际买入迟到的样例,不掩盖真实1000股持仓,及时/迟到最终现金都为41047,权益现金校正1050,无可选再投。

本机Core919、Trading625、Runner463/API129全量通过,原9/63/16项ignore不计。没有修改UI、在线配置、账户、通知或交易路由;没有进行新的私有PG、实际Source/Runner、生产页面或券商委托验收。本修复针对经审计人工控制,不提前执行策略表达式来猜测其意图。

Source d5明确冻结保持。仍需完成正式换股字段/范围闭包、在线转换事实及重建、旧目标和活动单边界、其余生命周期/ETF矩阵与真实Source/Runner联合验收。Linux用新快照独立验证,不复用上一轮收据;未建release/tag或重启生产。

Linux配套验收

功能提交 818552bc969e0ea40081f0770c1d97db574a1981 已推送并核对,177引擎开发树已快进至此,Service并行5991e77保留。只读快照 /srv/fidc/programs/runtime-snapshots/zero-reinvestment-20260915-Yovt6m 含989文件,独立同名build根;4CPU/12GiB、boris执行、1GiB保护线不改。源码manifest SHA 9ffdc1bc86e1b4b085caa694e921fc230ce0f09c57d34254058ae28e631d5bb3

Linux Core919、Trading625、Runner/API594共2138项全过,原9/63/16项ignore不计,源码前后不变。结束时可用77131395072字节,scope已inactive,不重复本批或覆盖前阶段收据。证据见 docs/evidence/manual-zero-reinvestment-20260915/{local-tests,linux-tests,runtime}.json

2026-09-15 00:34 CST逐服务比较,现有UI/五后端PID及后端实际SHA与上一轮相同,Source d5且tracked clean。未构建release、未建tag、未重启生产或修改任务/账户/路由/通知,没有实际委托/撤单;源码同步不是运行版本发布。