【问题标题】:Using PuLP to minimize two sums in python使用 PuLP 在 python 中最小化两个和
【发布时间】:2021-08-14 02:44:49
【问题描述】:

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

【问题讨论】:

    标签: python optimization finance pulp


    【解决方案1】:

    两件事:

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

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

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

    `model += absDiff  >= sum_1 - sum_2`
    `model += absDiff  >= sum_2 - sum_1`
    
    1. 对于列表/总和,您可以进行类似的总和

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

    这是利用pythons列表理解。

    【讨论】:

    • 感谢您的帮助。看来我需要找到一个可以处理平方差的求解器
    • 嗯....我不确定您的应用程序的详细信息。最小化abs(x-y) 的决策变量的组合与最小化(x-y)^2 的决策变量的组合相同,因此除非有理由需要平方差(例如与其他差异或目标函数的其他组件进行比较),那么您可能会发现最小化绝对差异也同样有效?
    • 我最终改用 scipy 库并让它运行起来。我一会儿把代码贴出来
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多