程序员量化交易实战 37:生成每日运行结果
程序员量化交易实战 37:生成每日运行结果
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
第 36 篇把每日运行输入收束成 DailyRunRequest。
第 37 篇继续往后走:有了请求和运维检查清单以后,系统应该给出一个明确结果,而不是让调用方自己猜能不能执行。

三种结果状态
第一版只保留三种状态。
| 状态 | 含义 |
|---|---|
ready | 检查通过,并且不是 dry-run,可以执行真实动作 |
dry_run_ready | 检查通过,但只允许演练 |
blocked | 至少一个检查项失败 |
这个划分比单纯的 true/false 更有用。dry-run 可以继续生成报告和观察输出,但不应该被当作真实执行。
结果对象
第 37 章新增 app/run_result.py。
@dataclass(frozen=True)
class DailyRunResult:
trade_date: str
status: str
dry_run: bool
failed_checks: tuple[str, ...]
failed_checks 保存失败检查项名称,后面第 39 篇会用它生成处理动作。
从检查清单生成结果
核心逻辑很短。
failed = tuple(item.name for item in checklist.items if not item.passed)
if failed:
status = "blocked"
elif request.dry_run:
status = "dry_run_ready"
else:
status = "ready"
顺序不能反过来。只要检查失败,不管是不是 dry-run,都应该是 blocked。否则演练会掩盖输入问题。
判断是否可继续处理
result_is_actionable() 用于判断结果是否还值得继续生成后续输出。
def result_is_actionable(result: DailyRunResult) -> bool:
return result.status in {"ready", "dry_run_ready"}
演练状态也 actionable,因为它可以继续走报告生成、归档、通知测试等非真实交易动作。
这里要区分两个词:actionable 和 executable。dry_run_ready 是 actionable,因为它还能生成报告、验证通知和观察流程;但它不是 executable,因为不能触发真实动作。ready 才同时具备可处理和可执行的语义。
当前联动运行结果
继续使用同一条命令:
uv run python -m scripts.chapter_examples paper-run-plan
这次示例里,数据缺口检查失败,因此运行结果是 blocked:

注意 dry_run=False 并不会绕过检查清单。只要 failed_checks 非空,状态就必须是 blocked。这能避免“真实运行模式”反而掩盖数据问题。
测试结果分支
运行本章测试:
uv run pytest tests/test_run_result.py tests/test_ops_checklist.py tests/test_run_request.py
测试覆盖:
- 检查通过且
dry_run=False时,状态为ready。 - 检查失败时,状态为
blocked,并保留失败检查项。 - 检查通过但默认 dry-run 时,状态为
dry_run_ready。
本章更新与代码仓库
本章更新内容:
- 新增
app/run_result.py。 - 实现
DailyRunResult。 - 根据请求和运维检查清单生成运行状态。
- 保留失败检查项名称。
- 新增
result_is_actionable()。 - 增加
paper-run-plan联动示例,展示data_gaps如何让运行结果进入 blocked。 - 补充 actionable 与 executable 的区别。
- 新增
tests/test_run_result.py,覆盖 ready、blocked 和 dry-run-ready。
代码仓库:
https://github.com/ax2/zi-quant-platform
本章代码:
git clone https://github.com/ax2/zi-quant-platform.git
cd zi-quant-platform
git checkout chapter-37
uv sync --extra dev
uv run pytest tests/test_run_result.py tests/test_ops_checklist.py tests/test_run_request.py
第 37 章提交为 a588181,tag 为 chapter-37。
本篇小结
运行结果让每日请求有了明确状态。
第 37 篇把检查清单转换成 ready、dry_run_ready 或 blocked。下一篇会给日报归档做索引,方便系统从一堆 JSON 文件里快速找到历史报告。