程序员量化交易实战 24:把模拟盘账户状态保存下来
原创 · 约 7 分钟阅读 · 阅读 --
Last updated on

程序员量化交易实战 24:把模拟盘账户状态保存下来

作者: Alex Xiang


程序员量化交易实战 24:把模拟盘账户状态保存下来

古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。

第 23 篇串起了每日模拟盘流程。但如果程序重启后账户状态丢了,这条流程就只能算演示。

第 24 篇先用 JSON 文件保存和恢复模拟盘账户状态。不是最终生产方案,但足够让本地实战项目连续跑起来。

ZiCode 工程师保存模拟盘账户状态

只保存基础状态

第 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")

实现只用标准库 jsonpathlib。等模拟盘状态更复杂,再迁移到数据库也不迟。

当前联动运行结果

paper-ops 命令会在临时目录里保存一次账户状态,再从 JSON 恢复账户,然后继续运行每日流程:

uv run python -m scripts.chapter_examples paper-ops

paper-ops 命令生成的账户状态保存和恢复结果

这个示例刻意只保存 cashpositions。交易日、最新价、风控结论和推荐摘要都不写入账户状态文件,因为这些内容应该随每日行情变化重新计算。这样做也方便后续把 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 章提交为 3c3c52b,tag 为 chapter-24

本篇小结

能算一天,不等于能连续运行。

第 24 篇让模拟盘账户状态可以落盘和恢复。下一篇会补一层生产检查,避免缺行情、目标权重错误或日报为空这类问题悄悄进入每日流程。

微信公众号

欢迎关注「字与码」

如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。

微信公众号字与码二维码