程序员量化交易实战 37:生成每日运行结果
原创 · 约 9 分钟阅读 · 阅读 --
Last updated on

程序员量化交易实战 37:生成每日运行结果

作者: Alex Xiang


程序员量化交易实战 37:生成每日运行结果

古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。

第 36 篇把每日运行输入收束成 DailyRunRequest

第 37 篇继续往后走:有了请求和运维检查清单以后,系统应该给出一个明确结果,而不是让调用方自己猜能不能执行。

ZiCode 工程师生成每日运行结果

三种结果状态

第一版只保留三种状态。

状态含义
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

paper-run-plan 命令生成的每日运行结果

注意 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 篇把检查清单转换成 readydry_run_readyblocked。下一篇会给日报归档做索引,方便系统从一堆 JSON 文件里快速找到历史报告。