@错误:使用序列设置数组元素
我正试图将下行风险最小化
我有一个回报形状的二维数组(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部分,并调用底部的模拟函数,它工作正常
在此情况下,您需要考虑一个不同的优化器,如^ {CD1>}。Gekko目前不支持函数
np.std()
。Gekko将模型编译成字节码,以便自动区分,因此您需要将问题放入支持的表单中。Gekko的方法有几个优点,特别是对于大规模或非线性问题。对于少于100个变量和近似线性约束的小问题,像scipy.minimize.optimize
这样的优化器通常是可行的选择。以下是您的问题和解决方案:这将产生具有最佳值的解决方案
sol
w=sol.x
:相关问题 更多 >
编程相关推荐