我正在运行以下最小化:
from scipy.optimize import minimize
import numpy as np
import math
import matplotlib.pyplot as plt
### objective function ###
def Rlzd_Vol1(w1, S):
L = len(S) - 1
m = len(S[0])
# Compute log returns, size (L, m)
LR = np.array([np.diff(np.log(S[:,j])) for j in xrange(m)]).T
# Compute weighted returns
w = np.array([w1, 1.0 - w1])
R = np.array([np.sum(w*LR[i,:]) for i in xrange(L)]) # size L
# Compute Realized Vol.
vol = np.std(R) * math.sqrt(260)
return vol
# stock prices
S = np.exp(np.random.normal(size=(50,2)))
### optimization ###
obj_fun = lambda w1: Rlzd_Vol1(w1, S)
w1_0 = 0.1
res = minimize(obj_fun, w1_0)
print res
### Plot objective function ###
fig_obj = plt.figure()
ax_obj = fig_obj.add_subplot(111)
n = 100
w1 = np.linspace(0.0, 1.0, n)
y_obj = np.zeros(n)
for i in xrange(n):
y_obj[i] = obj_fun(w1[i])
ax_obj.plot(w1, y_obj)
plt.show()
目标函数显示一个明显的最小值(它的二次方):
但最小化输出告诉我最小值为0.1,即初始点:
我无法弄清楚出了什么问题。有什么想法吗?
答案 0 :(得分:2)
find(M==max(M))
作为(单个条目)向量传入,而不是w1
例程中的标量。尝试定义minimize
然后计算w1 = np.array([0.2])
会发生什么。你会看到你得到一个2x1矩阵而不是2个入口向量。
为了使你的目标函数能够处理作为数组的w1,你可以简单地将w = np.array([w1, 1.0 - w1])
作为w1 = float(w1)
的第一行进行显式转换。这样做我获得了正确的最小值。
请注意,您可能希望使用Rlzd_Vol1
,尤其是如果您可以将最小值放在最低位置。