diff options
| author | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-08-04 13:21:42 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-08-04 13:21:42 -0400 |
| commit | 7fefaab49e5985e5c3c851f5266653cc1b560629 (patch) | |
| tree | af413056ebe76ef438e3e3db6363493fe7cacd3a | |
| parent | 423df3c50780052c7c34f34698c0829a2776a6c6 (diff) | |
| download | pyisda-7fefaab49e5985e5c3c851f5266653cc1b560629.tar.gz | |
add vectorized version of snac_pv
| -rw-r--r-- | pyisda/flat_hazard.pyx | 69 |
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 |
