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

Simulation von Aktienkursen mittels des Hestonmodells

 

Roberzen
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2009, 15:13     Titel: Simulation von Aktienkursen mittels des Hestonmodells
  Antworten mit Zitat      
Hallo liebes Forum,

im Rahmen meiner Diplomarbeit muss ich mittels Matlab unter anderem Aktienkurse simulieren. Das funktioniert aktuell auch wie gewünscht mit unten anstehendem Code. Das Aktienkursmodell liefert mir eine Simulation von "imax = 1000" verschiedenen Kursentwicklungen mit jeweils "nmax = T/dt (100)" einzelnen Schritten pro Preispfad an dennen der Wert der Aktie neu errechnet wird.

Da die Simulation den Wert eines Up-and-Out Calls ermitteln soll, speichere ich in der Schleife immer dann einen Wert, wenn der Aktienkurs am Ende der Laufzeit über 100 liegt (strike price) und während der gesamten Laufzeit nicht die barrier von 120 überschritten hat (dann ist der Wert der Option = 0).

Um die Simulation präzisere Ergebnisse liefern zu lassen möchte ich imax möglichst hoch ansetzen (10.000, 100.000 etc.), der Wert bei den aktuellen Parametern sollte mit imax gegen unendlich gegen 1.604 laufen. Allerdings hängt sich mein Code dann häufig auf (schon bei 3000) und wenn ich die Berechung abbreche kommt folgende Fehlermeldung:

Error in ==> pricepath at 51
if max(S) > B

Ich denke der Fehler entsteht durch eine spezielle Ausprägung der Pfadentwicklung, die natürlich wahrscheinlicher auftritt wenn ich mehr Pfade simuliere.. Doch ich kann den Fehler nicht finden..

Ich wäre für jede Hilfe sehr dankbar! Vorschläge zur Beschleunigung der Laufzeit des Codes werden auch sehr dankbar entgegengenommen =)

Wenn ihr eine nähere Erklärung zur gewünschten Funktionsweise des Codes haben wollt schreibt bitte zurück!

Vielen Dank für alle Postings im voraus!!

Viele Grüße

Roberzen

Code:


function pricepath

Sinit = 100;    % stock price
X = 100;        % strike price
B = 120;        % barrier
r = 0.055;      % risk free rate
q = 0.025;      % dividend yield

Vinit = 0.04;   % inital volatility of the underlying
sigma = 0.2;  % volatility of volatility
k = 1.5;         % rate of volatility return to long term mean
theta = 0.04;  % long term volatility
rho = -0.5;     % correlation between the wiener processes

dt = 0.01;      % time step
T = 1;           % maturity

i = 0;              % start of stock price paths
imax = 1000;     % number of stock price paths
nmax = T/dt;   % number of time steps
path = zeros(imax,nmax);

while i < imax
    i = i + 1;

    S = 0;
    V = 0;
    p = 0;

    path(i,1) = Sinit;
    R = normrnd(0,1,3,nmax);
    S(1) = Sinit; V(1) = Vinit;

    while p < nmax-1
        p = p + 1;

        V(p+1) = V(p) + k*(theta - V(p))*dt + sigma*sqrt(V(p))* ...
            (rho*R(1,p) + sqrt(1- rho^2)*R(2,p))*sqrt(dt);

        S(p+1) = S(p) + (r-q)*S(p)*dt + S(p)*sqrt(V(p))*R(3,p)*sqrt(dt);

        path(i,p+1) = S(p+1);
     end

    if S(nmax) > X
        c = (S(nmax) - X) / exp(r*T);
    else
        c = 0;
    end

    if max(S) > B
        c = 0;     % call equal to zero if the barrier is hit
    else
    end
    option(i) = c;
end

Truevalue = mean(option)

end
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zum einen wäre es auch interessant, WAS die Fehlermeldung ist, nicht nur, in welcher Zeile sie entsteht. Ich gehe zumindest davon aus, dass die Fehlermeldung unvollständig widergegeben wurde.

