当前位置: 首页 > 知识库问答 >
问题:

试图用GEKKO求解这个非线性优化,得到了这个误差

童浩言
2023-03-14

@错误:使用序列设置数组元素

我试图确定下行风险。

我有一个回报形状的二维数组(1000,10),投资组合从100美元开始。在一行中每一个回报复合10次。对所有行都这样做。将每一行的最后一个单元格的值与最后一列值的平均值进行比较。如果值小于平均值或为零,则保留该值。所以我们将有一个(1000,1)数组。最后我找到了它的均方差。

目标是最小化均方差。约束:权重需要小于1

预期回报,即wt*ret应等于7%之类的值。我必须对7%、8%或10%这样的两个值这样做。

wt = np.array([0.4, 0.3, 0.3])

cov = array([[0.00026566, 0.00016167, 0.00011949],
   [0.00016167, 0.00065866, 0.00021662],
   [0.00011949, 0.00021662, 0.00043748]])

ret =[.098, 0.0620,.0720]
iterations = 10000

return_sim = np.random.multivariate_normal(ret, cov, iterations)

def simulations(wt):

    downside =[]
    fund_ret =np.zeros((1000,10))
    prt_ret = np.dot(return_sim , wt)

    re_ret = np.array(prt_ret).reshape(1000, 10) #10 years

    for m in range(len(re_ret)):
        fund_ret[m][0] = 100 * (1 + re_ret[m][0])  #start with $100
        for n in range(9):

            fund_ret[m][n+1] = fund_ret[m][n]* (1 + re_ret[m][n+1])

    mean = np.mean(fund_ret[:,-1])  #just need the last column and all rows

    for i in range(1000): 
        downside.append(np.maximum((mean - fund_ret[i,-1]), 0))

    return np.std(downside)

b = GEKKO()
w = b.Array(b.Var,3,value=0.33,lb=1e-5, ub=1)
b.Equation(b.sum(w)<=1)
b.Equation(np.dot(w,ret) == .07) 
b.Minimize(simulations(w))
b.solve(disp=False)

#simulations(wt)

如果您注释掉gekko部分并调用底部的模拟函数,它就可以正常工作

共有1个答案

汝宏伯
2023-03-14

在这种情况下,您需要考虑一个不同的优化器,例如scipy.minimize.optimize。函数np.std()目前在Gekko中不受支持。Gekko将模型编译成字节码以进行自动微分,因此您需要将问题拟合到受支持的形式中。Gekko的方法有几个优点,尤其是对于大规模或非线性问题。对于少于100个变量和几乎线性约束的小问题,优化器例如scipy.minimize.optimize通常是一个可行的选择。这是您的解决方案问题:

import numpy as np
from scipy.optimize import minimize

wt = np.array([0.4, 0.3, 0.3])

cov = np.array([[0.00026566, 0.00016167, 0.00011949],
   [0.00016167, 0.00065866, 0.00021662],
   [0.00011949, 0.00021662, 0.00043748]])

ret =[.098, 0.0620,.0720]
iterations = 10000
return_sim = np.random.multivariate_normal(ret, cov, iterations)

def simulations(wt):
    downside =[]
    fund_ret =np.zeros((1000,10))
    prt_ret = np.dot(return_sim , wt)
    re_ret = np.array(prt_ret).reshape(1000, 10) #10 years

    for m in range(len(re_ret)):
        fund_ret[m][0] = 100 * (1 + re_ret[m][0]) #start with $100
        for n in range(9):
            fund_ret[m][n+1] = fund_ret[m][n]* (1+re_ret[m][n+1])

    #just need the last column and all rows
    mean = np.mean(fund_ret[:,-1])  

    for i in range(1000): 
        downside.append(np.maximum((mean - fund_ret[i,-1]), 0))

    return np.std(downside)

b = (1e-5,1); bnds=(b,b,b)
cons = ({'type': 'ineq', 'fun': lambda x:  sum(x)-1},\
        {'type': 'eq',   'fun': lambda x:  np.dot(x,ret)-.07})
sol = minimize(simulations,wt,bounds=bnds,constraints=cons)
w = sol.x
print(w)

这将产生具有最佳值的解。x:

     fun: 6.139162309118155
     jac: array([ 8.02691203, 10.04863131,  9.49171901])
 message: 'Optimization terminated successfully.'
    nfev: 33
     nit: 6
    njev: 6
  status: 0
 success: True
       x: array([0.09741111, 0.45326888, 0.44932001])
 类似资料:
  • 函数“def gekko_obj(x)”适用于任何x值。 但是,当m作为Gekko目标函数调用时,它会失败。Obj(gekko_obj(x))。 文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第710行,在runfile execfile(文件名,命名空间)中 文件“/anaconda3/

  • 我正在尝试使用flutter构建一个应用程序。当我尝试运行此推荐“flutter build appbundle”时,我收到以下错误: 失败:构建失败,但有例外。 > 其中:构建文件'F:\azabaza_app\myapp\android\app\build.gradle'行:28 错误:评估项目“app”时出现问题。 无法为FlutterExtension类型的扩展“flutter”获取未知属

  • java.lang.IllegalStateException:未能加载ApplicationContext 原因:org . spring framework . beans . factory . unsatisfieddependencyexception:创建在URL[jar:file:/C:/Users/MDI vya/. m2/repository/io/spring fox/spri

  • Im使用okhttp 2.5.0,Im获取一张pic,然后将其转换为base 64格式,然后将其作为post变量发送到服务器,然后将其解码回jpg格式并保存到服务器....当我使用像1兆像素(0.5MB)的小图像时,它可以完美地工作······但是当我增加分辨率时,这个异常发生了...

  • 在C:\用户\戴尔\桌面\项目\my-app中创建新的React应用。 安装包。这可能需要几分钟。使用cra模板安装反应、反应-多姆和反应-脚本... NPM ERR!最大调用堆栈大小超过npm ERR!超出最大调用堆栈大小 NPM ERR!此运行的完整日志可以在npm ERR中找到!C:\用户\戴尔\AppData\漫游\npmcache_logs\2020-09-05T07_43_27_276

  • 我正在解决这个优化问题,我需要计算出我需要打开多少个配送中心,以满足12家公司设施的需求,同时最小化运输成本。运输成本只是配送中心之间的距离乘以每英里成本,然而在这个问题中,每英里成本是一美元。我有5个选择,分别是波士顿、纳舒亚、普罗维登斯、斯普林菲尔德和伍斯特,这5个是12家公司设施的一部分。 我解决了这个问题,得到了正确的答案,但是后来我试图在同一个代码中添加两个约束,我得到的答案是不正确的。