程序员量化交易实战 24:把模拟盘账户状态保存下来 第 23 篇串起了每日模拟盘流程。但如果程序重启后账户状态丢了这条流程就只能算演示。第 24 篇先用 JSON 文件保存和恢复模拟盘账户状态。不是最终生产方案但足够让本地实战项目连续跑起来。只保存基础状态第 24 章新增app/paper_state_store.py。它只保存现金和持仓不保存快照、日报、推荐摘要这些派生结果。这样做的好处是恢复后可以用最新行情重新计算快照和风险不会把旧的派生状态误当成当前状态。模拟盘状态可以粗略分成两类基础状态和派生状态。基础状态包括现金、持仓数量、成本和已实现盈亏派生状态包括市值、权重、风险级别、推荐动作和日报正文。基础状态应该被持久化派生状态应该尽量重新计算。转成字典def paper_account_to_dict(account: PaperAccountState) - dict[str, Any]: return { cash: account.cash, positions: { symbol: { symbol: position.symbol, shares: position.shares, avg_cost: position.avg_cost, realized_pnl: position.realized_pnl, } for symbol, position in sorted(account.positions.items()) }, }这里特意按 symbol 排序保证同一个账户多次写出的 JSON 稳定便于 diff 和调试。保存和恢复save_paper_account(account, data/paper-account.json) account load_paper_account(data/paper-account.json)实现只用标准库json和pathlib。等模拟盘状态更复杂再迁移到数据库也不迟。当前联动运行结果paper-ops命令会在临时目录里保存一次账户状态再从 JSON 恢复账户然后继续运行每日流程uv run python -m scripts.chapter_examples paper-ops这个示例刻意只保存cash和positions。交易日、最新价、风控结论和推荐摘要都不写入账户状态文件因为这些内容应该随每日行情变化重新计算。这样做也方便后续把 JSON 替换成 SQLite 或 PostgreSQL领域对象不需要跟着存储介质一起改变。本章更新与代码仓库本章更新内容新增app/paper_state_store.py。实现模拟盘账户到字典的转换。实现 JSON 文件保存和恢复。对旧 payload 缺失realized_pnl做默认值兼容。增加paper-ops联动示例展示账户状态保存、恢复和继续运行。补充基础状态与派生状态分离的持久化背景。新增tests/test_paper_state_store.py覆盖内存 round trip、文件保存读取和兼容旧格式。代码仓库https://github.com/ax2/zi-quant-platform本章代码git clone https://github.com/ax2/zi-quant-platform.git cd zi-quant-platform git checkout chapter-24 uv sync --extra dev uv run pytest tests/test_paper_state_store.py第 24 章提交为3c3c52btag 为chapter-24。本篇小结能算一天不等于能连续运行。第 24 篇让模拟盘账户状态可以落盘和恢复。下一篇会补一层生产检查避免缺行情、目标权重错误或日报为空这类问题悄悄进入每日流程。