@错误: 使用序列设置数组元素
我试图最小化下行风险。
我有一个二维数组的收益率形状为(1000, 10),并且组合以$100开始。将每一行中的每个收益率连续复合10次。对所有行都这样做。将每一行的最后一个单元格的值与最后一列值的平均值进行比较。如果该值小于平均值,则保留该值,否则设为零。那么我们将得到一个 (1000, 1) 的数组。最后,我计算这个数组的标准差。
目标是最小化标准差。约束条件:权重需要小于1。
预期回报即权重*收益率应等于一个值(例如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”部分注释掉并在底部调用模拟函数,它就可以正常工作。