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

Minimierung einer multivariaten Funktion mit Nebenbedingung

 

rasta1985
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 06.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2010, 23:37     Titel: Minimierung einer multivariaten Funktion mit Nebenbedingung
  Antworten mit Zitat      
Huhu,


ich habe das folgende Problem. Ich möchte die untenstehende Funktion minimieren.

Code:


function f = funrr(mu,a,b)


q=100; %Anzahl der Wiederholungen
varomikron=0.04;


randZ=randn(q,12500);
randEps=randn(q,12500);
randOmik=normrnd(0,sqrt(varomikron),q,12500);

sigma=sqrt(b^2+varomikron);
rho=((a*b)/sigma);
l=zeros([20 125]);
Portfolioverlust=zeros(20,q);
Epsilon=zeros(20,1);
Omikron=zeros(20,1);
X=zeros(20,1);
Z=zeros(20,1);
v=zeros(q,1);
s=zeros(q,1);
pvprot=zeros(21,q);
pvdef=zeros(21,q);
LA=zeros(20,q);
LB=zeros(20,q);
LTranche=zeros(21,q);
spread=zeros(5,1);

spreadmodel=[0.0723309797736948 0.00474353239675 0.00125486203410625 0.0005703876529 0.00022735709814375];


r2007=xlsread('C:\Universitaet\Diplomarbeit\Daten\Spotrates','Tabelle1','A2:A21');
stetverzinsung=zeros(20,1);
for i = 1:20
   stetverzinsung(i)=exp(-r2007(i)*(i/4));
end
k=1:20;
p=1-exp((-0.003514966*k)/4); % Berechnung anhand des durch. CDS Spreads
c = norminv(p);

Attachment=[0.00001 0.03 0.06 0.09 0.12]; % Attachment Punkte der einzelnen Tranchen
Detachment=[0.03000 0.06 0.09 0.12 0.22]; % Detachment Punkte der einzelnen Tranchen

            for d=1:5
A=Attachment(d); %Attachment Punkt
B=Detachment(d); %Detachment Punkt
for i=1:q
Z(1)=randZ(i,(d-1)*20+1);
    for j=1:125
Epsilon(j)=randEps(i,(d-1)*2500+j);
Omikron(j)=randOmik(i,(d-1)*2500+j);
X(j)=a*Z(1)+sqrt(1-a^2)*Epsilon(j);
        if (X(j)<=c(1))
    l(1,j)=1-normcdf(mu-b*Z(1)+Omikron(j));
else l(1,j)=0;
        end
    end
Portfolioverlust(1,i)=sum(l(1,:))/125;
    for r=2:20
   Z(r)=randZ(i,(d-1)*20+r);
               for j=1:125
                    if (l(r-1,j)>0)
    l(r,j)=l(r-1,j);
else
Epsilon(j)=randEps(i,(r-1)*125+(d-1)*2500+j);
Omikron(j)=randOmik(i,(r-1)*125+(d-1)*2500+j);
X(j)=a*Z(r)+sqrt(1-a^2)*Epsilon(j);
                        if (X(j)<=c(r))
    l(r,j)=1-normcdf(mu-b*Z(r)+Omikron(j));
else l(r,j)=0;
                        end
                    end
               end
    Portfolioverlust(r,i)=sum(l(r,:))/125;
    LA(r,i)=max(Portfolioverlust(r,i)-A,0);
    LB(r,i)=max(Portfolioverlust(r,i)-B,0);
    LTranche(r+1,i)=(1/(B-A))*(LA(r,i)-LB(r,i));
    end
        for h=2:21
    pvprot(h-1,i)=stetverzinsung(h-1)*(LTranche(h,i)-LTranche(h-1,i));
    pvdef(h-1,i)=0.25*stetverzinsung(h-1)*(1-LTranche(h,i));
        end
        if (d==1)
            v(i)= -sum(pvdef(:,i))*0.05+sum(pvprot(:,i));
        else s(i)=sum(pvprot(:,i))/sum(pvdef(:,i));  
        end
    if (d==1)
        spread(1)=sum(v)/q;
            else spread(d)=sum(s)/q;
    end
end
            end
           
   f = spread(1)-spreadmodel(1)+spread(2)-spreadmodel(2)+spread(3)-spreadmodel(3)+spread(4)-spreadmodel(4)+spread(5)-spreadmodel(5);
 


Des Weiteren soll folgendes immer gelten. Die untere Gleichung ist von r abhängig. Die Anpassung soll so stattfinden, dass für r=1,...,20 mu variiert wird. Ich möchte also am Ende einen Wert für a und b und 20 Werte für mu haben, die die oben stehende Funktion minimieren. Leider weiß ich nicht, wie ich das Problem angehen soll.
Code:

expectedvalue=@(x) normcdf((mu+rho*sigma*x)/sqrt(1+sigma^2*(1-rho^2)))*normpdf(x);
(0.4)/p(r)=quad(expectedvalue,-999999,c(r));
 


Vielen Dank,

Philip[/code]
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

An sich würde das ganze mit fmincon und einer nichtlinearen Gleichungs-NB abgedeckt. Ich sehe aber RANDN darin, d.h. dass die Zielfunktion auch bei gleichem Input jedes Mal anders sein kann --> stochastische Optimierung, Algorithmen wie patternsearch verwenden.

Das Problem würde ich erstmal so formulieren:
min (Summe über r (fun(mu_r, a, b).^2) )

