原创 · 约 6 分钟阅读 · 阅读 --
Last updated on
程序员量化交易实战 16:先把模拟盘账本写清楚
程序员量化交易实战 16:先把模拟盘账本写清楚
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
第 15 篇完成了策略晋升门禁。通过门禁不等于可以真实交易,它只表示这个候选策略有资格进入更慢、更保守的纸面模拟盘观察。
第 16 篇先不做复杂撮合,也不接券商接口,只做一件事:把模拟盘账户账本写清楚。

为什么从账本开始
模拟盘的第一层可信度来自账本。
如果买入后现金没有扣对,卖出后持仓没有减对,手续费没有算进成本,后面的权益曲线、风控、调仓提醒都会建立在错误状态上。

账户状态
第 16 章新增 app/paper_ledger.py,核心对象很少:
@dataclass(frozen=True)
class PaperAccountState:
cash: float
positions: dict[str, PaperPositionState] = field(default_factory=dict)
持仓只保留当前需要的字段:代码、股数、平均成本和已实现盈亏。这里没有数据库,也没有异步任务,是一个纯函数账本,便于测试和复用。
执行买卖
下单入口是 apply_paper_order()。
它会复用第 4 篇的 A 股交易规则:买卖股数按 100 股一手处理,买入检查现金,卖出检查可用持仓,并使用同一套手续费估算函数。
execution = apply_paper_order(
account,
trade_date=date(2026, 1, 8),
symbol="000001.SZ",
side="buy",
price=10.0,
shares=1234,
)
这个订单会被规范成 1200 股。账本返回 PaperExecution,其中既包含本次成交,也包含成交后的新账户状态。
市值和权益
账本还提供两个小函数:
account_market_value(account, last_prices)
account_total_equity(account, last_prices)
它们暂时只用最新价估算持仓市值。后续第 17 篇会把这些值组织成更完整的账户快照。
本章更新与代码仓库
本章更新内容:
- 新增
app/paper_ledger.py。 - 实现模拟盘账户、持仓、成交执行结果和买卖更新逻辑。
- 复用 A 股交易规则和手续费估算。
- 新增
tests/test_paper_ledger.py,覆盖买入、现金不足、卖出、无持仓卖出和权益计算。
代码仓库:
https://github.com/ax2/zi-quant-platform
本章代码:
git clone https://github.com/ax2/zi-quant-platform.git
cd zi-quant-platform
git checkout chapter-16
uv sync --extra dev
uv run pytest tests/test_paper_ledger.py
第 16 章提交为 936cb5c,tag 为 chapter-16。
本篇小结
模拟盘不是先做界面,也不是先做提醒。
第 16 篇把账户现金、持仓、成交和权益计算写成了可测试的账本函数。下一篇会在账本之上生成账户快照,让模拟盘状态可以被展示、风控和复盘。