使用 PuLP 最小化 python 中的两个和

Using PuLP to minimize two sums in python

我正在尝试找到两个指数(股票和债券)的最佳权重,以尽可能地模仿股票 return。 (NOC 股票)。我在设置 PuLP 以最小化平方差之和时遇到问题。

objective 函数: (最小化)(加权股票之和 returns + 加权债券之和 return - 股票 return)^2

其中股票和债券的权重加起来为 1,并且都被限制在 (0,1)

之间

问题是我的 return 都在每日列表中,所以我需要先计算权重并将列表中的所有 return 相乘,然后才能对它们求和,然后将它们用于objective 函数。

from pulp import *
model = LpProblem("Style", LpMinimize)
wSPY = LpVariable("SPYw", lowBound=0,upBound=1, cat ='Continuous') #weights of SPY stock index
wSHY = LpVariable("SHYw", lowBound=0,upBound=1, cat ='Continuous') #weights of SHY bond index
#define Objective Function
model += ((sum(wSPY*SPYretls) + sum(wSHY*SHYretls)) - sum(NOCretls))**2

#SPYretls is the SPY stock index returns in a list
#SHYretls is the SHY stock index returns in a list
#NOCretls is the NOC stock returns in a list

#constraints
model += wSPY >= 0
model += wSHY >= 0
model += wSHY <= 1
model += wSPY <= 1
model.solve()

两件事:

  1. 你不能(据我所知)在 PuLP 中有平方差 objective 函数。它只能处理线性程序 - 因此在决策变量中有约束和 objectives 是线性的。但我认为你想要的是最小化绝对差——这可以在线性程序中完成,最简单的方法是创建一个辅助变量,它被限制为大于正差和负差,即:

    absDiff = LpVariable("absDiff", lowBound=0, cat ='Continuous')

然后您可以添加约束,例如:

`model += absDiff  >= sum_1 - sum_2`
`model += absDiff  >= sum_2 - sum_1`
  1. 对于 lists/sums 你可以做类似
  2. 的总和

lpSum([wSPY*i for i in SPYretls])

这是利用 python 的列表理解。