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

fzero-Funktion mit Vektoren

 

Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2010, 22:37     Titel: fzero-Funktion mit Vektoren
  Antworten mit Zitat      
Hallo,


ich versuche mich erfolglos an der fzero Funktion Crying or Very sad.

Code:
m=length(F);


for i=1:1:m

delta=debt_differenz(sigma);
   
h = @(sigma)(delta);
x0(i) = fzero(h,0.35);

end


Das ist aus der Finanzmathematik. Gesucht ist das sigma für m Transaktionen.
- m gibt die Anzahl an Transaktionen wieder (20)
- debt_differenz(sigma) besteht aus m Werten, die abhängig von sigma sind.
Das sigma ist gefunden, wenn die Differenz 0 wird. Ich habe rausgefunden das dieses Problem mit Hilfe der fzero Funktion gelöst werden kann.
Leider komme ich mit der Anwendung nicht zurecht:cry:

Wer cool, wenn mir jemand helfen könnte, ich bin schon am verzweifeln.


Vielen Dank,
Alex[/code]


Harald
Forum-Meister

Forum-Meister


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

ich steige bei deiner Anwendung auch nicht ganz durch.

Wieviele Ein- und Ausgabeargumente hat debt_differenz? Insbesondere: sollte der Ablauf von i abhängen?

Hat debt_differenz Zufallselemente? Falls nicht, wirst du m Mal dasselbe Ergebnis bekommen.

Bekommst du eine Fehlermeldung oder unerwartete Ergebnisse?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 12:11     Titel:
  Antworten mit Zitat      
Hey Harald,

also, ich habe insgesamt 20 Transaktionen, von denen ich jeweils die implizite Volatilität (sigma) bestimmen soll.
Ein vorgegebener Datensatz gibt mir die Schulden (debt) und alle anderen Werte die ich zur Berechnung von sigma brauche wieder.

Ich habe nun eine eine Funktion debt_differenz(sigma) geschrieben, die mir für alle 20 Transaktionen, die Differenz aus geg. Schulden (Werte aus Datensatz) und Schulden abh. von sigma (aus einer der Black-Scholes-Formel ähnlichen-Formel) geschrieben.

Gebe ich im command-window z.B. debt_differenz(-0.2) ein, so erhalte ich
Code:
debt_differenz(-0.2)

ans =

  Columns 1 through 8

 -309.5650  -36.8278 -249.0251  -11.3252  -65.0973 -173.8701 -172.8683  -11.3252

  Columns 9 through 16

  -65.0973   28.3587  -48.8969    5.2070   -1.1757  -22.2448   -7.2710   -4.7253

  Columns 17 through 20

  -20.8347   -4.2688  -65.4181  -21.1827


Ziel ist es nun für jede Transaktion ein sigma zu finden, so dass jede der 20 Differenzen 0 ergibt.

debt_differenz hat keine Zufallsvariablen und ich habe die for-Schleife deshalb verwendet, weil ich ja die im Endeffekt die Nullstellen von 20 verschiedenen Differenzen berechnen möchte.

Bei meinem Ansatz erhalte ich folgende Fehlermeldungen:

Code:
??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit.  Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in ==> sigma


Da mache ich wohl irgendeine Endlosschleife. Ich weiß aber auch nicht, wie ich es besser machen soll?
Hast du ne Idee?


Beste Grüße,
Alex
 
Harald
Forum-Meister

Forum-Meister


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

fzero ist nur für skalare Funktionen geeignet.
Meine Empfehlung: debt_differenz so umschreiben, dass es als zweites Argument die Transaktion annimmt, also der Form

Code:
function f = debt_differenz(sigma, I)

Dann sollte das gehen:

Code:
for I=1:1:m

x0(I) = fzero(@(sigma) debt_differenz(sigma, I),0.35);

end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 14:06     Titel:
  Antworten mit Zitat      
Hallo,