Ich denke, es wäre sinnvoll, zumindest für jeden Summanden dieselben Zufallszahlen zu verwenden. Mehr dazu unter
Code:

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 06.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2010, 14:47     Titel:
  Antworten mit Zitat      
Hab die NB erstmal rausgelassen, um es zu testen und zumindest rechnet mir pattern search was aus. Was mich aber eigentlich wirklich interessiert sind gar nicht die Parameter sondern meine Modellspreads... kann ich mir die irgendwie ausgeben lassen? Wenn pattern search durchgelaufen ist, habe ich nur zwei Vektoren im Workspace - x0 und die Lösung für die Parameter. Um zu sehen, ob ich wirklich ein zufriedenstellendes Ergebnis habe, müsste ich aber die Modellspreads kennen. Komme ich an spreadmodel(1-5) irgendwie ran?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich würde mir eine abgewandelte Funktion schreiben, die dir die Model Spreads zurückgibt (könnte man wohl auch über einen zusätzlichen Parameter oder so regeln, ist aber etwas mehr Aufwand).

Was mich gerade stört, ist
Code:
f = spread(1)-spreadmodel(1)+spread(2)-spreadmodel(2)+spread(3)-spreadmodel(3)+spread(4)-spreadmodel(4)+spread(5)-spreadmodel(5);


Wenn du die Abweichung von spread und spreadmodel zueinander minimieren möchtest, ist das IMHO keine gute Idee, da Abweichungen nach unten nicht nur toleriert, sondern sogar ermutigt werden. Besser vielleicht:
Code:
f = sum((spread - spreadmodel).^2);


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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 06.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2010, 17:14     Titel:
  Antworten mit Zitat      
Ja,

ich habe es auch geändert...
Code:

function f = funrr(X)

mu=X(1);
a=X(2);
b=X(3);
 f = (spread(1)-spreadmodel(1)+spread(2)-spreadmodel(2)+spread(3)-spreadmodel(3)+spread(4)-spreadmodel(4)+spread(5)-spreadmodel(5))^2;
 


Ohne die spreadmodel Angabe weiß ich ja sonst leider nicht, ob ich in einem lokalen Minimum gelandet bin. Bisher hab ich leider keine Lösung gehabt, in der sich mu vom Startwert ändert, was irgendwie dafür spricht, dass ich ziemlich viele lokale Minima habe. Die Frage ist, wie ich an die Zufallszahlen rankomme, die für die Simulation benutzt wurden...schließlich sind die nicht im Workspace enthalten und die optimalen Parameter hängen ja leider davon ab.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

in der Form, wie du deine Zielfunktion jetzt formulierst, hast du das Problem, dass Abweichungen in der einen Komponente nach oben durch Abweichungen in anderen Komponenten nach unten ausgeglichen werden können. Das ist meiner Meinung nach nicht der Sinn der Sache.
In der Doku von randn ist ganz unten beschrieben, wie man den seed des Zufallsgenerator so setzen kann, dass die Zahlen entweder so zufällig wie möglich oder über den Seed reproduzierbar sind.
Zudem solltest du so viele Simulationen nehmen (100 sind eher wenig, ich würde min. 1000, besser 10000 nehmen), dass der Zufall weitgehend rausgerechnet wird. Das sollte auch patternsearch helfen (wie gesagt: fmincon macht hier keinen Sinn, weil zufallsbasiert!).

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 06.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2010, 16:43     Titel:
  Antworten mit Zitat      
Ok,

schonmal vielen Dank. Der Optimierungsprozess klappt... ich hab nur ein Problem. Wenn ich die Generierung der Zufallszahlen an den Anfang stelle, dann bekomme ich am Ende keine Lösung für alle 5 Spreads, sondern nur eine Lösung für die ersten beiden oder die ersten drei Spreads. Die Wahrscheinlichkeit ist dann ja leider auch groß, dass dieses Problem bei dem Optimierungsprozess auftritt. Ich verstehe nur nicht, warum die bloße Veränderung der Zufallszahlenziehung diesen Effekt hat.
Code:

randZ=randn([q 5]);
randEps=randn([q 625]);
randOmik=normrnd(0,sqrt(varomikron),[q 625]);
for r=2:20
   Z(r)=randZ(i,d);
               for j=1:125
                    if (l(r-1,j)>0)
    l(r,j)=l(r-1,j);
else
Epsilon(j)=randEps(i,(d-1)*125+j);
Omikron(j)=randOmik(i,(d-1)*125+j);
 


Wenn ich dagegen alles so lasse, wie am Anfang und die Zufallszahlen quasi in der Schleife generiere und sonst alles identisch ist, kriege ich Lösungen für alle 5 Spreads, was mir nicht ganz einleuchtet. Woran kann das liegen?
Code:

for i=1:q
Z(1)=randn(1);
    for j=1:125
Epsilon(j)=randn(1);
Omikron(j)=normrnd(0,sqrt(varomikron));
 


Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da sehe ich auch keinen offensichtlichen Grund.

Das verstehe ich allerdings auch shcon nicht:
Zitat:
dann bekomme ich am Ende keine Lösung für alle 5 Spreads, sondern nur eine Lösung für die ersten beiden oder die ersten drei Spreads.

... soll heißen??

Lass das ganze auch wiederholt laufen... es kann auch sein, dass man mal "Glück" hat und günstigere Zufallszahlenfolgen erwischt.

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