Zum anderen könnte es helfen, im Debug - Menü "Stop If Errors / Warnings" zu aktivieren. Das wird zwar zunächst die Simulation verlangsamen, aber dann landet man automatisch in dem Moment, wo das Problem entsteht, im Debug - Modus.

Viele Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2009, 19:14     Titel:
  Antworten mit Zitat      
Hallo Harald,

dank dir für dein Posting. Ich habe den Degbug mode nun mit der Option aktiviert und nun folgt eine umfangreichere Fehlermeldung:

51 if max(S) > B
Error in ==> normrnd at 31
[err, sizeOut] = statsizechk(2,mu,sigma,varargin{:});

31 [err, sizeOut] = statsizechk(2,mu,sigma,varargin{:});

Das sagt mir allerdings nun auf Anhieb auch nichts =)
Anscheinend besteht ein Problem mit der Matlab internen Funktion normrnd?!

Gruß & Dank

Robert
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2009, 21:46     Titel:
  Antworten mit Zitat      
Hallo nochmal an das ganze Forum,

könnte vielleicht einer von euch mit Matlab Zugang den von mir zuvor geposteten Code bei sich laufen lassen mit diversen Werten für imax (1000,2000,5000,10000) und mir berichten ob er durchgelaufen ist? 1000 & 2000 lief soweit meist problemlos aber wie zuvor berichtet erhängt er sich bei mir bei höheren Werten für imax und dies ist mein zu lösendes Problem...

Dank & Gruß

Robert
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 02.09.2009, 00:14     Titel:
  Antworten mit Zitat      
für imax=1000 läufts bei mir fix durch, für 5000 hab ich jetzt ein paar Minuten gewartet... kam kein Ergebnis. Wie lange dauert ne Berechnung etwa für imax=5000?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.09.2009, 09:39     Titel:
  Antworten mit Zitat      
Ich habe mal einen Laufzeittest begonnen. Dazu einen Wrapper geschrieben und IMAX übergeben. Eigentlich wollte ich prüfen ob die überproportional ansteigende Laufzeit etwas mit Speicherproblemen zu run hat. Aber PATH wir nicht so sehr gross, dass es eine Rolle spielt. Nun erhalte ich aber mir R2009a auf Windows XP folgende Ergbnisse:

Code:

Truevalue =
    1.5826
  Name         Size              Bytes  Class     Attributes
  path      1000x100            800000  double              
Elapsed time is 0.277560 seconds.
Truevalue =
    1.4483
  Name         Size               Bytes  Class     Attributes
  path      2000x100            1600000  double              
Elapsed time is 0.443000 seconds.
Truevalue =
   1.4589 - 0.0000i
  Name         Size               Bytes  Class     Attributes
  path      4000x100            6400000  double    complex  
Elapsed time is 8.864735 seconds.
Truevalue =
    1.4626
  Name         Size               Bytes  Class     Attributes
  path      5000x100            4000000  double              
Elapsed time is 1.870193 seconds.
 


Interesant, nicht? Komplexe Ergebnisse mit imax=4000! Könnte das was erklären?

Andreas

pricepath.m
 Beschreibung:

Download
 Dateiname:  pricepath.m
 Dateigröße:  1.41 KB
 Heruntergeladen:  492 mal
control_pricepath.m
 Beschreibung:

Download
 Dateiname:  control_pricepath.m
 Dateigröße:  107 Bytes
 Heruntergeladen:  397 mal
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 02.09.2009, 09:43     Titel:
  Antworten mit Zitat      
Wenn ich die Laufvariable i durch ii ersetze läuft alles viel schneller.

Niemals komplexe Zahlen, i, j, I, J als Laufvariablen benutzen!

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Roberzen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.09.2009, 21:45     Titel:
  Antworten mit Zitat      
Hallo Andreas,

vielen Dank für dein Posting. Auch unter Berücksichtigung der Änderung der Laufvariablen i zu ii läuft der Code bei mir unglaublich lang. (siehe unten - imax = 5000 läuft gerade noch..)