es gibt leider immer noch Probleme.
Ich habe debt_differenz so umgeschrieben:
Code:


function D = debt_differenz1(sigma,B_T)

D = B_T-debt(sigma);

end


B_T ist dabei das von dir vorgeschlagene I und spiegelt die Schulden der 20 Transaktionen wieder.
debt(sigma) sind die von mir berechneten Schulden abh. von sigma.

Jetzt wende ich for-Schleife an:
Code:
for i=1:1:m
x0(i) = fzero(@(sigma) debt_differenz1(sigma, B_T),0.35);
end


und es erscheint folgende Fehlermeldung:
Code:
Warning: The value of local variables may have been changed to match the
         globals.  Future versions of MATLAB will require that you declare
         a variable to be global before you use that variable.
> In debt_differenz1 at 5
  In @(sigma)debt_differenz1(sigma,B_T)
  In fzero at 306
??? Operands to the || and && operators must be convertible to logical scalar
values.

Error in ==> fzero at 333
    elseif ~isfinite(fx) || ~isreal(fx)
 


Viele Grüße,
Alex
 
Harald
Forum-Meister

Forum-Meister


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

es muss auf jeden Fall

Code:
for i=1:1:m
x0(i) = fzero(@(sigma) debt_differenz1(sigma, i),0.35);
end


heissen.
Schau mal, ob das alle Probleme löst.

Grüße,
Harald

P.S.: Hast du irgendwo globale Variablen?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 14:26     Titel:
  Antworten mit Zitat      
Hallo,

Ja, ich habe sogar sehr viele globale Variablen.
Ich habe alle Werte aus meinem Datensatz umgewandelt und sowohl in jeder Funktion, als auch im command window als global deklariert.
So schaut bei mir jede Funktion (auch die debt_differenz1) wie folgt aus:

Code:


Liegt es an den globalen Variablen?


Viele Grüße,
Alex
 
Harald
Forum-Meister

Forum-Meister


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

globale Variablen sind kein guter Programmierstil, da sie eben überall verändert werden können und man dadurch schnell die Übersicht verliert.
Wenn du das machst, weil zu viele Variablen übergeben werden müssen, wäre eine Alternative, eine Struktur mit allen relevanten Parametern zu erstellen.

Bei deinem vorherigen Code resultierte die merkwürdige Fehlermeldung aus den globalen Variablen. Hast du es denn mit meinem Korrektur-Vorschlag probiert?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 15:14     Titel:
  Antworten mit Zitat      
Hallo,

den Korrekturvorschlag hab ich ausprobiert. Ich hab mir zwar nicht ganz im Klaren wie die B_T, i bzw. I zu setzen sind. Aber ich hab alle Varianten probiert und es kommt immer der selbe Fehler.

Außerdem hab ich mal probiert die fzero Funktion nur für einen Wert (Transaktion) anzuwenden. Das lieferte zwar ein Ergebnis (was wohl falsch ist) und jede Menge Warnungen:

Code:
h = @debt_Differenz_Wert1;
sigma_start=0.35;
x0 = fzero(h,sigma_start)

Warning: Infinite or Not-a-Number value encountered.
> In quadgk>vadapt at 298
  In quadgk at 208
  In pvr_Wert1 at 18
  In debt_Differenz_Wert1 at 14
  In fzero at 520

diese Warnung ca. 100 mal und am Ende:
Code:
x0 =

 -2.5956e-007

was definitiv falsch ist. Der Durchschnittswert von sigma ist nämlich 0.35.


Vielleicht ist ja vorher schon der Wurm drin. Ich hab mal alles, was ich bisher gemacht habe zusammengefasst.

Code:
% Berechnung von sigma der 20 Transaktion

% Deklarierung aller notwendigen Variablen anhand des Datensatzes
% diese Variablen sin auch in jeder Funktion enthalten

