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 }