程序员量化交易实战 29:从候选列表生成目标权重

第 19 篇已经能把目标权重转换成调仓计划。但目标权重本身一直是手写的。

第 29 篇先补一个很朴素的策略:从候选股票列表生成等权目标,并控制总仓位和最大标的数。

ZiCode 工程师规划目标权重

为什么先用等权

等权不是最优策略,但它有一个优点:容易解释。

在模拟盘早期,权重策略不应该比系统本身更复杂。先用等权把链路跑通,再讨论因子加权、风险预算或行业约束。

常见的权重生成方式不止等权。比如按因子分数加权、按波动率倒数加权、按市值或成交额约束加权、按行业做中性约束。它们都更接近真实策略,但也更容易把错误藏进复杂参数里。等权适合作为第一条基线,因为任何异常都比较容易定位。

策略参数

第 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

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 篇把候选列表转换成可解释的等权目标,让调仓计划有了更稳定的输入。下一篇会把价格、生产检查和提醒回执汇总成运行健康报告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值