原创 · 约 6 分钟阅读 · 阅读 --
Last updated on
程序员量化交易实战 19:从目标权重生成调仓计划
程序员量化交易实战 19:从目标权重生成调仓计划
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
模拟盘里最容易混淆的一件事,是把“策略目标”直接当成“账户执行”。
第 19 篇刻意在两者之间加一层:调仓计划。它只给出买卖建议,不直接修改账户状态。

调仓计划的输入
第 19 章新增 app/rebalance_plan.py。
输入包括:
- 当前模拟盘账户。
- 最新价格。
- 目标权重。
- 最小调仓金额。

输出买卖建议
输出对象是 RebalancePlan,里面包含一组 RebalanceOrderPlan:
@dataclass(frozen=True)
class RebalanceOrderPlan:
symbol: str
side: str
shares: int
price: float
target_weight: float
current_weight: float
delta_value: float
它保留当前权重、目标权重和差额金额,方便后续解释为什么建议买入或卖出。
为什么不直接下单
调仓计划不是执行器。
它不扣现金,不改持仓,也不假装成交。真实系统里,计划还要经过风控、人工确认、可交易性检查和撮合执行。即使在模拟盘里,把计划和执行分开也能减少很多调试成本。
A 股一手约束
计划函数会把股数压到 100 股一手:
def _lot_shares(raw_shares: float) -> int:
lots = int(abs(raw_shares) // 100)
return lots * 100
这和第 4 篇的交易规则保持一致。后续如果要支持卖出零股或更细的交易规则,可以在这一层继续扩展。
本章更新与代码仓库
本章更新内容:
- 新增
app/rebalance_plan.py。 - 实现基于当前权重和目标权重的调仓计划。
- 支持最小调仓金额过滤、缺失价格跳过和 A 股 100 股一手约束。
- 新增
tests/test_rebalance_plan.py,覆盖买卖建议和小额变动跳过。
代码仓库:
https://github.com/ax2/zi-quant-platform
本章代码:
git clone https://github.com/ax2/zi-quant-platform.git
cd zi-quant-platform
git checkout chapter-19
uv sync --extra dev
uv run pytest tests/test_rebalance_plan.py
第 19 章提交为 b655c37,tag 为 chapter-19。
本篇小结
策略目标不能直接等同于账户动作。
第 19 篇把目标权重转换成可解释、可测试、尚未执行的调仓计划。下一篇会把账户快照、风控报告和调仓计划合成一条模拟盘日报。