Verfasst am: 31.10.2011, 12:32
Titel: komplizierteres Intergral über zwei Variablen
Hallo zusammen, wie man gleich unschwer erkennen wird, bin ich Anfängerin, daher bitte ich um Rücksicht, falls ich "doofe" Fragen stellen. Ich versuche zur Zeit verschiedene Intergrale (Finanzmathe) aus einem Paper in Matlab nachzubilden und habe leider große Problem damit.
Wenn S eine geometrisch brownsche bewegung mit mu (0,05) und sigma (0,2) ist, erhalte ich in matlab die Dichte ja über lognpdf(S,mu*T,sigma^2*T) (?). Mein erstes Intergral ist nun über diese Dichte multipliziert mit einem Wert, der sich aus der Black Scholes Formel ergibt, zu bilden.
Ich versuche es nun folgendermaßen:
____________________
Meine Inputparameter:
muBS1=0.05;
sigmaBS1=0.2;
T=0.5;
N=round(T*365*24)
g_xt=0.8; %g muss kleiner gleich 1 sein
K=10;
S2=55;
______________________________
aber leider stimmt hier was nicht, ich gebe in matlab statt inf eine sehr große zahl ein. Aber das Intergral steigt mit der Grenze. Wenn ich jedoch die Dichtefunktion (lognormal) zugrunde lege, müsste das Integral doch begrenzt sein oder?
Wenn ich das geschafft habe muss ich später eine komplizierteres Integral berechnen. Ohne angegebene Grenzen im R². Wie ich das integral zu verstehen habe, weiß ich leider nicht. Ich denke, ich muss in Matlab über zwei Variablen integrieren. Geht dies auch mit Quad? (siehe angehängte Bilder).
Ich sitze nun schon sehr lange daran, aber auch eine Auffrischung der Stochastik-Grundlagen hilft mir hier leider nicht weiter. Deshalb wäre ich euch sehr dankbar, wenn jemand mir helfen kann.
dein Code läuft so nicht.
Die Frage ist für mich: ist S1 eine Konstante (und wenn ja: welche; wird in a, b etc. verwendet) oder die Integrationsvariable? Oder verwendest du S1 in zwei verschiedenen Zusammenhängen?
Für Integrale mit unendlichen Grenzen kann man übrigens QUADGK verwenden.
Hier habe ich als nun eine zweidimensionales Integral in zwei geteilt, einmal für den Bereich von -100 bis 0 (z-Variable) und einmal von 0 bis 100.
Das merkwürdige ist, dass es eigentlich gut durchläuft und phi 1 keine Probleme hat. Auch bei phi2 funktioniert es für den Fall, dass g>1 ist, aber für den Fall "else" (g<=1) kriege ich eine Fehlermeldung.
Ich kann meinen Fehler hier einfach nicht finden. Liegt es daran, dass in dem Doppeltintegral an sich noch weitere Integrale berechnet werden? Ich kann keine Probleme in den Grenzen feststellen. Wenn ich jede Komponente einzeln aufrufe läuft es immer, aber sobald ich alles gleichzeitig aufrufe, bekomme ich eine ganze Pallette von Fehlermeldungen:
_____________________________
??? Error using ==> times
Matrix dimensions must agree.
Error in ==>
phi2>@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2)
at 9
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
Error in ==> phi2 at 11
if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001
Error in ==>
Optionspreis>@(c,z)normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z))
at 39
Fun_bis_0=@(c,z)
normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));
Error in ==> quad>quadstep at 125
y = f(x, varargin{:});
Error in ==> quad at 98
[Q(3),fcnt,warn(3)] = ...
Error in ==> dblquad>innerintegral at 77
Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});
Error in ==> quad at 76
y = f(x, varargin{:});
Error in ==> dblquad at 53
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...
__________________________________________________
Ich kann meinen Fehler einfach nicht finden...
Wenn es an der dbquad liegt, verstehe ich aber nicht, warum es sonst bei phi1 nicht meckert. Da macht es ja genau das Gleiche....
Hier sind die "Nebenfunktionen". In phi2 sind auch Integrale enthalten.
Vielen Dank schon mal für jede Hilfe!
Schöne Grüße
___Berechnung von g:________________
function g=g(x)
vega=1.013;
gamma=6.203;
if x > 0
g=min(30,gamma./(x.^vega));
else g=30;
end
____Berechnung von BLS__________
function price=BLS(Y,K,T,r,sigma)
d1=(log(Y./K)+((r+sigma.^2)./2).*T)./(sqrt(T).*sigma);
d2=d1-sqrt(T).*sigma;
price=Y.*normcdf(d1,0,1)-K.*(exp(-r*T)).*normcdf(d2,0,1);
___phi1___________________
function phi1=phi1(r,T,Y1_0,K,sigma1,g)
if g>1
phi1=(g-1).*BLS(Y1_0,(K./(g-1)),T,r,sigma1)
else phi1 = 0
end
end
_____phi2________________
function phi2=phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g)
if g>1
fun2=@(y)lognpdf(y,(log(Y1_0)+(r-sigma1.^2/2).*T),sqrt(T).*sigma1).*BLS(Y2_0,(K-(g-1).*y)./g,T,r,sigma2);
temp1=g.*quadl(fun2,0,K./(g-1))
temp2=g.*Y2_0.*normcdf(((r-.5*sigma1.^2).*T-log(K./((g-1).*Y1_0)))./sqrt(T).*sigma1);
temp3=(g-1).*BLS(Y1_0,K./(g-1),T,r,sigma1);
phi2=temp1+temp2+temp3
else
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
i=0:.1:100;
if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001
else
error('integration in phi2 might cause issues');
end
phi2=g*quadl(fun2,0,100)
end
_____________________________
ich habe nun die komplette Hauptfunktion eingefügt. Ich hoffe das macht es nun leichter
So kannst du die Hauptfunktion aufrufen Optionspreis(0.5,10,0.2,0.3,0.05,12,30). Mit dem Haltepunkt habe ich es schon versucht, aber ich sehe den Fehler nicht.
Danke schon mal für die Hilfe!!
schöne Grüße
Anfänger00 hat Folgendes geschrieben:
Das ist meine Hauptfunktion, die je nach Integral sich die anderen (unteren) Funktionen aufruft:
Code:
function Endwert=Optionspreis(T,K,sigma1,sigma2, r, Y1_0,Y2_0)
%% ________ Inputparameter
kappa_c1=0.1523;
kappa_c2=0.5085;
theta_c1=14.62168;
sigma_c1=472.8854;
theta_c2=-0.0462;
sigma_c2=890.6285;
kappa_D=0.0213;
theta_D= 1.8501;
sigma_D=300.4723;
C1=7000;
C2=4500;
D=4300;
%N=round(T*365*24);
%% ______Berechnung der Deterministische Komponenten
f_C1=5985.8+689.4*cos(2*pi*(T/365-3.1));
f_C2=3426.9+856.4*cos(2*pi*(T/365-3.1));
f_D=3332.6+809.9*cos(2*pi*(T/24+0.3))+1232.4*cos(2*pi*(T/168-0.3871))+1420.6*cos(2*pi*(T/8760+0.0131));
%% Berechnung Parameter für die jeweilige Density
EW_C1=f_C1+(C1-f_C1).*exp(-kappa_c1.*T)+theta_c1.*(1-exp(-kappa_c1.*T));
Var_C1=((sigma_c1.^2)./(2*kappa_c1)).*(1-exp(-2*kappa_c1.*T));
Hier habe ich als nun eine zweidimensionales Integral in zwei geteilt, einmal für den Bereich von -100 bis 0 (z-Variable) und einmal von 0 bis 100.
Das merkwürdige ist, dass es eigentlich gut durchläuft und phi 1 keine Probleme hat. Auch bei phi2 funktioniert es für den Fall, dass g>1 ist, aber für den Fall "else" (g<=1) kriege ich eine Fehlermeldung.
Ich kann meinen Fehler hier einfach nicht finden. Liegt es daran, dass in dem Doppeltintegral an sich noch weitere Integrale berechnet werden? Ich kann keine Probleme in den Grenzen feststellen. Wenn ich jede Komponente einzeln aufrufe läuft es immer, aber sobald ich alles gleichzeitig aufrufe, bekomme ich eine ganze Pallette von Fehlermeldungen:
_____________________________
Code:
??? Error using ==> times
Matrix dimensions must agree.
Error in ==>
phi2>@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2)
at 9
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
Error in ==> phi2 at 11 ifmax(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001
Error in ==>
Optionspreis>@(c,z)normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z))
at 39
Fun_bis_0=@(c,z)
normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));
Error in ==> quad>quadstep at 125
y = f(x, varargin{:});
Ich kann meinen Fehler einfach nicht finden...
Wenn es an der dbquad liegt, verstehe ich aber nicht, warum es sonst bei phi1 nicht meckert. Da macht es ja genau das Gleiche....
Hier sind die "Nebenfunktionen". In phi2 sind auch Integrale enthalten.
function price=BLS(Y,K,T,r,sigma)
d1=(log(Y./K)+((r+sigma.^2)./2).*T)./(sqrt(T).*sigma);
d2=d1-sqrt(T).*sigma;
price=Y.*normcdf(d1,0,1)-K.*(exp(-r*T)).*normcdf(d2,0,1);
function phi2=phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g) if g>1
fun2=@(y)lognpdf(y,(log(Y1_0)+(r-sigma1.^2/2).*T),sqrt(T).*sigma1).*BLS(Y2_0,(K-(g-1).*y)./g,T,r,sigma2);
temp1=g.*quadl(fun2,0,K./(g-1))
temp2=g.*Y2_0.*normcdf(((r-.5*sigma1.^2).*T-log(K./((g-1).*Y1_0)))./sqrt(T).*sigma1);
temp3=(g-1).*BLS(Y1_0,K./(g-1),T,r,sigma1);
phi2=temp1+temp2+temp3
else
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
i=0:.1:100;
ifmax(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001 else error('integration in phi2 might cause issues');
end
phi2=g*quadl(fun2,0,100) end
ich weiß zumindest das Problem: g ist ein Vektor mit zwei Elementen, y ein Vektor mit 101 Elementen, und das passt nicht zusammen. Warum an der Stelle g ein Vektor mit 2 Elementen ist, kann ich dir auch nicht sagen.
Was mich jedoch erstaunt: du willst, soweit ich das verstehe, ein Doppelintegral berechnen. Im Integranden taucht jedoch auch nochmal ein Integral auf - wieso?
Hallo,
ich verstehe ich auch nicht, warum die Dimensionen unterschiedlich sind. Wahrscheinlich ist es unzulässig in dem Doppelintegral ein anderes zu berechnen? Das Problem ist, ich für eine Komponente, die ich im doppelten Integral brauche, ein anderes Integral berechnen muss, dies hängt aber wiederrum von g ab, was im doppelten berechnet wird.
Den Teil aus dem Paper habe ich als Bild angehangen. Da sieht man die Zusammenhänge ganz gut.
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.