Verfasst am: 27.11.2016, 15:59
Titel: Optimierung einer MC-Siumlation
Hallo liebe Comunity,
ich habe ein kleines Problem bei bzgl. einer Optimierung, da ich, als blutjunger Anfänger, keine Ahnung habe, wie ich dieses lösen kann.
Zum Problem: Ich habe eine Monte Carlo Siumlation für ein Portfolio durchgeführt (bestehend aus Aktien und Bonds).
Dieses PF hat die Gewichtungen "x" (bzw. 1-x) die jedes Jahr gleich bleiben (rebalancen des Aktiengewichtes erfolgt für jedes Jahr in der for-schleife).
Meine Aufgabe ist es jetzt, "x" so zu bestimmen, dass meine Erwartungswert des PF maximiert wird und meine Restirktion (PMR >= - 5% ) eingehalten wird.
n = 10000; % Siumationspfade
N = 10; % Anzahl der Jahre
S0 = 10000; % Anfangsvermögen
p= 0.05; %Konfidenzniveau
va = sqrt(log(1+(0.25^2/1.07^2)));
ma = log(1.07)-0.5*va^2;
vb = sqrt(log(1+(0.04^2/1.03^2)));
mb = log(1.03)-0.5*vb^2;
za = randn(n,N);
ra = exp(ma + va * za);
zb = randn(n, N);
rb = exp(mb + vb * zb);
S = zeros(n, N + 1);
S(:, 1) = S0;
for t = 2 : N + 1% beginne bei t=2 und ende bei N+1
S(:, t) = S(:, t - 1) .*(x * ra(:, t - 1) + (1 - x) * rb(:, t - 1));
end
R = S(:, N + 1) ./ S(:, 1) - 1;
Mean = mean(R);
Std = std(R);
Std_Error = std(R) / sqrt(length(R));
PMR = quantile(R, p);
Z = PMR;
%SW = sum(R < Z) / n; % Konfidenzniveau
SF = max(Z - R, 0); % Suche aller Werte unterhalb der Konfidenz, 0
SE = mean(SF);
MEL = mean(SF(SF > 0)); %mean bilden aus Werten für SF, die > 0
E = mean(R);
Die Optimization Toolbox kostet für Studenten 20 Euro. In der "MATLAB and Simulink Student Suite" für 69 Euro ist die Optimization Toolbox sogar schon dabei.
Die meisten Universitäten dürften zudem eine Möglichkeit haben, MATLAB und Toolboxen auf Uni-Rechnern kostenfrei zu nutzen.
genau. Im wesentlichen hast du die Funktion ja schon. Du musst lediglich noch E und PMR zusammenfassen. Daran denken, dass fminsearch minimiert; um also E zu maximieren, musst du -E minimieren.
verstehe ich das jetzt richtig: mein E ist dann f(x) (bzw. ich definiere E=-E) und mein PMR>=-5% wird dann umgeschrieben zu max(g(x) - (-5%), 0). was it ist aber bitte "c"?
Könntest Du mir vielleicht zeigen, auf welche weise ich diese Funktion impementiere?
Sorry, aber mich überfordert das ein wenig
c kannst du wählen. Je größer c ist, desto härter werden Verletzungen der Nebenbedingungen bestraft.
Wie gut die Ergebnisse mit fminsearch sein werden, ist schwer abzuschätzen.
Du kannst dir ja mal eine Trial der Optimization Toolbox herunterladen, um die Ergebnisse zu vergleichen.
x0 ist der Startvektor. Dieser kann grundsätzlich ein beliebiger Vektor mit so vielen Elementen wie Anzahl der zu optimierenden Größen sein. Damit die Optimierung zum globalen Minimum hin konvergiert, ist eine möglichst geschickte Wahl des Startvektors ratsam.
ganz unten im code habe ich jetzt deinen Code eingefügt.
Es funktioniert aber leider nicht, wo ist mein Fehler?
Code:
function f = MCFinalh(x)
%rs = RandStream.create('mt19937ar', 'seed', 123456); % randon number stream
%RandStream.setGlobalStream(rs);
n = 10000; % Siumationspfade
N = 2; % Anzahl der Jahre
x=0.1;
S0 = 10000; % Anfangsvermögen
p= 0.05; %Konfidenzniveau
va = sqrt(log(1+(0.25^2/1.07^2)));
ma = log(1.07)-0.5*va^2;
vb = sqrt(log(1+(0.04^2/1.03^2)));
mb = log(1.03)-0.5*vb^2;
za = randn(n,N);
ra = exp(ma + va * za);
zb = randn(n, N);
rb = exp(mb + vb * zb);
S = zeros(n, N + 1);
S(:, 1) = S0;
for t = 2 : N + 1% beginne bei t=2 und ende bei N+1
S(:, t) = S(:, t - 1) .*(x * ra(:, t - 1) + (1 - x) * rb(:, t - 1));
end
R = S(:, N + 1) ./ S(:, 1) - 1;
Mean = mean(R);
Std = std(R);
Std_Error = std(R) / sqrt(length(R));
PMR = quantile(R, p);
Z = PMR;
%SW = sum(R < Z) / n; % Konfidenzniveau
SF = max(Z - R, 0); % Suche aller Werte unterhalb der Konfidenz, 0
SE = mean(SF);
MEL = mean(SF(SF > 0)); %mean bilden aus Werten für SF, die > 0
E = mean(R);
c=1000
x0=[0.05,-0.2];
f = -E + c * max(PMR - (-0.05), 0);
x = fminsearch(f,x0)
Diese Zeilen müssen dann aus der Funktion entfernt werden.
Ich kann nur raten, die Dokumentation und die Beispiele sorgfältig zu lesen. Das Beispiel "Minimize a Function Specified by a File" erfasst genau deinen Fall.
Ich würde wie von dir angedeutet den Zufallszahlengenerator immer gleich laufen lassen, da sonst nicht klar ist, ob du bessere Parameter oder günstigere Szenarien hast.
Mein X0 definiert doch dann die beiden Startwerte für E und PMR, dann gibt mein X mir doch nur die beiden besten kombinierten Werte für PMR und E wieder, aber doch nicht unter der optimalen Gewichtung? Wo findet diese dort Verwenung?
fminsearch ruft zunächst die Funktion mit x0 auf, und bekommt ein Rückgabeargument. Dann wird x0 mehr oder weniger stark variiert um zu schauen, ob es bessere Rückgabeargumente gibt.
Bekommst du denn ein x heraus, das ein deutlich besseres E hat als das x0 (und die Nebenbedingung einhält)?
ja, tut es.. aber ist das was rauskommt, dann mein E oder meine optimierte Gewichtung "x"? Der Wert schwankt aber viel zu extrem, als dass das richtig sein könnte...
muss meine Gewichtung "x" in meiner Funktion MCFinalh mit meinem x0 übereinstimmen oder ist das egal?
Mein x0 ist auch kein Vektor, sondern lediglich besteht nur aus einer Zahlt, verstehe ich das richtig?
Ok, ich glaube langsam, ich verstehe das Problem.. fminsearch hört praktisch auf, sobald es ein Minimun gefunden hat (unter Einhalten der NB), aber das heißt noch ncht zwangläufig, dass es sich um das globale Minimum handelt, oder?
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.