当前位置: 首页 > news >正文

程序员量化交易实战 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")

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

当前联动运行结果

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

uv run python -m scripts.chapter_examples 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 篇让模拟盘账户状态可以落盘和恢复。下一篇会补一层生产检查,避免缺行情、目标权重错误或日报为空这类问题悄悄进入每日流程。

http://www.jsqmd.com/news/1094482/

相关文章:

  • 如何轻松掌控电脑风扇:FanControl完整指南助你实现静音与性能的完美平衡
  • 从点击图标到 HomeActivity.onCreate() 完整链路
  • 做自媒体,我是怎么用花生AI绕过剪辑这道坎的
  • 光刻胶用增韧剂及其合成技术:苯乙烯-丁二烯嵌段共聚物(SBS)、聚丙二醇二缩水甘油醚、聚甲基丙烯酸甲酯、聚四氢呋喃丙烯酸脂(上)
  • 2026ChatGPT、DEEPSEEK、豆包等AI搜索结果优化方法?
  • ChatGPT API文档隐藏功能曝光:`response_format`、`tool_choice`与`parallel_tool_calls`三大未公开能力(附实测代码库)
  • 无广告待办工具盘点,2026 多款清单软件优劣分析
  • 使用低代码爬虫软件自动化采集电商商品数据
  • 手把手教你用8款AI论文平台,极速搞定各类论文
  • 从 AI Agent 到具身智能:当智能开始拥有“身体”
  • AI 提速 3 倍,交付反而慢了?
  • DeepEval终极指南:5分钟掌握AI模型评估框架的完整配置
  • Android应用安全实践:SafetyNet机制解析与safetynett库集成指南
  • 网安新手攻克 Kali 难题大全!各类高频报错一次性给出解决方案,搞定环境问题稳步进阶,冲刺高薪安全赛道
  • 肌理质感艺术木纹与仿石铝单板轻盈演绎
  • 5分钟免费实现VR视频转2D的终极指南:VR-Reversal完整教程
  • QNAP TS-h2490FU 2U 全闪存架构在精密电子贴片制造网中
  • 轻量级图书馆借阅管理系统(读者管理、借还书记录)
  • Minecraft光影终极指南:用Revelation打造电影级方块世界
  • 从单点工具到全链路智能体:跨境电商自动化的下一步:2026全链路AI Agent架构深度拆解与落地指南
  • 【工具推荐】剁手前先泼盆冷水!我做了一个让你理性消费的神器——消费泼冷水计算器
  • 3个MeEdu二次开发实战技巧:从API调用到Hook扩展的深度定制指南
  • 5步掌握Res-Downloader:跨平台资源下载工具全面指南
  • Audition软件安装步骤(附安装包)Audition AU2026 超详细下载安装教程
  • CAD看图入门教程:4步掌握文件新建、打开、保存、关闭基础操作
  • 2026年小程序和网站到底有什么区别?企业到底该做哪个?
  • 【那黎宣大学主办 | IEEE出版 | 连续2届稳定EI检索,往届快至会后4个月EI检索 |支持latex和word双通道投稿】第三届图像处理、多媒体技术与机器学习国际学术会议(IPMML 2026)
  • Vulnhuntr架构解析:LLM与符号查找器如何革新自动化漏洞挖掘
  • 企业级Python自动化利器:we-work-bot企业微信机器人框架深度解析
  • UltraStar Deluxe终极指南:免费开源卡拉OK游戏的完全探索