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.000010.030.060.090.12]; % Attachment Punkte der einzelnen Tranchen
Detachment=[0.030000.060.090.120.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.
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
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?!
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:
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.
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!).
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?
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
Einstellungen und Berechtigungen
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.