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 }