00001 #include"..\PartB\yieldCurve.h"
00002 #include "../common/filereader.h"
00003
00004 #include<iostream>
00005 #include<valarray>
00006 #include<time.h>
00007 using namespace std;
00008
00013 bool mainyieldcurve(void) {
00014 string datadir = FileReader::getdatadirasstring();
00015 string yieldCurveData = datadir + "yctest.csv";
00016 Real shift=0.001,calculation=0.,matRotation=7;
00017 bool fctnResult=true;
00018
00019
00020 valarray<yieldPoint> *rates =
00021 FileReader::buildYieldPointArray(yieldCurveData);
00022
00023 yieldCurve testcurve=yieldCurve(*rates,"test");
00024
00025 valarray<Real> maturities = testcurve.getMaturitiesInTheZCBCurve();
00026 valarray<Real> ZCB(maturities.size());
00027
00028 yieldCurve ycShifted=testcurve.shiftZCBRateCurve(shift);
00029 valarray<Real> ZCBShift(maturities.size());
00030 yieldCurve ycRotated=testcurve.rotateZCBRateCurve(shift,matRotation);
00031 valarray<Real> ZCBRotate(maturities.size());
00032
00033 cout<<fctnResult<<endl;
00034
00035 for (Natural i = 0; i < ZCB.size(); i++) {
00036 ZCB[i] = testcurve.spotRate(maturities[i]);
00037 ZCBShift[i]=ycShifted.spotRate(maturities[i]);
00038 fctnResult&=(ZCBShift[i]==ZCB[i]+shift);
00039 }
00040
00041 for(i=0;i<rates->size();i++)
00042 cout << "Mkt Rate: " << (*rates)[i].getRate()*100 << " (mat: " << (*rates)[i].getMaturity()
00043 << " ; type: " << (*rates)[i].getType() << ")"<<endl;
00044
00045 cout << "ZCB rates:\n" << testcurve << endl;
00046
00047 string filename = FileReader::getdatadirasstring() + "test_YC_PCA.txt";
00048 ofstream myfile(filename.c_str());
00049 myfile << "Original curve\n"<<testcurve<<"\n";
00050 myfile << "Shifted curve\n"<<ycShifted<<"\n";
00051 myfile << "Rotated curve\n"<<ycRotated<<"\n";
00052 myfile << "DF\n";
00053 for(Real T=0.25;T<=30;T+=0.25)
00054 myfile << testcurve.discountFactor(T,Continuous)<<"\n";
00055 myfile << "6m Fwd\n";
00056 for(Real T=0.25;T<=29.5;T+=0.25)
00057 myfile << testcurve.forwardRate(0.5,T,Continuous)<<"\n";
00058 myfile.close();
00059
00060
00061 calculation=testcurve.spotRate (3.72);
00062 cout<<"\n Test Spot rate at 3.72 years "<<calculation<<endl;
00063 fctnResult&=(calculation>=0.0463701)&&(calculation<=0.0463702);
00064
00065 calculation=testcurve.spotRate (14);
00066 cout<<"\n Test Spot rate at 14 years "<<calculation<<endl;
00067 fctnResult&=(calculation>=0.0494384)&&(calculation<=0.0494385);
00068
00069 calculation =testcurve.discountFactor (5.6,Continuous);
00070 cout<<"\n Test DF at 5.6 years cont "<<calculation <<endl;
00071 fctnResult&=(calculation>=0.7688138)&&(calculation<=0.7688142);
00072
00073 calculation =testcurve.discountFactor (5.6,Discrete);
00074 cout<<"\n Test DF at 5.6 years disc "<<calculation <<endl;
00075 fctnResult&=(calculation>=0.7734288)&&(calculation<=0.7734292);
00076
00077 calculation =testcurve.discountFactor (1.5);
00078 cout<<"\n Test DF at 1.5 years "<<calculation<<endl;
00079 fctnResult&=(calculation>=0.934078)&&(calculation<=0.934079);
00080
00081 Date d=Date();
00082 d.setDateToToday ();
00083 calculation =testcurve.discountFactor(d.plusMonths(18));
00084 cout<<"\n Test from today to 18 months : "<<calculation<<endl;
00085 fctnResult&=(calculation>=0.930458)&&(calculation<=0.930459);
00086
00087 calculation=testcurve.discountFactor (Date(18,(Month)6,2007));
00088 cout<<"\n Test DF in Date (18/6/2007)"<<calculation <<endl;
00089 fctnResult&=(calculation>=0.930458)&&(calculation<=0.930459);
00090
00091 calculation=testcurve.discountFactor (4);
00092 cout<<"\n Test DF at 4 years "<<calculation<<endl;
00093 fctnResult&=(calculation>=0.830441)&&(calculation<=0.830442);
00094
00095 calculation=testcurve.forwardRate(1.5,2.5,Continuous);
00096 cout<<"\n Test FWD at (1.5,2.5) <=> 4 years maturity cont "<<calculation<<endl;
00097 fctnResult&=(calculation>=0.0470409)&&(calculation<=0.0470410);
00098
00099 calculation=testcurve.forwardRate(1.5,2.5,Discrete);
00100 cout<<"\n Test FWD at (1.5,2.5) <=> 4 years maturity disc "<<calculation<<endl;
00101 fctnResult&=(calculation>=0.0470413)&&(calculation<=0.0470414);
00102
00103 return fctnResult;
00104 }