00001 #include "GaussianProcess.h" 00002 #include <math.h> 00003 #include <cmath> 00004 #include<valarray> 00005 using namespace std; 00006 00007 GaussianProcess::GaussianProcess(const valarray<LongInteger> schedule, 00008 const LongNatural& nDates, 00009 const Real &initialRate, 00010 const valarray<Real> drift, 00011 const Real &meanReversionSpeed, 00012 Real &vol) 00013 { 00014 m_vDates.resize(nDates+1); 00015 m_vDrift.resize(nDates); 00016 m_vDates=schedule; 00017 m_vDrift=drift; 00018 m_dbMeanReversionSpeed = meanReversionSpeed; 00019 m_dbVol = vol; 00020 m_dbInitialRate = initialRate; 00021 m_nDates = nDates; 00022 m_vStepSize.resize(m_nDates); 00023 00024 for(Natural i=0;i<nDates;++i) 00025 m_vStepSize[i] = (schedule[i+1]-schedule[i])/365; 00026 } 00027 00028 GaussianProcess::GaussianProcess(const valarray<LongInteger> schedule, 00029 const LongNatural& nDates, 00030 const Real &initialRate, 00031 const valarray<Real> drift, 00032 const Real &meanReversionSpeed, 00033 volsurface* vol, 00034 Real strike) 00035 { 00036 m_vDates.resize(nDates+1); 00037 m_vDrift.resize(nDates); 00038 m_vDates=schedule; 00039 m_vDrift=drift; 00040 m_dbMeanReversionSpeed = meanReversionSpeed; 00041 _vol = vol; 00042 m_dbVol=-1.; 00043 m_dbInitialRate = initialRate; 00044 m_nDates = nDates; 00045 m_vStepSize.resize(m_nDates); 00046 _strike=strike; 00047 00048 for(Natural i=0;i<nDates;++i) 00049 m_vStepSize[i] = (schedule[i+1]-schedule[i])/365; 00050 } 00051 00052 GaussianProcess::GaussianProcess(void) 00053 { 00054 } 00055 00056 GaussianProcess::~GaussianProcess() 00057 { 00058 } 00059 00060 valarray<Real> GaussianProcess::BuildPath(valarray<Real> gaussianShocks) 00061 { 00062 valarray<Real> path; 00063 path.resize(m_nDates); 00064 Real RandomPath,logRandomPath; 00065 RandomPath = m_dbInitialRate; 00066 logRandomPath = log(RandomPath); 00067 if (m_dbVol=-1.) { 00068 Date t=Date(); 00069 for (LongNatural i=0;i<m_nDates;++i) 00070 { 00071 t=Date(m_vDates[i]); 00072 logRandomPath += (m_vDrift[i]-m_dbMeanReversionSpeed*logRandomPath) + _vol->volatility(_strike,t)*gaussianShocks[i]*sqrt(Real(m_vDates[i+1]-m_vDates[i])/365); 00073 path[i] = exp(logRandomPath); 00074 } 00075 } 00076 else { 00077 for (LongNatural i=0;i<m_nDates;++i) 00078 { 00079 logRandomPath += (m_vDrift[i]-m_dbMeanReversionSpeed*logRandomPath) + m_dbVol*gaussianShocks[i]*sqrt(Real(m_vDates[i+1]-m_vDates[i])/365); 00080 path[i] = exp(logRandomPath); 00081 } 00082 } 00083 return path; 00084 } 00085 00086 Real GaussianProcess::BuildTerminalPoint(Real gaussianShock){ 00087 Real path; 00088 Real logRandomPath; 00089 logRandomPath = log(m_dbInitialRate)+(m_vDrift[0]) + m_dbVol*gaussianShock*sqrt(Real((m_vDates[1]-m_vDates[0])/365)); 00090 path = exp(logRandomPath); 00091 return path; 00092 } 00093 00094 00095 void GaussianProcess::GetStepIncrements(valarray<Real> stepIncrements) 00096 { 00097 LongNatural i; 00098 for(i=0;i<m_nDates;++i) 00099 stepIncrements[i] = m_vStepSize[i]; 00100 }