2016-06-10 13 views
1

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?

Antwort

0

Ändern Sie Ihre Optimierungsfunktion so, dass eine hohe Strafe entsteht, wenn das Gewicht eines Assets außerhalb seiner Grenzen liegt. Mit dieser neuen Funktion können Sie versuchen, den Gradienten zu finden und einen Gradientenanstieg durchzuführen, um Ihre Rendite/Belohnung zu optimieren.

+0

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? –

+0

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. –