Ich löse ein Problem der Portfoliooptimierung, bei dem ich Gewichte (Kapital) so zuweisen muss, dass das Endportfolio die niedrigste mögliche historische Volatilität aufweist. Zurzeit habe ich zwei Einschränkungen bezüglich der Gesamtsumme der Gewichte jeder Aktie und ihrer quadrierten Gewichte. Die Grenzen für die Zuordnung zu jedem Bestand sind (0,00, 0,02).Scipy-Optimierung mit mehreren Schranken
Derzeit mein Code sieht wie folgt aus:
def portfolio_vol(w):
#compute porfolio volatility
portfolio_volatility = np.sqrt(w.T.dot(cov_matrix).dot(w))
return portfolio_volatility
w
ist ein Vektor von gleichen Gewichten berechnet als w = 1.0/len(composition)
def find_optimal_allocations():
bnds = tuple((0.00, 0.02) for x in weights)
cons = ({'type': 'eq', 'fun': lambda x: 1 - sum(x)}, {'type': 'ineq', 'fun': lambda x: -sum(x**2) + 0.02})
result = spo.minimize(portfolio_vol, weights, method='SLSQP', bounds = bnds, constraints = cons)
return result.x
Ich speichere meine Gewichte in einem MultIndex Pandas Serie, wo Aktien nach Ländern gruppiert werden und anfangs gleich gewichtet sind:
Country Ticker
AS OMV AV Equity 0.020000
BE SOLB BB Equity 0.020000
FI NESTE FH Equity 0.020000
FR FP FP Equity 0.020000
GB LAND LN Equity 0.020000
GE BAS GR Equity 0.020000
HEI GR Equity 0.020000
GR TITK GA Equity 0.020000
IR CRH ID Equity 0.020000
RYA ID Equity 0.020000
...
US AMAT US Equity 0.020000
AMGN US Equity 0.020000
APA US Equity 0.020000
Ich möchte zusätzliche Einschränkung enthalten, um find_optimal_allocations()
so konnte ich Grenzen für jedes Land Maximalgewicht einstellen: s.groupby(level=0,axis=0).sum()
Country
AS 0.020000
BE 0.020000
FI 0.020000
FR 0.020000
GB 0.020000
GE 0.040000
GR 0.020000
IR 0.040000
US 0.400000
Zum Beispiel withing die diese Grenzen:
[(.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.20)]
Wie kann ich diese Grenzen sind in meiner Optimierungsfunktion, so dass es gleichzeitig Gewichtsbeschränkungen für Länder und einzelne Lagerbeschränkungen berücksichtigen würde?
Vielen Dank für Ihre Antwort. Ich verstehe nicht, warum ich die Optimierungsfunktion modifizieren sollte. Ich möchte zusätzliche Grenzen für Ländergewichtungen hinzufügen, ähnlich wie Sie Grenzen für Asset-Klassen in diesem [Post] hinzugefügt haben (http://stackoverflow.com/questions/18218355/scipy-optimization-with-grouped-bounds?rq=) 1) Wie ich verstehe, haben Sie die Optimierung in zwei Schritten gemacht: 1) Optimierung für individuelle Gewichtungen 2) Optimierung für Gewichtungen nach Anlageklassen gruppiert. Allerdings verstehe ich den Code nicht vollständig. Vielleicht können Sie die Logik hinter Ihrer Lösung erklären? –
Das war ein nicht optimaler Ansatz. Unterm Strich hoffen Sie, lokale Optima im n-dimensionalen Raum zu finden. Der Einfachheit halber nehmen wir an, dass Sie nur drei Assets optimieren. Daher ist es Ihr Ziel, einen Peak auf einer 3D-Oberfläche zu finden. Indem du deine Funktion änderst, modifizierst du im Wesentlichen diese Oberfläche so, dass das Gehen außerhalb dieser Grenze dem Absteigen von einer Klippe entspricht. –