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

Schleife einbauen aber wie??

 

boulala
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2015, 00:06     Titel: Schleife einbauen aber wie??
  Antworten mit Zitat      
Hi Leute,

ich habe eine komplexere Funktion die mir den Preis einer Call Option berechnet. Nun habe ich eine Excel Datei mit den dazugehörigen Parametern, die für diese Funktion benötigt werden. Ich möchte in diese Funktion jetzt eine Schleife einbauen, die mir jede Zeile der eingelesenen Datei separat berechnet und die Ergebnisse in einer neuen Excel Datei ausspuckt.
Ich habe absolut keine Ahnung wie ich das hinbekommen soll. Ich habe schon viel rumprobiert, aber ich bekomme es einfach nicht hin.
Der originale Code sieht wie folgt aus:

Code:
function y = HestonFFTVanilla(phi,S,K,T,r,rf,kappa,theta,sigma,rho,v0,alpha,method)
%HESTONFFTVANILLA European FX option price in the Heston model
%(Carr-Madan approach).
%   Y = HESTONFFTVANILLA(PHI,S,K,T,R,RF,KAPPA,THETA,SIGMA,RHO,V0) returns
%   the price of a European call (PHI=1) or put (PHI=-1) option given
%   spot price S, strike K, time to maturity (in years) T, domestic R and
%   foreign RF interest rates, rate of mean reversion KAPPA, average level
%   of volatility THETA, volatility of volatility SIGMA, correlation
%   between the Wiener increments driving the spot and vol processes RHO,
%   and initial volatility VO.
%   Y = HESTONFFTVANILLA(...,ALPHA,METHOD) allows to specify the coefficient
%   ALPHA of the exponential smoother (default: ALPHA=0.75 for calls and
%   1+ALPHA=1.75 for puts) and the integration method of the complex
%   integral: METHOD = 0 (default) -> adaptive Gauss-Kronrod quadrature,
%   or METHOD = 1 -> FFT + Simpson's rule (as in [2]).
%    
%   Sample use:
%     >> HestonFFTVanilla(1,1.36721,1.39,0.0192,0.00087,0.002786,1.5,0.049124837,0.630932314,-0.18371449,0.006968076,0.75,1)

daten=xlsread('CallPreise.xlsx','Jan','B2:K55');
phi = 1;
S=daten(:,1);
K=daten(:,2);
T=daten(:,3);
rd=daten(:,4);
rf=daten(:,5);
kappa=daten(:,6);
theta=daten(:,7);
sigma=daten(:,8);
rho=daten(:,9);
v0=daten(:,10);
alpha=0.75;
method=1;
s0 = log(S);
k = log(K);

if (nargin < 11)
  error ('Wrong number of input arguments.')
else
  if (nargin < 13)
    % Set default value of method:
    method = 0; % adaptive Gauss-Kronrod quadrature
    if (nargin == 11)
      % Set parameter alpha (see [3])
      alpha = 0.75; % used for call option
    end
  end
end

if (phi==-1), %put option
  alpha = alpha + 1;
end

s0 = log(S);
k = log(K);
   
%%%%%hier soll die Schleife beginnen%%%%%%
 
if (method == 0)
  % Integrate using adaptive Gauss-Kronrod quadrature
  y = exp(-phi.*k.*alpha).*quadgk(@(v) HestonFFTVanillaInt(phi,s0,k,T,r,rf,kappa,theta,sigma,rho,v0,alpha,v),0,inf,'RelTol',1e-8)./pi;
else
  % FFT with Simpson's rule (as suggested in [2])
  N = 2^10;
  eta = 0.25;
  v =(0:N-1)*eta;
   
  lambda = 2*pi/(N*eta);
  b = N*lambda/2;
  ku = -b+lambda.*(0:N-1);
  u = v - (phi.*alpha+1)*1i;
  d = sqrt((rho.*sigma.*u*1i-kappa).^2+sigma.^2.*(1i*u+u.^2));
  g = (kappa-rho.*sigma.*1i.*u-d)./(kappa-rho.*sigma*1i.*u+d);
   
  % Characteristic function (see [1])
  A = 1i*u.*(s0 + (r-rf).*T);
  B = theta.*kappa.*sigma.^(-2).*((kappa-rho.*sigma*1i.*u-d).*T-2*log((1-g.*exp(-d.*T))./(1-g)));
  C = v0.*sigma.^(-2).*(kappa-rho.*sigma*1i.*u-d).*(1-exp(-d.*T))./(1-g.*exp(-d.*T));
  charFunc = exp(A + B + C);
  F = charFunc*exp(-r*T)./(alpha^2 + phi.*alpha - v.^2 + 1i*(phi.*2*alpha +1).*v);
   
  % Use Simpson's approximation to calculate FFT (see [2])
  SimpsonW = 1/3*(3 + (-1).^[1:N] - [1, zeros(1,N-1)]);
  FFTFunc = exp(1i*b*v).*F*eta.*SimpsonW;
  payoff = real(fft(FFTFunc));
  OptionValue = exp(-phi.*ku.*alpha).*payoff./pi;
  % Interpolate to get option price for a given strike
  y = interp1(ku,OptionValue,k);
