程序员量化交易实战 28:把价格输入抽象成价格源
到目前为止每日流程里的价格都是调用方传进来的last_prices字典。这对测试很方便但对系统边界还不够清楚。第 28 篇新增价格源抽象把“需要哪些价格”和“从哪里取价格”分开。价格源要解决什么模拟盘至少需要两类股票价格当前持仓里的股票。目标权重里准备买入或继续观察的股票。如果缺了任何一个调仓和快照都可能失真。这里的价格不是逐笔成交价也不是盘口五档而是每日流程用来估算账户权益和目标仓位的“最近可用价格”。在日频模拟盘里它通常可以是收盘价、复权收盘价或经过清洗后的最新价。关键是口径要稳定不能今天用收盘价、明天又混入盘中价。价格快照第 28 章新增app/price_providers.py。dataclass(frozenTrue) class PriceSnapshot: trade_date: date prices: dict[str, float] missing_symbols: tuple[str, ...]缺失价格被明确放进missing_symbols而不是悄悄忽略。静态价格提供者provider StaticPriceProvider({000001.SZ: 10.0}) snapshot provider.get_last_prices([000001.SZ, 600000.SH], trade_datetoday)静态实现只服务于测试和文章演示。后续真实行情接入时可以实现同一个协议不影响每日流程的上层结构。当前联动运行结果paper-notify命令会先合并当前持仓和目标权重里的 symbol再向StaticPriceProvider请求价格uv run python -m scripts.chapter_examples paper-notify这次运行需要000001.SZ和600519.SH两个价格静态价格源都返回了所以missing_symbols()。如果真实价格源缺失某只股票后续生产检查和健康报告就能把问题显式暴露出来。本章更新与代码仓库本章更新内容新增app/price_providers.py。定义PriceProvider协议和PriceSnapshot。实现StaticPriceProvider。新增collect_required_price_symbols()合并持仓和目标权重所需价格。增加paper-notify联动示例展示价格需求合并、静态取价和缺失价格检查。补充日频模拟盘里价格口径稳定性的背景说明。新增tests/test_price_providers.py覆盖价格命中、缺失和 symbol 合并。代码仓库https://github.com/ax2/zi-quant-platform本章代码git clone https://github.com/ax2/zi-quant-platform.git cd zi-quant-platform git checkout chapter-28 uv sync --extra dev uv run pytest tests/test_price_providers.py第 28 章提交为985e045tag 为chapter-28。本篇小结价格输入不能一直散落在调用方。第 28 篇把价格源抽象出来让缺失价格成为可检查状态。下一篇会继续补目标权重策略让每日流程不再只靠手写权重字典。