2016-05-25 6 views
0

を動作しない最小化:scipyのダウンロードは、私は以下の最小化を実行している

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

私は何がうまくいかないのか分かりません。何かご意見は?

答えて

2

w1は、minimizeルーチンからスカラーではなく(単一項目)ベクトルとして渡されます。 w1 = np.array([0.2])と定義してw = np.array([w1, 1.0 - w1])を計算するとどうなるか試してみてください。 2つのエントリーベクトルの代わりに2x1の行列が得られることがわかります。

目的関数がw1を配列として扱うことができるようにするには、Rlzd_Vol1の最初の行にfloatw1 = float(w1)という浮動小数点数を入れてください。そうすることで、正しい最小値を得ることができます。

特に、最小限に抑えることができる場合は、scipy.optimize.minimize_scalarを使用することをお勧めします。

関連する問題