程序员量化交易实战 29:从候选列表生成目标权重
程序员量化交易实战 29:从候选列表生成目标权重
古董级程序员,大厂出来后一直在创业公司,现在仍活跃在一线做 AI 相关的开发。这个专栏会把一个 A 股量化平台从 0 到 1 拆开写:数据、策略、回测、模拟盘、提醒和生产化,尽量用真实代码和真实运行结果说话。更完整的更新也会同步到微信公众号「字与码」。
第 19 篇已经能把目标权重转换成调仓计划。但目标权重本身一直是手写的。
第 29 篇先补一个很朴素的策略:从候选股票列表生成等权目标,并控制总仓位和最大标的数。

为什么先用等权
等权不是最优策略,但它有一个优点:容易解释。
在模拟盘早期,权重策略不应该比系统本身更复杂。先用等权把链路跑通,再讨论因子加权、风险预算或行业约束。
常见的权重生成方式不止等权。比如按因子分数加权、按波动率倒数加权、按市值或成交额约束加权、按行业做中性约束。它们都更接近真实策略,但也更容易把错误藏进复杂参数里。等权适合作为第一条基线,因为任何异常都比较容易定位。
策略参数
第 29 章新增 app/target_weight_policy.py。
@dataclass(frozen=True)
class TargetWeightPolicy:
max_symbols: int = 5
gross_exposure: float = 0.8
min_weight: float = 0.01
这三个字段分别控制最多买几只、总仓位上限和最小单票权重。
生成等权目标
targets = build_equal_weight_targets(
["000001.SZ", "600000.SH"],
TargetWeightPolicy(max_symbols=2, gross_exposure=0.6),
)
结果是每只 30%。函数会去重、过滤空 symbol,并按最大标的数截断。
权重归一化
另一类常见输入是外部策略已经给出了权重,但合计超过上限。
normalize_target_weights() 会丢掉无效权重,并把总权重压到 max_total 内。
当前联动运行结果
第 29 篇在 paper-notify 命令里负责把候选股票转换成目标权重:
uv run python -m scripts.chapter_examples paper-notify

示例候选列表里有重复的 000001.SZ。策略先去重,再按 gross_exposure=60% 生成两只股票各 30% 的原始目标,最后用 max_total=55% 把总仓位压到 55%,得到两只股票各 27.5%。
本章更新与代码仓库
本章更新内容:
- 新增
app/target_weight_policy.py。 - 实现等权目标权重策略。
- 支持最大标的数、总仓位、最小权重约束。
- 实现目标权重归一化。
- 增加
paper-notify联动示例,展示候选去重、等权生成和总仓位归一化。 - 补充等权、因子加权、波动率加权等常见权重策略的背景。
- 新增
tests/test_target_weight_policy.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-29
uv sync --extra dev
uv run pytest tests/test_target_weight_policy.py
第 29 章提交为 f71baeb,tag 为 chapter-29。
本篇小结
目标权重策略先保持简单。
第 29 篇把候选列表转换成可解释的等权目标,让调仓计划有了更稳定的输入。下一篇会把价格、生产检查和提醒回执汇总成运行健康报告。
微信公众号
欢迎关注「字与码」
如果这篇文章对你有用,也欢迎在微信里继续关注后续更新。