如何求解预测向量非负权重线性组合最优拟合目标,基于Python quadprog实现
带约束的预测权重求解实现方法
问题转化为二次规划形式
你要解决的是带约束的最小均方误差问题,约束条件为:
- 所有权重非负:w_j ≥ 0, j=1,2,...,n
- 权重和为1:Σw_j = 1
该问题属于典型的带约束二次规划问题,quadprog库求解的标准二次规划形式为:
最小化:
0.5 * x^T G x + a^T x
约束:C^T x ≥ b
其中meq参数指定前meq个约束为等式约束,剩余为不等式约束。
对应参数映射
对应你的权重求解需求,各参数映射关系如下:
- 设预测矩阵
F维度为[n, N],n为预测源数量,N为样本数量,目标向量t维度为[N] - 目标函数中的
G:2 * (F @ F.T) + ε * I,加ε=1e-8的单位矩阵是为了避免数值计算时矩阵奇异 - 目标函数中的
a:-2 * (F @ t) - 约束矩阵
C:第一列为全1向量(对应权重和为1的等式约束),后续列是单位矩阵(对应每个权重非负的不等式约束) - 约束值向量
b:第一个元素为1,其余元素为0 meq=1:指定第一个约束为等式约束
完整代码示例
import numpy as np import quadprog # 示例数据 target = np.array([1.0, 1.02, 1.01, 1.04]) forecasts = np.array([ [0.9, 0.91, 0.92, 0.91], [1.1, 1.11, 1.13, 1.11], [1.21, 1.23, 1.21, 1.23] ]) n_pred = forecasts.shape[0] # 构造二次规划参数 G = forecasts @ forecasts.T G = G + 1e-8 * np.eye(n_pred) # 正则化避免矩阵奇异 a = -2 * forecasts @ target # 构造约束条件 C = np.hstack([np.ones((n_pred, 1)), np.eye(n_pred)]) b = np.zeros(n_pred + 1) b[0] = 1 # 求解权重 weights, *other_outputs = quadprog.solve_qp(G, a, C, b, meq=1) print("求解得到的权重:", weights.round(4)) # 输出结果近似为 [0.5, 0.5, 0.],符合预期
内容的提问来源于stack exchange,提问作者Matthew Strawbridge
相关产品推荐
相关产品推荐

