summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2018-10-25 16:55:27 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2018-10-25 16:55:27 -0400
commit6806cc9b159ec5f0f9816c1e0f4ae1f0792ddf16 (patch)
treefc4a3bbbd2cee3400a15c903e5b74a87d67f1be4
parentfc53c3e32b2f9d4f83797c6e75545b1f2aee2f67 (diff)
downloadpyisda-6806cc9b159ec5f0f9816c1e0f4ae1f0792ddf16.tar.gz
add defaulted field to SpreadCurve
-rw-r--r--pyisda/credit_index.pxd1
-rw-r--r--pyisda/credit_index.pyx11
-rw-r--r--pyisda/curve.pxd1
-rw-r--r--pyisda/curve.pyx27
4 files changed, 34 insertions, 6 deletions
diff --git a/pyisda/credit_index.pxd b/pyisda/credit_index.pxd
index aa77883..eb855a3 100644
--- a/pyisda/credit_index.pxd
+++ b/pyisda/credit_index.pxd
@@ -11,6 +11,7 @@ cdef class CurveList:
cdef vector[shared_ptr[TCurve]] _curves
cdef map[string, size_t] tickers
cdef vector[shared_ptr[double]] recovery_rates
+ cdef vector[TDate] defaulted
cdef class CreditIndex(CurveList):
cdef TDate start_date
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index 5d8ee65..3a408dd 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -77,6 +77,7 @@ cdef class CurveList:
self._curves.push_back(sc._thisptr)
self.recovery_rates.push_back(sc.recovery_rates)
self._weights.push_back(1.)
+ self.defaulted.push_back(sc.defaulted)
i += 1
else:
self._weights[deref(it).second] += 1
@@ -107,6 +108,7 @@ cdef class CurveList:
sc._thisptr = self._curves[deref(got).second]
sc.recovery_rates = self.recovery_rates[deref(got).second]
sc.ticker = ticker_cpp
+ sc.defaulted = self.defaulted[deref(got).second]
return sc
def items(self):
@@ -119,6 +121,7 @@ cdef class CurveList:
sc._thisptr = self._curves[p.second]
sc.ticker = p.first
sc.recovery_rates = self.recovery_rates[p.second]
+ sc.defaulted = self.defaulted[p.second]
yield (sc.ticker, self._weights[p.second], sc)
@property
@@ -162,6 +165,7 @@ cdef class CurveList:
sc._thisptr = self._curves[p.second]
sc.ticker = p.first
sc.recovery_rates = self.recovery_rates[p.second]
+ sc.defaulted = self.defaulted[p.second]
r.append(sc)
return r
@@ -267,7 +271,8 @@ cdef class CreditIndex(CurveList):
cdef:
TCurve* curve = self._curves[0].get()
size_t size = TCurve_size(curve.fNumItems)
- size_t buf_size = size + curve.fNumItems * sizeof(double) + 8
+ size_t size_recovery = curve.fNumItems * sizeof(double)
+ size_t buf_size = size + size_recovery + 8 + sizeof(TDate)
unsigned char* buf = <unsigned char*>malloc(buf_size)
unsigned char* cursor
unsigned char* start = buf + size
@@ -286,7 +291,9 @@ cdef class CreditIndex(CurveList):
else:
p.first.copy(<char*>cursor, 8, 0)
cursor += 8
- memcpy(cursor, self.recovery_rates[p.second].get(), curve.fNumItems * sizeof(double))
+ memcpy(cursor, self.recovery_rates[p.second].get(), size_recovery)
+ cursor += size_recovery
+ memcpy(cursor, &self.defaulted[p.second], sizeof(TDate))
h ^= Hash64(<char*>buf, buf_size)
free(buf)
diff --git a/pyisda/curve.pxd b/pyisda/curve.pxd
index 16eab8a..12ed440 100644
--- a/pyisda/curve.pxd
+++ b/pyisda/curve.pxd
@@ -218,6 +218,7 @@ cdef class YieldCurve(Curve):
cdef class SpreadCurve(Curve):
cdef string ticker
cdef shared_ptr[double] recovery_rates
+ cdef TDate defaulted
cdef fArray_to_list(TRatePt* fArray, int fNumItems)
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 4dddb14..7235ce7 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -585,13 +585,16 @@ cdef class SpreadCurve(Curve):
cdef:
TCurve* curve = self._thisptr.get()
size_t size = TCurve_size(curve.fNumItems)
+ size_t size_recovery = curve.fNumItems * sizeof(double)
size_t buf_size = size + sizeof(size_t) + self.ticker.length() + \
- curve.fNumItems * sizeof(double)
+ size_recovery + sizeof(TDate)
unsigned char* buf = <unsigned char*>malloc(buf_size)
unsigned char* cursor = buf + size
serialize(curve, buf)
cursor = serialize_string(self.ticker, cursor)
- memcpy(cursor, self.recovery_rates.get(), sizeof(double) * curve.fNumItems)
+ memcpy(cursor, self.recovery_rates.get(), size_recovery)
+ cursor += size_recovery
+ memcpy(cursor, &self.defaulted, sizeof(TDate))
return <bytes>buf[:buf_size]
def __setstate__(self, bytes state):
@@ -610,6 +613,8 @@ cdef class SpreadCurve(Curve):
self.recovery_rates = shared_ptr[double](<double*>malloc(size),
double_free)
memcpy(self.recovery_rates.get(), cursor, size)
+ cursor += size
+ memcpy(&self.defaulted, cursor, sizeof(TDate))
def __deepcopy__(self, dict memo):
cdef SpreadCurve sc = SpreadCurve.__new__(SpreadCurve)
@@ -618,9 +623,18 @@ cdef class SpreadCurve(Curve):
sc.ticker = self.ticker
sc.recovery_rates= shared_ptr[double](<double*>malloc(size), double_free)
memcpy(sc.recovery_rates.get(), self.recovery_rates.get(), size)
+ memcpy(&sc.defaulted, &self.defaulted, sizeof(TDate))
memo[id(self)] = sc
return sc
+ @property
+ def defaulted(self):
+ return self.defaulted == -1
+
+ @property
+ def default_date(self):
+ return TDate_to_pydate(self.defaulted)
+
@classmethod
def from_bytes(cls, bytes state):
cdef:
@@ -646,6 +660,8 @@ cdef class SpreadCurve(Curve):
instance.recovery_rates = shared_ptr[double](
<double*>malloc(size), double_free)
memcpy(instance.recovery_rates.get(), cursor, size)
+ cursor += size
+ memcpy(&instance.defaulted, cursor, sizeof(TDate))
return instance
def __hash__(self):
@@ -653,13 +669,16 @@ cdef class SpreadCurve(Curve):
cdef:
TCurve* curve = self._thisptr.get()
size_t size = TCurve_size(curve.fNumItems)
+ size_t size_recovery = curve.fNumItems * sizeof(double)
size_t buf_size = size + sizeof(size_t) + self.ticker.length() + \
- curve.fNumItems * sizeof(double)
+ size_recovery + sizeof(TDate)
unsigned char* buf = <unsigned char*>malloc(buf_size)
unsigned char* cursor = buf + size
serialize(curve, buf)
cursor = serialize_string(self.ticker, cursor)
- memcpy(cursor, self.recovery_rates.get(), curve.fNumItems * sizeof(double))
+ memcpy(cursor, self.recovery_rates.get(), size_recovery)
+ cursor += size_recovery
+ memcpy(cursor, &self.defaulted, sizeof(TDate))
cdef uint64_t r = Hash64(<char*>buf, buf_size)
free(buf)
return r