summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@serenitascapital.com>2016-08-04 13:21:42 -0400
committerGuillaume Horel <guillaume.horel@serenitascapital.com>2016-08-04 13:21:42 -0400
commit7fefaab49e5985e5c3c851f5266653cc1b560629 (patch)
treeaf413056ebe76ef438e3e3db6363493fe7cacd3a
parent423df3c50780052c7c34f34698c0829a2776a6c6 (diff)
downloadpyisda-7fefaab49e5985e5c3c851f5266653cc1b560629.tar.gz
add vectorized version of snac_pv
-rw-r--r--pyisda/flat_hazard.pyx69
1 files changed, 69 insertions, 0 deletions
diff --git a/pyisda/flat_hazard.pyx b/pyisda/flat_hazard.pyx
new file mode 100644
index 0000000..ecd2c6a
--- /dev/null
+++ b/pyisda/flat_hazard.pyx
@@ -0,0 +1,69 @@
+from date cimport dcc, TDate
+cimport numpy as np
+
+from legs cimport (JpmcdsCdsContingentLegMake, JpmcdsCdsFeeLegMake,
+ TContingentLeg, TFeeLeg, JpmcdsContingentLegPV, JpmcdsFeeLegPV)
+from curve cimport TCurve, YieldCurve, SpreadCurve, JpmcdsCleanSpreadCurve
+from date cimport pydate_to_TDate
+from cdsone cimport JpmcdsStringToStubMethod, TStubMethod
+from cython.parallel cimport parallel, prange
+cimport cython
+
+@cython.boundscheck(False)
+def snac_pv_vec(trade_date, cash_settle_date, exercise_date, YieldCurve yc,
+ start_date, end_date, double[:] spreads, double recovery_rate):
+ """vectorized and parallel version of snac_pv"""
+
+ cdef TDate trade_date_c = pydate_to_TDate(trade_date)
+ cdef TDate step_in_date_c = trade_date_c + 1
+ cdef TDate cash_settle_date_c = pydate_to_TDate(cash_settle_date)
+ cdef TDate start_date_c = pydate_to_TDate(start_date)
+ cdef TDate end_date_c = pydate_to_TDate(end_date)
+ cdef TCurve* sc
+ cdef double[:] coupon_leg_pv = np.empty_like(spreads)
+ cdef double[:] default_leg_pv = np.empty_like(spreads)
+ cdef TStubMethod stub_type
+
+ JpmcdsStringToStubMethod(b"f/s", &stub_type)
+
+ cdef TContingentLeg* default_leg = JpmcdsCdsContingentLegMake(
+ start_date_c,
+ end_date_c,
+ 1, # notional
+ 1) # protect_start = True
+ cdef TFeeLeg* fee_leg = JpmcdsCdsFeeLegMake(start_date_c,
+ end_date_c,
+ 1,
+ NULL,
+ &stub_type,
+ 1., # notional
+ 1., # coupon_rate
+ 3, # JPMCDS_ACT_360
+ <long>'M',
+ b'NONE',
+ 1) # protect_start = True
+ cdef int i
+ with nogil, parallel(num_threads=4):
+ for i in prange(spreads.shape[0]):
+ sc = JpmcdsCleanSpreadCurve(trade_date_c,
+ yc._thisptr,
+ start_date_c,
+ step_in_date_c,
+ cash_settle_date_c,
+ 1, # length of end_dates_c
+ &end_date_c,
+ &spreads[i],
+ NULL,
+ recovery_rate,
+ 1, # pay_accrued_on_default True
+ NULL,
+ 3, # JPMCDS_ACT_360
+ &stub_type,
+ <long>'M',
+ b'NONE')
+ JpmcdsContingentLegPV(default_leg, trade_date_c, cash_settle_date_c,
+ step_in_date_c, yc._thisptr, sc,
+ recovery_rate, &default_leg_pv[i])
+ JpmcdsFeeLegPV(fee_leg, trade_date_c, step_in_date_c, cash_settle_date_c,
+ yc._thisptr, sc, True, &coupon_leg_pv[i])
+ return coupon_leg_pv, default_leg_pv