WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Optimierung einer MC-Siumlation

 

bennimi
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 15:59     Titel: Optimierung einer MC-Siumlation
  Antworten mit Zitat      
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.

Weiß jemand zufällig eine Lösungen/Ansatz?
Code:

function [E, PMR] = MCFinalh(x)
%rs = RandStream.create('mt19937ar', 'seed', 123456); % randon number stream
%RandStream.setGlobalStream(rs);

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);


PS: Ich besitze leider kein Optimierungstool von Matlab

Vielen Dank schon einmal! Liebe Grüße bennimi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2016, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

wenn du ernsthaft Optimierungsprobleme lösen möchtest, solltest du dir die Optimization Toolbox zulegen, und ggf. die Global Optimization Toolbox.

In MATLAB an sich gibt es in der Hinsicht nur fminsearch . Die einzige Möglichkeit, dort Nebenbedingungen zu berücksichtigen, ist über Strafterme.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2016, 20:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort!

Ich brauche das nur für meine thesis und wollte mir daher nicht alles kaufen.

Ich hatte mir diese Funktion auch schonmal angeschaut, weiß aber wirklich nicht wie ich dort Nebenb. definiere.


Trotzdem Danke, für deine Hilfe

Gruß Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2016, 22:39     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt: über Strafterme.

min f(x) unter g(x) <= b wird zu

min f(x) + c * max(g(x) - b, 0) mit großem c.

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 13:33     Titel:
  Antworten mit Zitat      
hi,

und wie definiere ich das Ganze dann unter fminsearch? ist das was du beschrieben hast dann meine fun ?

Ich habe wirklich keine Ahnung wie ich das dann in einen Code implementieren kann.

Ja, ich werde es mir auch kaufen, falls ich diesbezüglich noch weitere berechnungen machen muss, aber für eine AUfgabe ist es mir wirklich nicht wert.

liebe Grüße und danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2016, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 15:08     Titel:
  Antworten mit Zitat      
Hi,

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 Very Happy



Liebe Grüße,
Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2016, 16:00     Titel:
  Antworten mit Zitat      
Hallo,

Code:
f = -E + c * max(PMR - (-0.05), 0)

muss zurückgegeben werden.

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2016, 18:06     Titel:
  Antworten mit Zitat      
Hi,

aber wie bette ich das jetzt in meine Funktin mit ein?

brauche ich nicht mein PMR und E als Vektor?
und wie definiert man das x0?

Meine FUnktion ist doch abhägig von allen Parameter (x,E,PMR) wie kann ich dann fminsearch überhaupt einsetzen?

Ich verstehe nicht so ganz die Vorgehensweise..

sorry falls das jetzt so banal ist, aber ich freue mcih über deine Hilfe,

liebe Grüße Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.11.2016, 21:01     Titel:
  Antworten mit Zitat      
Hallo,

ich gehe an sich davon aus, dass E und PMR Skalare sind? Was genau willst du ansonsten optimieren?

Die erste Zeile der Funktion anpassen zu
Code:
function f = MCFinalh(x)

und die genannte Zeile unten anfügen.

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2016, 18:28     Titel:
  Antworten mit Zitat      
Hallo,

ja natürlich sind das Skalare, sorry.

Ok ´, ich habe jetzt meine funktion
Code:
function f = MCFinalh(x)
bennant.

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)


Dieser Error kommt nun:
error: feval: first argument must be a string, inline function or a function handle

Liebe Grüße, Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.11.2016, 22:05     Titel:
  Antworten mit Zitat      
Hallo,

der Aufruf der Funktion muss schon von außen kommen, also
Code:
x0=[0.05,-0.2];
x = fminsearch(@MCFinalh,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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 16:22     Titel:
  Antworten mit Zitat      
Hi,

super, also der Programm läuft jetzt. Aber ich verstehe immer noch nciht so ganz, wie genau das, meine Aktiengewichtung "x" maximiert.

Ich habe doch in meiner MCFinalh mein "x" definiert.
Code:
function f = MCFinalh(x)
%rs = RandStream.create('mt19937ar', 'seed', 123456); % randon number stream
%RandStream.setGlobalStream(rs);

n = 100000;        % Siumationspfade
N = 2;            % Anzahl der Jahre
x = 0.5;
S0 = 10000;        % Anfangsvermögen    
p= 0.05;           % Konfidenzniveau


Code:
c=10^20;

f = -E + c * max(PMR - (-0.05), 0);

und hier gebe ich die Bedingung meines Max-Problems wieder?

Code:
x0=[0,0];
x = fminsearch(@MCFinalh,x0)


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?

Liebe Grüße und Vielen Dank,
Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.11.2016, 18:21     Titel:
  Antworten mit Zitat      
Hallo,

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

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bennimi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2016, 21:38     Titel:
  Antworten mit Zitat      
Hi,

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?


Grüße, Benedikt
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.