end

%%%%%%%%%%%%% INTERNALLY USED ROUTINE %%%%%%%%%%%%%

function payoff = HestonFFTVanillaInt(phi,s0,k,T,r,rf,kappa,theta,sigma,rho,v0,alpha,v)
%HESTONFFTVANILLAINT Auxiliary function used by HESTONFFTVANILLA.
%   PAYOFF=HESTONFFTVANILLAINT(phi,s0,k,T,r,rf,kappa,theta,sigma,rho,v0,alpha,v)
%   returns the values of the auxiliary function evaluated at points V,
%   given log(spot price) S0, log(strike) K, time to maturity (in years) T,
%   domestic interest rate R, foreign interest rate RF, level of mean
%   reversion KAPPA, long-run variance THETA, vol of vol SIGMA, correlation
%   RHO, initial volatility VO, damping coefficient ALPHA and option type PHI:
%   PHI = 1 --> call option,
%   PHI = -1 --> put option.
   
u = v - (phi.*alpha+1)*1i;
d = sqrt((rho.*sigma.*u*1i-kappa).^2+sigma.^2.*(1i*u+u.^2));
g = (kappa-rho.*sigma.*1i.*u-d)./(kappa-rho.*sigma*1i.*u+d);

% Characteristic function (see [1])
A = 1i*u.*(s0 + (r-rf).*T);
B = theta.*kappa.*sigma.^(-2).*((kappa-rho.*sigma*1i.*u-d).*T-2*log((1-g.*exp(-d.*T))./(1-g)));
C = v0.*sigma.^(-2).*(kappa-rho.*sigma*1i.*u-d).*(1-exp(-d.*T))./(1-g.*exp(-d.*T));
charFunc = exp(A + B + C);
FFTFunc = charFunc*exp(-r*T)./(alpha^2 + phi.*alpha - v.^2 + 1i*(phi.*2*alpha +1).*v);
payoff = real(exp(-1i.*v.*k).*FFTFunc);

 


Vielleicht erbarmt sich jemand und hilft mir weiter...
Im Anhang findet Ihr meinen Versuch HestonFFTVanilla und das original HestonFFTVanilla1.

Viele Grüße
boulala

CallPreise.xls
 Beschreibung:

Download
 Dateiname:  CallPreise.xls
 Dateigröße:  38 KB
 Heruntergeladen:  239 mal
HestonFFTVanilla1.m
 Beschreibung:

Download
 Dateiname:  HestonFFTVanilla1.m
 Dateigröße:  4.04 KB
 Heruntergeladen:  263 mal
HestonFFTVanilla.m
 Beschreibung:

Download
 Dateiname:  HestonFFTVanilla.m
 Dateigröße:  4.94 KB
 Heruntergeladen:  227 mal
Private Nachricht senden Benutzer-Profile anzeigen


Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 30.03.2015, 12:50     Titel:
  Antworten mit Zitat      
hi boulala,

dein Versuch HestonFFTVanilla läuft doch und gibt ein Ergebnis aus. Wo liegt genau dein Problem bei der Schleife? Gibt es eine Fehlermeldung? Oder liegt es eher an der Exportierung in Excel?
Ich würde bei der Schleife nur keinen Hardcode verwenden, falls du einmal eine andere Anzahl an Zeilen hast.
eher so:
Code:

for count = 1:1:length(k)

Exportieren in Excel funktioniert mit
Code:


vg
Private Nachricht senden Benutzer-Profile anzeigen
 
