- 每个优化器文件定义一个继承自
BaseOptimizer的类,并重写_build_context(可选)与必选的_calc_weights两个钩子方法。 - 每个策略模块同时提供与模块同名的
optimize(ret, pos, dates, ...)函数作为对外入口,内部实例化对应优化器并调用其optimize。 - 上下文构建中遇到 NaN、非有限值或样本不足时返回
None,使BaseOptimizer.optimize跳过该日期的调仓。 - 权重输出通过基类的
_normalize或_equal_weight工具归一化为和为 1 的非负向量,失败时回退到等权。 - 滚动历史严格使用
ret.loc[ret.index < dt]切片,避免在决策 bar 开盘执行时泄露当日收盘价收益。 - 长只约束通过 SLSQP 的
bounds=[(0.0, 1.0)] * n与w.sum() - 1.0 == 0等式约束共同表达。