以下の最適化問題があります。
目的関数は非常に単純です。ベクトル が与えられた場合、最大化するSPREAD
ベクトルを見つけようとします。W
sum(W.SPREAD)
例として、次元 3 では、これは を最大化しようとすることを意味しw1 x spread1 + w2 x spread2 + w3 x spread3
ます。
c1, c2 & c3
さらに、 ではなくW
のPOS
ベクトルに3 つの制約がありPOS = W2POS(W)
ます。
例として、次元 3 の制約は次のとおりです。
|pos1 + pos2 + pos3| < 5
|pos1| + |pos2| + |pos3| < 500
Max(pos1, pos2, pos3) < 5
いくつかの最適化を実行する以下のコードを書きましたが、制約 3 は尊重されません。制約を考慮してこの問題を解決するにはどうすればよいですか?
以下のコードを書きました。
from scipy.optimize import fmin_cobyla
import numpy as np
import pandas as pd
def W2POS(W, PRICE, BETA):
POS = (PRICE * BETA).T.dot(W)
return POS
def objective(W, SPREAD, sign = 1):
er = sum((W * SPREAD.T).sum())
return sign * er
def c1(x, *args):
""" abs(sum(c)) < 500 """
POS = W2POS(x,args[0], args[1])
return POS.apply(abs).sum()
def c2(x, *args):
""" abs(sum()) < 5 """
POS = W2POS(x,args[0], args[1])
return 5. - abs(POS.sum())
def c3(x, *args):
""" abs(max(pos)) < 5 """
POS = W2POS(x,args[0], args[1])
return 5. - POS.apply(abs).max()
# optim
W0 = np.zeros(shape=(len(BETA), 1))
sign = -1
W = fmin_cobyla(objective, W0, cons = [c1, c2, c3], args=(SPREAD,sign),
consargs=(PRICE, BETA), maxfun=100, rhobeg = 0.02).T
print 'Solution:', W
args = [PRICE, BETA]
pos = W2POS(W.T,args[0], args[1])
print 'c1 < 5:', abs(pos.sum())[0]
print 'c2 < 500:', pos.apply(abs).sum()[0]
print 'c3 < 5:', pos.apply(abs).apply(max)[0]
このコードで c3 が尊重されていないことを示すダミー データで遊ぶことができます: http://pastebin.com/gjbeePgt