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

Iteratives Verfahren (Merton-Modell)

 

matlabbrig
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2012, 17:26     Titel: Iteratives Verfahren (Merton-Modell)
  Antworten mit Zitat      
Hallo liebes Forum,

ich brauche dringend Eure Hilfe.

Es geht um Folgendes:

Ich möchte mithilfe des Merton-Modells die Ausfallswahrscheinlichkeit eines Unternehmens bestimmen. Das Merton-Modell ist eine auf Unternehmen als Ganzes umgemünzte Version des Black-Scholes(-Merton)-Modells zur Bewertung von Kaufoptionen.

Das Verfahren an sich ist denke ich zu speziell und würde den Rahmen sprengen, deshalb versuche ich das Problem einzugrenzen:

Es geht um 2 nicht beobachtbare Variablen, nämlich:

1. Den Assetwert des Unternehmens, A
2. Die Volatilität dieses Assetwertes, sigma

Dieses Problem ist aufgrund einer unzureichenden Anzahl an Gleichungen nicht analytisch lösbar, deswegen muss es numerisch gelöst werden.

Arrow Im ersten Schritt schafft man sich Schätzwerte für A und sigma. A wird dabei durch Addition der Aktien-Marktkapitalisierung und der Schulden des Unternehmens approximiert, sigma entspricht der annualisierten logarithmierten Rendite über das erste Jahr.

Nun folgt ein iteratives Verfahren um den Modell-Assetwert zu bestimmen, und eben dort liegt bei mir der Hase im Pfeffer.

Arrow Kurz gesagt berechnet man mit einer Formel die - extrem vereinfacht - A mit einigen anderen Variablen und eben sigma in Verbindung bringt auf Basis der ersten Schätzwerte die erste Runde Modell-Assetwerte.

Arrow von diesen ersten Assetwerten bestimmt man wieder sigma, und setzt dieses sowie die berechneten Assetwerte wieder in die genannte Gleichung ein. Dies tut man solange bis die Prozedur konvergiert, ergo der quadrierte Unterschied zweier aufeinanderfolgender Durchläufe nahe genug an Null ist.

So sieht mein Code bisher aus:
Code:
%%Merton-Modell
load  'MertonDaten'
%% Daten
E         = MertonDaten(1:500, 1);
D         = MertonDaten(1:500, 3);
A_start   = E+D;
r         = MertonDaten(251:500,2);
y_A       =  r;

sigma_start   = std(diff(log(A_start(1:250))))*sqrt(250);



T         = 250;
d1        = zeros(250,1);
d2        = zeros(250,1);
d1_start  = zeros(250,1);
d2_start  = zeros(250,1);
PD        = zeros(250,1);
DD        = zeros(250,1);
A         = zeros(250,1);

%%
%%Berechnung

%Start mit erster Schätzung



 
for t = 1:250
    % Black-Scholes-Formeln
    d1_start(t,1) = (log(A_start(t+250)/D(t+250))+(r(t)+sigma_start^2/2)*(T-t))/(sigma_start*sqrt(T-t));
    d2_start(t,1) = d1_start(t)-sigma_start*sqrt(T-t);
   
    % Erste Berechnung der Modellwerte auf Basis der Schätzwerte
    A(t,1) = (E(t+250)+D(t+250)*exp(-r(t))*normcdf(d2_start(t)))/normcdf(d1_start(t));
   
    % Berechnete Assetwerte als neue Startwerte
    A_start(t+250) = A(t,1);

   
end
   % Berechnung der Vola der berechneten Assetwerte
    sigma_A = std(diff(log(A)))*sqrt(250);
   % Berechnete Vola als neue Startvola
    sigma_start = sigma_A;
   



   
% noch irrelevant

%PD(t,1) = normcdf((log(D(t+250)/A_t_start(t)-(y_A(t-1)-sigma_A^2/2)*(T-t)))/(sigma_A*sqrt(T-t)));
%DD(t,1) = (log(A_t_start(t))+(y_A(t-1)-sigma_A^2/2)*(T-t)-log(D(t+250)))/(sigma_A*sqrt(T-t));
%E_t(t,1) = A.*normcdf(d1)-D*exp(-r(T-t))*normcdf(d2);

 



Ich habe einiges versucht, zB einfach mittels einer for-Schleife das Ganze noch 100x berechnen zu lassen und dann zu gucken ab wann sich sigma nicht mehr ändert, aber erstens kamen komische Assetwerte heraus, zweitens ist das natürlich nicht allgemein anwendbar im Anschluss.

Ich wäre sehr sehr dankbar wenn mir jemand hier einen Tipp geben könnte wie ich das hinkriege! Smile
Private Nachricht senden Benutzer-Profile anzeigen


matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2012, 19:03     Titel:
  Antworten mit Zitat      
Oder, andere Herangehensweise:


Code:
F = [sigma_A - sigma_E*E_t/A;
sigma_E_t - sigma_A(1)*normcdf(d1)*A/E_t(1) ];



Diese Gleichungen könnte ich auch mit fsolve nach sigma_A und A auflösen - kann mir da eventuell schnell jemand auf die Sprünge helfen?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.11.2012, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

möchtest du F=0 lösen?

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2012, 20:36     Titel:
  Antworten mit Zitat      
