Verfasst am: 10.08.2015, 15:17
Titel: Optimization toolbox - Probleme mit der Objektfunktion
Hallo,
ich möchte ein bestimmtes Portfolio mittels Expected Shortfall (conditional value at risk) optimieren. Hierfür möchte ich nicht die das in Matlab implementierte "cvar object" nutzen, sondern die Schätzung mittels EVT vornehmen.
Für meine Optimierung habe ich die folgenden Inputdaten:
x0 = Startvektor für meine Assetallocation (insgesamt sind 30 Assets vorhanden, mein Startvektor besteht aus 1/30 für jedes Asset)
data = fts object
j = Periode
start = Startpunkt der Periode (da ich an anderer Stelle ein Rolling Window verwendet habe)
Nun habe ich eine Funktion geschrieben, die mir als Endresultat das Verhältnis von durchschnittlich zu erwartender Rendite und dem ES ermittelt. Diese Variable heißt r:
Code:
function r = hs(x0,data,j,start,ende)
j=1;
Returns = tick2ret(data(start(j):ende(j)));
returns = fts2mat(Returns);
tsmat = returns * x0;
model = arima('AR', NaN, 'Distribution', 't', 'Variance', gjr(1,1));
options = optimset('fmincon');
options = optimset(options, 'Display' , 'off', 'Diagnostics', 'off', ...
'Algorithm', 'sqp', 'TolCon' , 1e-7);
fit = estimate(model, tsmat, 'options', options); % Fit the model [residuals, variances] = infer(fit, tsmat);
standardizedResiduals = residuals ./ sqrt(variances);
stdResiduals = standardizedResiduals/100;
obj = paretotails(stdResiduals,0.1,1);
param = obj.lowerparams;
tail = param(1);
scale1 = param(2);
VaR = 0.1 + (scale1/tail)*(0.1*((1-0.05)^-tail)-1);
ES = VaR/(1-tail) + (scale1 - tail * 0.1)/(1-tail);
r = mean((returns * x0))/ES;
end
Gebe ich bspw. verschiedene x0 vor und rufe die Funktion auf, erhalte ich nach ca. 20-30 Sekunden wie gewünscht meine Werte für r. Der Aufruf erfolgt mittels:
Nun möchte ich jedoch die Allokation finden, die mir diese Funktion maximiert. Hierfür habe ich das folgende bei der Optimization Toolbox eingegeben (siehe Anhang).
Der Algorithmus startet, braucht aber pro Iteration ca. 15 Minuten. Nun habe ich das Gefühl, dass ich irgendetwas falsch gemacht habe, da der Algorithmus eigentlich nach jedem Durchlauf (ca. 20-30 Sekunden) in die nächste Iteration springen müsste bzw. sollte. Die Optimierung soll mir quasi nur einmal mit dem jeweiligen Vektor x0 den Wert r berechnen und in der nächsten Iteration mit einer anderen Allokation weitermachen - solange bis der Funktionswert maximal ist.
Weiß jemand, wie ich dieses Problem beseitigen kann?
da der Algorithmus eigentlich nach jedem Durchlauf (ca. 20-30 Sekunden) in die nächste Iteration springen müsste bzw. sollte.
Nein, sollte er nicht. In jedem Schritt muss der Gradient angenähert werden, und dazu sind (mindestens) so viele Funktionsauswertungen wie Dimensionen nötig.
In deinem Fall also 30 * (20-30 Sekunden) = 10-15 Minuten.
Mich wundert allerdings das Vorgehen. Ist es denn sinnvoll, für jede Allokation eine neue Arima-Modellierung und -simulation zu machen? Wäre da nicht z.B. ein VARMAX-Modell für die Daten oder auch ein ARIMA-Modell für jedes Asset sinnvoller?
Ich vermute (du kannst das mit dem Profiler überprüfen), dass die meiste Zeit in der Zielfunktion damit verbracht wird, immer wieder neue ARIMA-Modelle anzupassen.
Solltest du bei dem bisherigen Vorgehen bleiben wollen, kann die Nutzung der Parallel Computing Toolbox hilfreich sein, um das ganze zu beschleunigen.
Ich habe das Verfahren erst einmal so probiert, da ich ehrlich gesagt nichts anderes kenne bzw. weiß, wie ich das Ganze sonst schätzen sollte.
Die einzelne Auswertung (zuerst 30 ARIMA-Modelle) und dann die Kombination in einem Modell wird denke ich schwierig, da ich im Folgenden die nächste Periode erneut schätzen muss, sodass ich dann wieder 30 neue Einzelschätzungen etc. hätte.
Also bleibt wahrscheinlich nur die parallel computing toolbox übrig?
gegen den CVaR-Ansatz aus Matlab spricht nichts, ich habe diesen bereits im Vorfeld verwendet. Nun wollte ich in einem weiterführenden Schritt jedoch einmal ausprobieren wie das "Verfahren" reagiert, wenn ich den CVaR über ein Prognoseverfahren schätze und anhand dieser Schätzung das Portfolio optimiere.
Ich werde nun einfach einmal einen kompletten Lauf starten und mir dann überlegen, wie ich weitermache.
Vielen Dank auf jeden Fall für deine Hinweise!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.