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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
#include <cstring>
#include "curve.hpp"
#include "isda/cxzerocurve.h"
#include <cmath>
namespace pyisda {
size_t Curve::size() {
return sizeof(int) + sizeof(TDate) + sizeof(double) +
sizeof(long) + sizeof(TRatePt) * ptr->fNumItems;
}
unsigned char* Curve::serialize(unsigned char* const buf) {
unsigned char* cur = buf;
int num_items = ptr->fNumItems;
std::memcpy(cur, &num_items, sizeof(int));
cur += sizeof(int);
memcpy(cur, ptr->fArray, sizeof(TRatePt) * num_items);
cur += sizeof(TRatePt) * num_items;
memcpy(cur, &(ptr->fBaseDate), sizeof(TDate));
cur += sizeof(TDate);
memcpy(cur, &(ptr->fBasis), sizeof(double));
cur += sizeof(double);
memcpy(cur, &(ptr->fDayCountConv), sizeof(long));
return cur + sizeof(long);
}
double Curve::zeroPrice(const TDate date) {
return JpmcdsZeroPrice(ptr, date);
}
double Curve::zeroPrice(const TDate date1, const TDate date2) {
return JpmcdsForwardZeroPrice(ptr, date1, date2);
}
double Curve::survivalProb(const TDate start_date, const TDate maturity_date, double eps) {
double lambda1, lambda2;
double t1, t2;
if(start_date == ptr->fBaseDate) {
lambda2 = JpmcdsZeroRate(ptr, maturity_date) * (1 + eps);
t2 = (maturity_date - ptr->fBaseDate) / 365.;
return std::exp(-lambda2 * t2);
} else {
lambda1 = JpmcdsZeroRate(ptr, start_date);
lambda2 = JpmcdsZeroRate(ptr, maturity_date);
t1 = start_date - ptr->fBaseDate;
t2 = maturity_date - ptr->fBaseDate;
return std::exp((lambda1 * t1 - lambda2 * t2) * (1 + eps) / 365.);
}
}
double Curve::survivalProb(const TDate start_date, const TDate maturity_date) {
double lambda1, lambda2;
double t1, t2;
if(start_date == ptr->fBaseDate) {
lambda2 = JpmcdsZeroRate(ptr, maturity_date);
t2 = (maturity_date - ptr->fBaseDate) / 365.;
return std::exp(-lambda2 * t2);
} else {
lambda1 = JpmcdsZeroRate(ptr, start_date);
lambda2 = JpmcdsZeroRate(ptr, maturity_date);
t1 = start_date - ptr->fBaseDate;
t2 = maturity_date - ptr->fBaseDate;
return std::exp((lambda1 * t1 - lambda2 * t2) / 365.);
}
}
void Curve::tweak(TCurve* const ptr, double epsilon) {
double h1, h2, t1, t2, c;
h1 = t1 = c = 0;
TRatePt cur;
for(int i = 0; i < ptr->fNumItems; i++) {
cur = ptr->fArray[i];
h2 = cur.fRate;
t2 = (cur.fDate - ptr->fBaseDate) / 365.;
c += (h2 * t2 - h1 * t1 ) * (1 + epsilon);
cur.fRate = c / t2;
h1 = h2;
t1 = t2;
}
}
void Curve::tweak(TCurve* const ptr, double epsilon, unsigned long mask) {
double h1, h2, t1, t2, c;
h1 = t1 = c = 0;
TRatePt cur;
for(int i = 0;i < ptr->fNumItems; i++) {
cur = ptr->fArray[i];
h2 = cur.fRate;
t2 = (cur.fDate - ptr->fBaseDate) / 365.;
c += (h2 * t2 - h1 * t1 ) * (1 + epsilon * (( mask >> i) & 1));
cur.fRate = c / t2;
h1 = h2;
t1 = t2;
}
}
void Curve::tweak(double epsilon) {
Curve::tweak(ptr, epsilon);
}
void Curve::tweak(double epsilon, unsigned long mask) {
Curve::tweak(ptr, epsilon, mask);
}
size_t YieldCurve::size() {
return Curve::size() + sizeof(TDate) * dates.size();
}
unsigned char* YieldCurve::serialize(unsigned char* const buf) {
unsigned char* cur = buf;
cur = Curve::serialize(buf);
size_t size = dates.size();
memcpy(cur, &size, sizeof(size_t));
cur += sizeof(size_t);
memcpy(cur, dates.data(), sizeof(TDate) * size);
return cur + sizeof(TDate) * size;
}
size_t SpreadCurve::size() {
return Curve::size() + recovery_rates.size() * sizeof(double) + 8;
}
unsigned char* SpreadCurve::serialize(unsigned char* const buf) {
unsigned char* cur = buf;
cur = Curve::serialize(buf);
memcpy(cur, recovery_rates.data(), recovery_rates.size() * sizeof(double));
cur += recovery_rates.size() * sizeof(double);
if (ticker.length() < 8) {
ticker.copy((char*)cur, ticker.length(), 0);
memset(cur + ticker.length(), 0, 8 - ticker.length());
} else {
ticker.copy((char*)cur, 8, 0);
}
return cur + 8;
}
}
|