使用 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()
两件事:
你不能(据我所知)在 PuLP
中有平方差 objective 函数。它只能处理线性程序 - 因此在决策变量中有约束和 objectives 是线性的。但我认为你想要的是最小化绝对差——这可以在线性程序中完成,最简单的方法是创建一个辅助变量,它被限制为大于正差和负差,即:
absDiff = LpVariable("absDiff", lowBound=0, cat ='Continuous')
然后您可以添加约束,例如:
`model += absDiff >= sum_1 - sum_2`
`model += absDiff >= sum_2 - sum_1`
- 对于 lists/sums 你可以做类似
的总和
lpSum([wSPY*i for i in SPYretls])
这是利用 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()
两件事:
你不能(据我所知)在
PuLP
中有平方差 objective 函数。它只能处理线性程序 - 因此在决策变量中有约束和 objectives 是线性的。但我认为你想要的是最小化绝对差——这可以在线性程序中完成,最简单的方法是创建一个辅助变量,它被限制为大于正差和负差,即:absDiff = LpVariable("absDiff", lowBound=0, cat ='Continuous')
然后您可以添加约束,例如:
`model += absDiff >= sum_1 - sum_2`
`model += absDiff >= sum_2 - sum_1`
- 对于 lists/sums 你可以做类似 的总和
lpSum([wSPY*i for i in SPYretls])
这是利用 python 的列表理解。