我试图找到两个指数(股票和债券)的最佳权重,以尽可能地模仿股票回报。股票(NOC)。我在设置PuLP以最小化平方差的总和时遇到了麻烦。
目标函数:(最小化)(股票加权收益之和+债券加权收益之和-股票收益)^2
,其中股票和债券的权重加为1,并且都被约束在(0,1)之间
问题是我的收益都在每日列表中,所以我需要取权重并乘以列表中的所有收益,然后才能将它们求和,然后将它们用于目标函数。
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
中有一个平方差目标函数。它只能处理线性程序——所以约束和目标在决策变量中是线性的。但我认为你想要的是最小化绝对差-这可以在线性程序中完成,最简单的方法是创建一个辅助变量,它被限制为大于正差和负差,即:absDiff = LpVariable("absDiff", lowBound=0, cat ='Continuous')
然后你可以添加如下约束:
`model += absDiff >= sum_1 - sum_2`
`model += absDiff >= sum_2 - sum_1`
- 对于列表/总和,你可以像 那样输入sum
lpSum([wSPY*i for i in SPYretls])
这是在利用python的列表推导。