00001 #include "./Exotics.h" 00002 00003 Exotics::Exotics(exoticsType type,yieldCurve* curve,volsurface* surface,Real spot,Real strike, 00004 Real Expiry,LongNatural nDates,Real strike2,LongNatural nPaths) 00005 : _type(type), 00006 _yieldCurve(curve), 00007 _volSurface(surface), 00008 _spot(spot), 00009 _strike(strike), 00010 _strike2(strike2), 00011 _expiry(Expiry), 00012 _nPaths(nPaths), 00013 _nDates(nDates) 00014 { 00015 } 00016 00017 Exotics::~Exotics(void) 00018 { 00019 } 00020 00021 Real Exotics::getPrice() { 00022 switch (_type) { 00023 case AsianCall: 00024 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,3); 00025 case AsianPut: 00026 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,4); 00027 case RevLookbackCall: 00028 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,5); 00029 case RevLookbackPut: 00030 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,6); 00031 case BarrierCall: 00032 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,7); 00033 case BarrierPut: 00034 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,8); 00035 case FlooredCliquet: 00036 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,9); 00037 case CappedCliquet: 00038 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,10); 00039 case CollaredCliquet: 00040 return mainmc(_expiry,_strike,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,9)+mainmc(_expiry,_strike2,_spot,_volSurface,_yieldCurve,_nPaths,_nDates,10); 00041 default: 00042 return 0.; 00043 } 00044 } 00045 00046 Real Exotics::getDelta() { 00047 Real result=0.; 00048 result=getPrice(); 00049 _spot*=1.01; 00050 result-=getPrice(); 00051 _spot/=1.01; 00052 return result; 00053 } 00054 00055 Real Exotics::getRho() { 00056 Real result=0.; 00057 result=getPrice(); 00058 _yieldCurve->shiftZCBRateCurve(); 00059 result-=getPrice(); 00060 _yieldCurve->shiftZCBRateCurve(-defaultshiftfactorForShortRate); 00061 return result; 00062 } 00063 00064 Real Exotics::getTheta() { 00065 Real result=0.; 00066 result=getPrice(); 00067 yieldCurve yield=*_yieldCurve; 00068 _yieldCurve->forwardZCBCurve(defaultAdvDays/365); 00069 volsurface volsurf=*_volSurface; 00070 Date advDate=Date(); 00071 advDate.setDateToToday(); 00072 advDate.plusDays((Integer)defaultAdvDays); 00073 _volSurface=&_volSurface->forwardvolsurface(advDate); 00074 result-=getPrice(); 00075 _yieldCurve=&yield; 00076 _volSurface=&volsurf; 00077 return result; 00078 } 00079 00080 Real Exotics::getVega() { 00081 Real result=0.; 00082 result=getPrice(); 00083 _volSurface->shiftedvolsurface(defaultShiftVolSurface); 00084 result-=getPrice(); 00085 _volSurface->shiftedvolsurface(-defaultShiftVolSurface); 00086 return result; 00087 }