程序员量化交易实战 28:把价格输入抽象成价格源
原创 · 约 7 分钟阅读 · 阅读 --
Last updated on

程序员量化交易实战 28:把价格输入抽象成价格源

作者: Alex Xiang


程序员量化交易实战 28:把价格输入抽象成价格源

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

到目前为止,每日流程里的价格都是调用方传进来的 last_prices 字典。

这对测试很方便,但对系统边界还不够清楚。第 28 篇新增价格源抽象,把“需要哪些价格”和“从哪里取价格”分开。

ZiCode 工程师接入模拟盘价格源

价格源要解决什么

模拟盘至少需要两类股票价格:

  • 当前持仓里的股票。
  • 目标权重里准备买入或继续观察的股票。

如果缺了任何一个,调仓和快照都可能失真。

这里的价格不是逐笔成交价,也不是盘口五档,而是每日流程用来估算账户权益和目标仓位的“最近可用价格”。在日频模拟盘里,它通常可以是收盘价、复权收盘价或经过清洗后的最新价。关键是口径要稳定,不能今天用收盘价、明天又混入盘中价。

价格快照

第 28 章新增 app/price_providers.py

@dataclass(frozen=True)
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_date=today)

静态实现只服务于测试和文章演示。后续真实行情接入时,可以实现同一个协议,不影响每日流程的上层结构。

当前联动运行结果

paper-notify 命令会先合并当前持仓和目标权重里的 symbol,再向 StaticPriceProvider 请求价格:

uv run python -m scripts.chapter_examples paper-notify

paper-notify 命令生成的价格源运行结果

这次运行需要 000001.SZ600519.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 章提交为 985e045,tag 为 chapter-28

本篇小结

价格输入不能一直散落在调用方。

第 28 篇把价格源抽象出来,让缺失价格成为可检查状态。下一篇会继续补目标权重策略,让每日流程不再只靠手写权重字典。

微信公众号

欢迎关注「字与码」

如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。

微信公众号字与码二维码