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

Nichtlineare Optimierung mit fmincon

 

wiesbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2011, 02:38     Titel: Nichtlineare Optimierung mit fmincon
  Antworten mit Zitat      
Schönen guten Abend,
ich hoffe jemand könnte eine Idee zu folgendem Problem haben. Es hat zwar einen finanzmathematischen Hintergrund, läuft jedoch auf ein Optimierungsproblem hinaus.
Ich habe eine Exchange Option (das ist eine Option, die einem das Recht gibt, eine Aktie gegen eine andere zu tauschen). Der Wert dieser Option hängt von verschiedenen Parametern ab. Nun gilt es für einen gegebenen Wert diese Parameter zu ermitteln.
Hier die Formel zur Ermittlung des Preises:
Code:
%abgepeichert unter m-file exchangecallQ3
function [CallEX] = exchangecallQ3(S1,S2,x,T)

d1 = (log(S1./S2)+(1/2)*(x(1).^2+x(2).^2-2.*x(3).*x(1).*x(2))*T)./(sqrt(x(1).^2+x(2).^2-2.*x(3).*x(1).*x(2))*sqrt(T));

d2 = d1-sqrt(x(1).^2+x(2).^2-2.*x(3).*x(1).*x(2))*sqrt(T);

CallEX = S1.*normcdf(d1)-S2.*normcdf(d2);


S1 und S2 sind Aktienpreise, T ist die Laufzeit und x ist ein Vector der die zu ermittelnden Parameter enthält (3 Stück). Nun ist ein Preis von $10.7 gegeben. Daher würde ich versuchen, folgende Funktion zu minmieren:


Code:
%abgespeichert in m-file objfun
function fval = objfun(x)
fhandle1 = @(x) exchangecallQ3(93.4,112.5,x,1);
fval = (fhandle1(x) - 10.7)^2;


Bei den Parametern handelt es sich um Volatilität (x(1),x(2)) der Aktien und die Korrelation (x(3)). Daher hätte ich für x(3) festgelegt:

Code:
%abgespeichert in m-file confun
function [c,ceq] = confun(x)

c = [x(3)-1;
    -x(3)-1];
ceq = [];


Um zu minimieren, gebe ich ein und bekomme folgendes ergebnis:

Code:
%Eingabe in Command Window
x0 = [0,0,-1];
options = optimset('LargeScale','off');
[x,fval] = fmincon(@objfun,x0,[],[],[],[],[0,0,-1],[Inf,Inf,1],@confun,options)

Active inequalities (to within options.TolCon = 1e-006):
  lower      upper     ineqlin   ineqnonlin
    1                                2
    2                                
    3                                

x =

     0     0    -1


fval =

  451.2125


Für x(1) und x(2) habe ich lower bounds of 0 und upper bounds of Inf gesetzt, da volatilität nicht kleiner als 0 aber (theoretisch) unendlich hoch sein kann.

451.2125 erhält man durch 10.7^2. Also eigentlich wurde maximiert anstatt minimiert. Was mach ich falsch? Für Tips bin ich sehr dankbar!

VG
wiesbi


Harald
Forum-Meister

Forum-Meister


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

woraus schließt du, dass maximiert wurde? Ich würde eher vermuten, dass dein Startwert ein lokales Minimum war und du von diesem daher nicht weggekommen bist. Es könnte helfen, einen Startwert zu wählen, der näher an der tatsächlichen Lösung liegt.
Zudem sind die nichtlinearen Nebenbedingungen meines Erachtens unnötig, da du sie schon über die Schrankennebenbedingungen abgedeckt hast.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2011, 18:40     Titel:
  Antworten mit Zitat      
Hallo,
vielen Dank Harald. Ich komme dem gewünschten Ergebnis näher. Ich will nun folgende Funktion minimieren:

Code:

function fval = objfun(x)
fhandle1 = @(x) exchangecallQ3(93.4,112.5,x,1);
fhandle2 = @(x) exchangecallQ3(103.6,102.3,x,1);
fhandle3 = @(x) blackscholesQ3(113.8,100,0.02,1,x);

fval = ((fhandle1(x) - 10.7)^2 +(fhandle2(x)-19.65)^2+(fhandle3(x)-33.61)^2);


Ich bekomme folgendes Ergebnis:
Code:

[x,fval] = fmincon(@objfun,x0,[],[],[],[],[0,0,-1],[Inf,Inf,1])

No active inequalities.

x =

    0.6000    0.2162    0.7373


fval =

    0.0219
 


Dieses Ergebnis sieht auf den ersten Blick ganz vernünftig aus. Jedoch reagieren die Werte extrem sensible auf die Auswahl der Startwerte in x0. Ein Bsp.:
Code:

x0 = [0.2,0.25,0];

x =

    0.6000    0.2389    0.7034


fval =

    0.0219


Meine theoretischen Kenntnisse in Optimierung sind eher mau. Programmiere ich falsch? Habe ich die falsche Optimierungsmethode benutzt?
Wenn mir hier noch jemand einen Ratschlag geben kann, wäre das super.

VG
wiesbi
 
wiesbi

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.03.2011, 23:17     Titel:
  Antworten mit Zitat      
problem ist gelöst. die präsentierte antwort ist richtig, es gibt allerdings multiple solutions, da x(2) and x(3) so verändert werden können, dass mit verschieden inputs die objective function den selben wert annimmt. so viel dazu...
 
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.