程序员量化交易实战 21:把模拟盘结果压成推荐摘要
程序员量化交易实战 21:把模拟盘结果压成推荐摘要
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
第 20 篇已经能生成模拟盘日报。但日报更像“状态说明”,还不是一个适合复盘和提醒的动作摘要。
第 21 篇新增推荐摘要,把风控、调仓和持仓状态压成一个清晰动作:继续观察、检查调仓,或者优先降风险。

为什么要多一层推荐摘要
风控报告告诉你哪里有问题,调仓计划告诉你可能要买卖什么,账户快照告诉你当前状态。
这些信息都重要,但提醒系统不适合把所有结构原样推给人。人每天更需要先看到一句话:今天需要做什么。
在量化系统里,这一层通常不是“交易信号”,而是“运营动作”。交易信号回答买卖方向,运营动作回答今天要不要人工介入、是否需要降低风险、是否可以继续观察。把这两者分开,可以避免提醒系统把一个技术信号包装成不该有的投资建议。
推荐对象
第 21 章新增 app/recommendations.py。
@dataclass(frozen=True)
class PaperRecommendation:
action: str
severity: str
summary: str
reasons: tuple[str, ...]
order_count: int
这里的 action 先保持简单:REDUCE_RISK、REBALANCE、HOLD。
REDUCE_RISK:先处理阻断级风险,比如单票过度集中或总仓位过高。REBALANCE:没有阻断级风险,但已有调仓计划需要检查。HOLD:没有明显风险,也没有达到最小调仓阈值,继续观察。
优先级
推荐逻辑的关键是优先级。
阻断级风控永远高于调仓建议。也就是说,如果账户已经触发单票超限或总仓位过高,系统不应该一边提醒你调仓,一边淡化风险。
if risk_report.severity == "blocker":
action = "REDUCE_RISK"
elif rebalance_plan.orders:
action = "REBALANCE"
else:
action = "HOLD"
这个判断很朴素,但它把模拟盘的动作边界写进了代码。
当前联动运行结果
现在可以通过第 21-25 篇共用的示例命令查看推荐摘要:
uv run python -m scripts.chapter_examples paper-ops
这条命令会先构造一个包含两只股票的模拟盘账户,再依次执行输入检查、状态保存、每日流程、推荐摘要、复盘汇总和输出检查。推荐摘要部分如下:

这次运行中,600519.SH 的持仓权重达到 49.90%,超过默认单票上限,因此推荐动作是 REDUCE_RISK。这里虽然也有一条调仓计划,但推荐层不会把它展示成普通调仓,而是优先提示风险处理。
本章更新与代码仓库
本章更新内容:
- 新增
app/recommendations.py。 - 实现模拟盘推荐摘要对象。
- 将快照、风控报告和调仓计划合成推荐动作。
- 增加
paper-ops联动示例,展示推荐摘要在完整模拟盘日流程里的输出。 - 补充推荐动作和交易信号的边界说明。
- 新增
tests/test_recommendations.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-21
uv sync --extra dev
uv run pytest tests/test_recommendations.py
第 21 章提交为 8ede593,tag 为 chapter-21。
本篇小结
推荐摘要不是预测收益,也不是投资建议。
第 21 篇只是把模拟盘内部状态整理成更适合人阅读的动作摘要。下一篇会把这些结果落到每日复盘记录里。
微信公众号
欢迎关注「字与码」
如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。