global F;
global B_T;
global B_xb;
global V_t;
global tau;
global T;
global s;
global c;
global r;
global t;

% Berechnung von xb (bankruptcy_point1)
function xb = bankruptcy_point1(sigma);
n = log((((s.*F).*exp(-c*tau)+B_xb)./V_t)./exp(r*t));
xb = n./(sigma*sqrt(t))+1/2*sigma*sqrt(t);
end


% Berechnung von pv default
function pv_d=pv_default(sigma)
xb=bankruptcy_point1(sigma);
pv_d=V_t.*normcdf(xb-sigma*sqrt(t),0,1);
end

% Berechnung von pv unredeemed
function U = pv_unredeemed(sigma)
xb=bankruptcy_point1(sigma);
m=length(F);
for i=1:1:m
I=@(x)(normpdf(x).*((normcdf((log(F(i).*exp(-r*t(i))./V_t(i))+0.5*sigma^2*T(i)-x.*sigma*sqrt(tau(i)))./(sigma*sqrt(tau(i)))-sigma*t(i)).*V_t(i)).*exp(-0.5*sigma^2*t(i)+sigma*sqrt(t(i).*x)+r*t(i))+(normcdf(-(log(F(i).*exp(-r*t(i))./V_t(i))+0.5*sigma^2*T(i)-x.*sigma*sqrt(tau(i)))./(sigma*sqrt(tau(i)))).*F(i)).*exp(-r*tau(i)))).*exp(-r*t(i));
U(i)=abs(quadgk(I,xb(i),100000));
end
end


% Berechnung von pv redeemed
function pv_r=pv_redeemed(sigma)
xb=bankruptcy_point1(sigma);
pv_r=((normcdf(-xb,0,1).*s).*F).*exp(-c*tau-r*t);
end


% Berechnung der debt Differenz: wahrer Wert - berechneter Wert
function D = debt_differenz1(sigma)
D = B_T-debt(sigma);
end


% Berechnung von sigma
???


Das ganze ist Teil meiner Diplomarbeit in der mich zum ersten Mal mit Matlab beschäftige. Das erklärt auch meine enormen Defizite.


Viele Grüße,
Alex
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2010, 15:33     Titel:
  Antworten mit Zitat      
Die wichtigste Funktion hab ich in der Auflistung vergessen, nämlich die Schulden, abh. von sigma:

Code:
function D = debt(sigma)
D=pv_default(sigma)+pv_unredeemed(sigma)+pv_redeemed(sigma);
end
 
Harald
Forum-Meister

Forum-Meister


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

mein Vorschlag wäre, eine Struktur params mit verschiedenen Feldern zu erstellen, und sie jedes Mal mit zu übergeben. Die Anzahl an globalen Variablen ist hier einfach groß und macht das ganze unübersichtlich.
Variablen, die veränderlich sind und vielleicht noch als Übergabeparameter verwendet werden (in deinem Fall z.B. B_T oder sigma) sollten aber auf keinen Fall global sein.

Wenn das Problem die globalen Variablen sind, wird das Problem so lange weiter bestehen, bis MATLAB neu gestartet oder die Variablen explizit gelöscht wurden mit
Code:


Wenn die Ergebnisse falsch sind, ist zu vermuten, dass irgendwo in einer Formel ein Fehler ist. Mein Vorschlag wäre, jede der von dir geschriebenen Funktionen mal mit realistischen Werten zu füttern und zu sehen, ob etwas vernünftiges herauskommt. Dabei kann ich dir leider nicht helfen, da ich deine Anwendung nicht kenne / verstehe (und das ist wohl auch nicht der Sinn der Sache).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Alex-München

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2010, 20:46     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Hilfe.
Die fzero-Funktion läuft endlich.
Nur die Ergebnisse lassen zu wünschen übrig, aber das liegt wohl an den Eingangsdaten aus dem Datensatz.

Viele Grüße,
Alex
 
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 - 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.