diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2018-10-25 16:55:27 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2018-10-25 16:55:27 -0400 |
| commit | 6806cc9b159ec5f0f9816c1e0f4ae1f0792ddf16 (patch) | |
| tree | fc4a3bbbd2cee3400a15c903e5b74a87d67f1be4 | |
| parent | fc53c3e32b2f9d4f83797c6e75545b1f2aee2f67 (diff) | |
| download | pyisda-6806cc9b159ec5f0f9816c1e0f4ae1f0792ddf16.tar.gz | |
add defaulted field to SpreadCurve
| -rw-r--r-- | pyisda/credit_index.pxd | 1 | ||||
| -rw-r--r-- | pyisda/credit_index.pyx | 11 | ||||
| -rw-r--r-- | pyisda/curve.pxd | 1 | ||||
| -rw-r--r-- | pyisda/curve.pyx | 27 |
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 |
