Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

GaussianProcess.cpp

Go to the documentation of this file.
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 }

Note: Generated nightly - reload for latest version
Generated on Thu Dec 22 23:12:36 2005 for terreneuve by doxygen 1.3.6