Interessant das die Ergebnisse z.T. komplexe Zahlen werden (Bei mir bei imax = 2000, 4000). Trotz allem wird der Mittelwert anscheinend korrekt ermittelt.. Ich verstehe nur nicht warum das so unglaublich lange dauert, bzw. die Berechnungszeit so stark variiert..

Ich bin für weitere Vorschläge und Hilfen sehr dankbar!

Gruß

Robert


Code:


Truevalue =

    1.7636

  Name         Size              Bytes  Class     Attributes

  path      1000x100            800000  double              

Elapsed time is 0.756095 seconds.

Truevalue =

    1.4154

  Name         Size               Bytes  Class     Attributes

  path      2000x100            3200000  double    complex  

Elapsed time is 24.297138 seconds.

Truevalue =

   1.6039 + 0.0000i

  Name         Size               Bytes  Class     Attributes

  path      4000x100            6400000  double    complex  

Elapsed time is 1220.290599 seconds.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 03.09.2009, 08:44     Titel:
  Antworten mit Zitat      
In der Tat merkwürdig. Merkwürdig auch, dass der Code bei mir gerade langsamer gelaufen ist als gestern und auch überhaupt bei mehrfachem ausführen immer anders. Trotzdem hat das was mit den komplexen Werten irgendwie zu tun. Ich schaue gleich noch mal tiefer rein.

Bitte noch MATLAB Version und Betriebssystem angben.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Roberzen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2009, 09:17     Titel:
  Antworten mit Zitat      
Guten Morgen Andreas,

ich hatte heute Nacht noch einen Einfall. Die imaginären Zahlen kommen durch das Wurzel ziehen von negativen Zahlen in der Simulation der Volatilität. Wenn man eine Überprüfung der Volatilität einbaut die Null gesetzt wird, wenn sie kleiner Null wird läuft der Code fix durch!

Ich weiß allerdings nur nicht, ob die Simulation dann noch inhaltlich korrekt ist. Da müßte ich in der Fachliteratur nochmal recherchieren.. Aber dank dir vielmals! Ohne deinen Hinweis auf das komplexe Attribut wäre ich nicht weitergekommen!

Version 7.4.0.287 (R2007a), Windows XP

Code:


Truevalue =

    1.6713

  Name         Size              Bytes  Class     Attributes

  path      1000x100            800000  double              

Elapsed time is 0.784204 seconds.

Truevalue =

    1.4814

  Name         Size               Bytes  Class     Attributes

  path      2000x100            1600000  double              

Elapsed time is 1.495797 seconds.

Truevalue =

    1.5070

  Name         Size               Bytes  Class     Attributes

  path      4000x100            3200000  double              

Elapsed time is 3.026440 seconds.

Truevalue =

    1.5615

  Name         Size               Bytes  Class     Attributes

  path      5000x100            4000000  double              

Elapsed time is 3.830983 seconds.

Truevalue =

    1.5681

  Name          Size               Bytes  Class     Attributes

  path      10000x100            8000000  double              

Elapsed time is 8.199440 seconds.

Truevalue =

    1.4909

  Name          Size                Bytes  Class     Attributes

  path      20000x100            16000000  double              

Elapsed time is 18.557102 seconds.
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 03.09.2009, 09:50     Titel:
  Antworten mit Zitat      
Richtig! Genau jetzt hätte ich gefragt warum die Dinger negativ sind. Das ist aber wirklich Therorie. Dürfen Volatilitäten negativ sein? Ist es OK eine 0 zu setzen oder kleistert das nur en anderes Problem zu?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Roberzen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.06.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2009, 10:15     Titel:
  Antworten mit Zitat      
Hallo Andreas,

Negative Volatilitäten machen keinen Sinn. Die Volatilität beschreibt die Schwankung von Aktienkursen. Aktienkurse wären konstant, wenn die Volatilität Null ist und schwanken je mehr desto höher die Volatilität ist. Wo ich mir allerdings nicht sicher bin ist, ob man die Entwicklung der Volatilität quasi bei Null begrenzen kann. Ich werde das mal mit meinem Betreuer absprechen, bzw. schauen ob ich in der Literatur was dazu finde.

Dank & Gruß

Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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