程序员量化交易实战 18:模拟盘也要有风控检查
程序员量化交易实战 18:模拟盘也要有风控检查
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
纸面模拟盘不会真的下单,但它仍然需要风控。
原因很简单:模拟盘的意义不是让策略随便跑,而是提前暴露策略在账户层面的风险行为。

第一版风控规则
第 18 篇新增 app/paper_risk.py,先实现三类检查:
- 总仓位是否过高。
- 现金缓冲是否太低。
- 单只股票权重是否超过上限。
这里的风控不是预测下跌,而是约束账户行为。常见风控指标可以先从三类入手:仓位暴露、集中度和流动性。本文先做仓位暴露和集中度,流动性会留到后面接入成交量、换手率和停牌状态时再处理。
风控报告
风控结果不是一个布尔值,而是 PaperRiskReport:
@dataclass(frozen=True)
class PaperRiskReport:
passed: bool
severity: str
violations: tuple[PaperRiskViolation, ...]
severity 当前有三种:ok、warning、blocker。这样后续通知可以区分普通提示和需要阻断的风险。
为什么要保留违规项
违规项包含 code、message、value、limit、severity 和可选 symbol。
这让风控不只是告诉你“不通过”,还会说明是哪条规则、当前值是多少、阈值是多少。
PaperRiskViolation(
code="position_too_large",
message="单只股票持仓权重过高",
value=0.72,
limit=0.35,
severity="blocker",
symbol="000001.SZ",
)
这类结构后面可以直接进入日报、飞书消息或风控看板。
当前主线联动运行
paper-flow 示例会把第 17 篇生成的快照送进风控检查:
uv run python -m scripts.chapter_examples paper-flow
第 18 篇对应输出如下:

这次样例里单只股票权重是 80.74%,超过 35% 上限,因此风控结果是 blocker。这里不是说 000001.SZ 不能买,而是说明模拟盘账户过度集中。风控检查关注的是账户结构,不是单只股票观点。
本章更新与代码仓库
本章更新内容:
- 新增
app/paper_risk.py。 - 实现总仓位、现金缓冲和单票权重检查。
- 输出
PaperRiskReport和结构化违规项。 - 新增
tests/test_paper_risk.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-18
uv sync --extra dev
uv run pytest tests/test_paper_risk.py
第 18 章提交为 5b381f3,tag 为 chapter-18。
本篇小结
风控不应该等到真实交易前才出现。
第 18 篇把模拟盘账户快照接入风控检查,并输出可读、可测试的违规报告。下一篇会把目标权重转成调仓计划,让策略建议进入可执行前的计划层。
微信公众号
欢迎关注「字与码」
如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。