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



我试图找到两个指数(股票和债券)的最佳权重,以尽可能地模仿股票回报。股票(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()

两件事:

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

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

然后你可以添加如下约束:

`model += absDiff  >= sum_1 - sum_2`
`model += absDiff  >= sum_2 - sum_1`
  1. 对于列表/总和,你可以像
  2. 那样输入sum

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

这是在利用python的列表推导。

相关内容

  • 没有找到相关文章

最新更新