1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #include "VA.cpp"
#include <vector>
#include <algorithm> //pour utiliser la fonction min()
using namespace std;
class CDO
{
public:
CDO (const int a, const int N, const double c, const double k1,const double k2);
~CDO();
void getELK1K2();
double price();
double* ELK1K2;
double* TRESHOLD, BONDS;
private:
int years, contracts;//nombre d'annèes de vie du cdo (avec payment trimestriel) et nombre de contracts sous-jacents
double correl,K1,K2;//Corrélation et pourcentages de la tranche
;
};
CDO::CDO (const int a,const int N, const double c,const double k1,const double k2)
: years(a),contracts(N), correl(c),K1(k1),K2(k2){
double* ELK1K2=new double[4*years+1];
double* TRESHOLD=new double[4*years];
double* BONDS=new double[4*years];
for (int i=0;i<4*years;i++)
{ TRESHOLD[i]=i/100.;
BONDS[i]=1/pow(1.03,0.25*(1+i)); }
}
// ~ CDO() {
// delete [] ELK1K2;
// delete [] TRESHOLD;
// delete [] BONDS; }
void CDO::getELK1K2()
{
const double n=(years*4);
const double MC=100000;
int j;
ELK1K2[0]=0.;
Norm M(0,1);//facteur de marché commun
double MM,L;
L=0.;
vector<Norm> NGauss(contracts);//vecteur de loi gaussiennes modélisant les rendements des titres
vector <double> Gauss(contracts);
for (int i=0;i<n;i++)
{
for (int ii=0;i<MC;ii++)
{MM=M();
j=0;
for(int iii=0;iii<contracts;iii++)
{Gauss[iii]=NGauss[iii]()*sqrt(1-correl*correl)+correl*MM;
if (Gauss[iii]<TRESHOLD[i]) j=j+1;}
L=L+max(min(j/n,K2)-K1,0.)/(K2-K1);
}
ELK1K2[i+1]=L/MC;
}
}
double CDO::price()
{ const double n=(years*4);
double premium, protection,s,price; //les deux jambes du CDO, le taux s et le pix de la tranche
double denom;
premium=0.;
protection=0.;
denom=0.;
for (int i=0;i<n;i++)
{
protection=protection+(ELK1K2[i+1]-ELK1K2[i])*BONDS[i];
denom=denom+0,25.*(1-ELK1K2[i+1])*BONDS[i];
}
s=protection/denom;
for (int i=0;i<n;i++)
{premium=premium+0,25.*s*(1-ELK1K2[i+1])*BONDS[i];}
price=protection-premium;
return price;
}
int main(){
CDO AIG (1, 80,0.09,0.03,0.09);
AIG.getELK1K2();
AIG.price();
return 1;
} |
Partager