Hallo,

ich möchte über A und Sigma_A F=0 lösen, ja. Glaube ich zumindest. Ich werde aus der Dokumentation leider nicht sonderlich schlau, meine Probleme sind:

1. wie übergebe ich die Variablen in die Funktion
2. wie weiß ich hernach bei der kryptischen Ausgabe was A und Sigma _A ist?

Aber vor allem 1., muss ich alles in x(1) etc umbenennen?
Die Variablen einfach mit ihrem Namen zu übergeben klappt nicht.
Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.11.2012, 20:47     Titel:
  Antworten mit Zitat      
Gehen wir mal systematisch vor. Zuerst wird die Gleichung als Funktion zur Verfügung gestellt.

Code:

function [y]=nonlinSystem(x)
   % Hier sollten die Parameter lokal,
   % oder global definiert werden
   % ...

   y(1)=x(1)- sigma_E*E_t/x(2);
   % sigma_A(1) kann hier aber nicht gemeint sein, oder?
   y(2)=sigma_E_t - x(1)*normcdf(d1)*x(2)/E_t(1);
 


Nun kannst du Startwerte definieren und die Gleichung lösen.

Code:

x_0(1)=rand;
x_0(2)=rand;

x_s=fsolve(@nonlinSystem,x_0)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2012, 20:52     Titel:
  Antworten mit Zitat      
Vielen vielen Dank! Ich bin den Abend über unterwegs, werde es aber baldmöglichst ausprobieren.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 09:14     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:

% sigma_A(1) kann hier aber nicht gemeint sein, oder?



Das liegt daran dass ich durch einiges Rumprobieren dass Problem hatte dass Sigma plötzlich statt Format 1x1 1x250 hatte, ohne dass eine entsprechende Definition irgendwo gewesen wäre. Selbst nach PC-Neustart bliebt das so Shocked Question
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.11.2012, 09:33     Titel:
  Antworten mit Zitat      
Ok, das kann ich jetzt nicht nachvollziehen. Dann solltest du zuvor die Dimension der Variablen überprüfen, bevor du den Solver aufrufst.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 09:42     Titel:
  Antworten mit Zitat      
Habe Sigma_A jetzt so hinbekommen wie ich will,

sigma_A = sigma_E(1)*E_t(1)/A(1); did the trick. Analog wohl beim Rest..


P.S.: Wäre supernett wenn du mir noch die Definition der Variablen erklären könnte, ich habe Funktionen bisher nie so wirklich verwendet und bekomme nur Fehlermeldungen dass Variable so und so unbekannt ist wenn ich deinen Code ausführe Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.11.2012, 09:47     Titel:
  Antworten mit Zitat      
Code:

clc

% [y]=nonlinSystem(x,sigma_E,sigma_E_t,E_t,d1)

% Startwerte
x_0(1)=rand;
x_0(2)=rand;

% Parameter
sigma_E=rand;
sigma_E_t=rand;
E_t=10*rand;
d1=pi;

x_s=fsolve(@(x) nonlinSystem(x,sigma_E,sigma_E_t,E_t,d1),x_0)
 


Code:

function [y]=nonlinSystem(x,sigma_E,sigma_E_t,E_t,d1)
   y(1)=x(1)- sigma_E*E_t/x(2);
   y(2)=sigma_E_t - x(1)*normcdf(d1)*x(2)/E_t;
end
 


Die Parameter musst du natürlich jetzt mit eigenen, sinnvollen Werten besetzen.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 09:59     Titel:
  Antworten mit Zitat      
Kann ich die Parameter denn so definieren dass sie sich ihre Werte jeweils aus dem Hauptfile holen? Hintergrund ist dass das ganze keine statische Sache ist, sondern im Hauptfile noch in eine for-Schleife gepackt wird später, da ich ein rolling window brauche.

Grüße


Edith sagt: Meine natürlich die "bekannten" Werte, nicht die Startwerte für Sigma_A und A.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.11.2012, 10:14     Titel:
  Antworten mit Zitat      
Du kannst x_s=fsolve(@(x) nonlinSystem(x,sigma_E,sigma_E_t,E_t,d1),x_0) natürlich innerhalb einer Schleife aufrufen und die Parameter sigma_E,sigma_E_t,E_t,d1 variieren.

Zum Thema "sigma_A = sigma_E(1)*E_t(1)/A(1)". Ein Skalar sollte eine Skalar bleiben. Mit solchen "Tricks" würde ich nicht arbeiten, eher die Ursache dafür beseitigen.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 10:37     Titel:
  Antworten mit Zitat      
Erkennst Du vielleicht in dem Code im Startpost woran das liegt?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 02.11.2012, 11:05     Titel:
  Antworten mit Zitat      
Gib mal mit size() die Dimension von sigma_E,sigma_E_t,E_t,d1 aus, bevor du den Solver aufrufst und poste hier die Ergebnisse.

Am besten gibst du mal den gesamten relevanten Code an, incl. des Aufrufs des Solvers.
Private Nachricht senden Benutzer-Profile anzeigen
 
matlabbrig
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 17.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 11:07     Titel:
  Antworten mit Zitat      
Mache ich sofort wenn ich wieder daheim bin, danke!
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.