Scipy最小化不起作用

时间:2016-05-25 20:06:48

标签: python optimization scipy minimize

我正在运行以下最小化:

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()

目标函数显示一个明显的最小值(它的二次方):

objective function

但最小化输出告诉我最小值为0.1,即初始点:

minimization output

我无法弄清楚出了什么问题。有什么想法吗?

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,尤其是如果您可以将最小值放在最低位置。