Threadstarter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2015, 17:02     Titel:
  Antworten mit Zitat      
Ja es scheint zu funktionieren. Jedoch schmeißt der mir Ans = viele Ergebnisse raus auch wenn mein for count = 1:1 ist.

Versuche ich das original HestonFFTVanilla1 manuell mit den Beispielwerten, so bekomme ich auch ein ganz anderes Ergebnis.
 
Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 31.03.2015, 00:16     Titel:
  Antworten mit Zitat      
also das ans viele Werte rausschmeißt würde ich mir durch

Code:
y = interp1(ku,OptionValue,k);


erklären. Da interpolierst du ja, damit du mehr Werte rausbekommst.
Für die Berechnung an sich hatte ich bis jetzt keine Zeit mir die genauer anzusehen.
Inwiefern unterscheiden sich die Ergebnisse denn? Oder bzw. kannst du sagen, ob eine der beiden Funktionen ein falsches Ergebnis liefert?
Private Nachricht senden Benutzer-Profile anzeigen
 
boulala
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2015, 00:35     Titel:
  Antworten mit Zitat      
Also HestonFFTVanilla1 schmeißt den richtigen Wert raus. Und zwar auch nur einen einzigen, trotz y=interpol(...

Genau das sollte HestonFFTVanilla auch machen. Mir nur einen Wert ausgeben.
Wenn ich mit
Code:
daten=xlsread('CallPreise.xlsx','Jan','B2:K2);

nur eine Zeile auslese, dann bekomme ich auch nur einen Wert heraus. Sobald ich aber K=3 setze kommen 2 Werte raus obwohl der counter noch auf 1 steht.
Was noch merkwürdig ist, ist sobald mehr Zeilen eingelesen werden sich auch die Ergebnisse ändern.

Mit B2:K2 bekomme ich 0.001645145286354

Mit B2:K3 bekomme ich 0.009440084963203
0.018596055039021
Das bedeutet, dass die Schleife irgendwo einen Fehler hat, da sich der erste Wert ändert.
Private Nachricht senden Benutzer-Profile anzeigen
 
boulala
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2015, 11:41     Titel:
  Antworten mit Zitat      
So habe es mal anders gemacht (ich glaube so ist es schlauer). Anstatt die Funktion zu verändern, habe ich ein Script geschrieben welches auf die Funktion zurückgreift.

Code:
daten=xlsread('CallPreise.xlsx','Jan','B2:K55'); %Januar
phi = 1;
S=daten(:,1);
K=daten(:,2);
T=daten(:,3);
rd=daten(:,4);
rf=daten(:,5);
kappa=daten(:,6);
theta=daten(:,7);
sigma=daten(:,8);
rho=daten(:,9);
v0=daten(:,10);
alpha=0.75;
method=1;

s0 = log(S);
k = log(K);
ende = length(S);
Call = zeros(ende,1);

for count = 1:ende
   
    Call = HestonFFTVanilla(phi,S(count),K(count),T(count),rd(count),rf(count),kappa(count),...
           theta(count),sigma(count),rho(count),v0(count),alpha,method);
   
end


Die Sache ist nur die, dass mir nur ein Ergebnis angezeigt wird anstatt 54 verschiedene. Der Datensatz hat ja 54 Zeilen und ich müsste ja eigentlich dann 54 Ergebnisse erhalten.

Hat jemand eine Idee?

Viele Grüße
boulala

edit: ups es muss ja Call(count) heißen dann klappt es auch Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 31.03.2015, 12:52     Titel:
  Antworten mit Zitat      
okay, stimmt, die vorhandene Funktion einfach in dein Programm einzubinden ist natürlich die beste Option, das spart in der Regel viel Arbeit ;)

Dann ist dein Problem hiermit gelöst, wenn ich das richtig verstehe?
Funktioniert die Ausgabe in Excel bei dir?
Private Nachricht senden Benutzer-Profile anzeigen
 
boulala
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2015, 13:58     Titel:
  Antworten mit Zitat      
Ja das Problem ist gelöst. Excel habe ich so gelöst:

Code:
%%%%Speichert Daten in Excel%%%%%
col_header={'Datum','Call Preis'};
M = [[d],Call];
xlswrite('dez.xlsx',M,1,'A2');
%Fügt Überschriften ein
xlswrite('dez.xlsx',col_header,1,'A1');


Danke für dein Interesse Wink
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.