-
Notifications
You must be signed in to change notification settings - Fork 2
/
GeneticVanillaSwapPricer.cpp
97 lines (74 loc) · 3.11 KB
/
GeneticVanillaSwapPricer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "GeneticVanillaSwapPricer.h"
#include <Coupon.h>
#include <CappedFlooredCoupon.h>
#include <math.h>
#include <memory>
#include <iostream>
//size_t GeneticVanillaSwapPricer::find(double paymentDay, std::vector<double> dateLibor)const
//{
// assert(paymentDay>=0);
// for(size_t i=0; i<dateLibor.size();i++)
// {
// if(paymentDay<dateLibor[i]){return i-1;}
// }
// return dateLibor.size()-1;
//}
double GeneticVanillaSwapPricer::geneticVanillaSwap_Analytical(GeneticSwap_CONSTPTR geneticVanillaSwap, const std::vector<double>& liborsInitValue)const
{
std::vector<Coupon_CONSTPTR> floatingLeg = geneticVanillaSwap->getLeg1()->getLeg();
std::vector<Coupon_CONSTPTR> fixedLeg = geneticVanillaSwap->getLeg2()->getLeg();
LMM::Index liborHorizon = liborsInitValue.size();
LMM::Index floatingLegHorizon = floatingLeg.size();
LMM::Index fixedLegHorizon = fixedLeg.size();
//cast from Coupon_CONSTPTR to CappedFlooredCoupon_PTR
Coupon_PTR c = boost::const_pointer_cast<Coupon>(floatingLeg[0]);
CappedFlooredCoupon_PTR cfc = boost::dynamic_pointer_cast<CappedFlooredCoupon>(c);
//get deltaT from the first floatingcoupon
const double deltaT = cfc->getPeriod();
//calculate zero-coupon
std::vector<double> ZC(liborHorizon+1);
ZC[0] = 1.0;
for(size_t i=1; i<ZC.size(); ++i)
{
ZC[i] = ZC[i-1]/(1+deltaT*liborsInitValue[i-1]);
}
// Caculate the floating leg
double floatingIncome = 0.0;
for(size_t i=0; i<floatingLegHorizon;i++)
{
Coupon_CONSTPTR coupon = floatingLeg[i];
LMM::Index paymentIndex = coupon->getPaymentIndex();
Coupon_PTR coupon_nonConst = boost::const_pointer_cast<Coupon>(coupon);
CappedFlooredCoupon_PTR cappedFlooredCoupon = boost::dynamic_pointer_cast<CappedFlooredCoupon>(coupon_nonConst);
if(!cappedFlooredCoupon)
throw("fail to cast coupon to CappedFlooredCoupon");
double tauxActualisation = ZC[paymentIndex];
floatingIncome += tauxActualisation*
cappedFlooredCoupon->getNominal()*
cappedFlooredCoupon->getPeriod()*
std::max( cappedFlooredCoupon->getFloorStrike(),
std::min( cappedFlooredCoupon->getCapStrike(),
cappedFlooredCoupon->getMultiFactor()*liborsInitValue[paymentIndex-1]
+cappedFlooredCoupon->getAddFactor()));
}
// Caculate the fixed leg
double fixedIncome=0.0;
for(size_t i=0; i<fixedLegHorizon;i++)
{
Coupon_CONSTPTR coupon = fixedLeg[i];
// cast to CappedFlooredCoupon_PTR
Coupon_PTR coupon_nonConst = boost::const_pointer_cast<Coupon>(coupon);
CappedFlooredCoupon_PTR cappedFlooredCoupon = boost::dynamic_pointer_cast<CappedFlooredCoupon>(coupon_nonConst);
LMM::Index paymentIndex = cappedFlooredCoupon->getPaymentIndex();
double tauxActualisation = ZC[paymentIndex];
fixedIncome += tauxActualisation
*cappedFlooredCoupon->getNominal()
*cappedFlooredCoupon->getPeriod()*
std::max( cappedFlooredCoupon->getFloorStrike(),
std::min( cappedFlooredCoupon->getCapStrike(),
cappedFlooredCoupon->getMultiFactor()
*liborsInitValue[paymentIndex-1]
+cappedFlooredCoupon->getAddFactor()));
}
return floatingIncome-fixedIncome;
}