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

📅 2026/7/7 12:25:30
程序员量化交易实战 37:生成每日运行结果
第 36 篇把每日运行输入收束成DailyRunRequest。第 37 篇继续往后走有了请求和运维检查清单以后系统应该给出一个明确结果而不是让调用方自己猜能不能执行。三种结果状态第一版只保留三种状态。状态含义ready检查通过并且不是 dry-run可以执行真实动作dry_run_ready检查通过但只允许演练blocked至少一个检查项失败这个划分比单纯的 true/false 更有用。dry-run 可以继续生成报告和观察输出但不应该被当作真实执行。结果对象第 37 章新增app/run_result.py。dataclass(frozenTrue) 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_runFalse并不会绕过检查清单。只要failed_checks非空状态就必须是blocked。这能避免“真实运行模式”反而掩盖数据问题。测试结果分支运行本章测试uv run pytest tests/test_run_result.py tests/test_ops_checklist.py tests/test_run_request.py测试覆盖检查通过且dry_runFalse时状态为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 章提交为a588181tag 为chapter-37。本篇小结运行结果让每日请求有了明确状态。第 37 篇把检查清单转换成ready、dry_run_ready或blocked。下一篇会给日报归档做索引方便系统从一堆 JSON 文件里快速找到历史报告。