diff options
| -rw-r--r-- | cdsone.pyx | 10 | ||||
| -rw-r--r-- | curve.pxd | 7 | ||||
| -rw-r--r-- | curve.pyx | 25 | ||||
| -rw-r--r-- | legs.pyx | 10 |
4 files changed, 37 insertions, 15 deletions
@@ -1,13 +1,13 @@ from cdsone cimport (JpmcdsCdsoneUpfrontCharge, JpmcdsCdsoneSpread, JpmcdsStringToStubMethod) -from curve cimport ZeroCurve +from curve cimport YieldCurve from date cimport JpmcdsStringToDateInterval, pydate_to_TDate, dcc cdef int SUCCESS = 0 def upfront_charge(date, value_date, benchmark_start_date, stepin_date, start_date, end_date, double coupon_rate, - ZeroCurve zc, + YieldCurve yc, double spread, double recovery_rate, TBoolean pay_accrued_at_start = True, @@ -32,7 +32,7 @@ def upfront_charge(date, value_date, benchmark_start_date, stepin_date, if JpmcdsCdsoneUpfrontCharge(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, - dcc("ACT/360"), b'F', b"None", zc._thisptr, spread, recovery_rate, + dcc("ACT/360"), b'F', b"None", yc._thisptr, spread, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: @@ -40,7 +40,7 @@ def upfront_charge(date, value_date, benchmark_start_date, stepin_date, def spread_from_upfront(date, value_date, benchmark_start_date, stepin_date, start_date, end_date, double coupon_rate, - ZeroCurve zc, + YieldCurve yc, double upfront, double recovery_rate, TBoolean pay_accrued_at_start = True, @@ -64,7 +64,7 @@ def spread_from_upfront(date, value_date, benchmark_start_date, stepin_date, if JpmcdsCdsoneSpread(today, value_date_c, benchmark_start_date_c, stepin_date_c, start_date_c, end_date_c, coupon_rate, pay_accrued_on_default, &ivl, &stub, - dcc("ACT/360"), b'F', b"None", zc._thisptr, upfront, recovery_rate, + dcc("ACT/360"), b'F', b"None", yc._thisptr, upfront, recovery_rate, pay_accrued_at_start, &result) == SUCCESS: return result else: @@ -87,6 +87,11 @@ cdef extern from "isda/tcurve.h": cdef extern from "isda/cxzerocurve.h": double JpmcdsZeroPrice(TCurve* curve, TDate date) +cdef extern from "isda/cfinanci.h": + int JpmcdsDiscountToRateYearFrac(double discount, # (I) Discount factor + double yearFraction, # (I) See JpmcdsDayCountFraction + double basis, # (I) Basis for the rate + double *rate); cdef enum Basis: CONTINUOUS = 5000 DISCOUNT_RATE = 512 @@ -97,7 +102,7 @@ cdef enum Basis: cdef class Curve: cdef TCurve* _thisptr -cdef class ZeroCurve(Curve): +cdef class YieldCurve(Curve): cdef TDate* _dates cdef size_t _ninstr @@ -33,13 +33,13 @@ cdef fArray_to_list(TRatePt* fArray, int fNumItems): l.append((TDate_to_pydate(fArray[i].fDate), fArray[i].fRate)) return l -cdef class ZeroCurve(Curve): +cdef class YieldCurve(Curve): def __init__(self, date, str types, list periods, double[:] rates, str mm_dcc, str fixed_swap_period, str float_swap_period, str fixed_swap_dcc, str float_swap_dcc, BadDay bad_day_conv): - """ Initialize a zero coupon curve + """ Initialize a yield curve from a list of zero coupon rates instruments need to be sorted by tenor """ @@ -90,6 +90,23 @@ cdef class ZeroCurve(Curve): if self._dates is not NULL: free(self._dates) + @classmethod + def from_discount_factors(cls, base_date, list dates, double[:] dfs, str day_count_conv): + """ build a yield curve from a list of discount factors """ + cdef TDate base_date_c = pydate_to_TDate(base_date) + cdef YieldCurve yc = cls.__new__(cls) + yc._dates = <TDate*>malloc(sizeof(TDate) * len(dates)) + cdef size_t i + cdef double* rates = <double*>malloc(sizeof(double) * len(dfs)) + for i, d in enumerate(dates): + yc._dates[i] = pydate_to_TDate(d) + JpmcdsDiscountToRateYearFrac(dfs[i], <double>(yc._dates[i]-base_date_c)/365., + <double>1, &rates[i]); + + yc._thisptr = JpmcdsMakeTCurve(base_date_c, yc._dates, rates, len(dfs), + <double>1, dcc(day_count_conv)) + return yc + def discount_factor(self, date): if self._thisptr is NULL: raise ValueError('curve is empty') @@ -102,7 +119,7 @@ cdef class ZeroCurve(Curve): cdef class SpreadCurve(Curve): - def __init__(self, today, ZeroCurve zc, start_date, step_in_date, + def __init__(self, today, YieldCurve yc, start_date, step_in_date, cash_settle_date, list end_dates, double[:] coupon_rates, double recovery_rate, int pay_accrued_on_default): @@ -122,7 +139,7 @@ cdef class SpreadCurve(Curve): raise ValueError("can't convert stub") self._thisptr = JpmcdsCleanSpreadCurve(today_c, - zc._thisptr, + yc._thisptr, start_date_c, step_in_date_c, cash_settle_date_c, @@ -3,7 +3,7 @@ from legs cimport (JpmcdsCdsContingentLegMake, from libc.stdlib cimport free from date cimport pydate_to_TDate, TDate_to_pydate, dcc from cdsone cimport JpmcdsStringToStubMethod, TStubMethod -from curve cimport ZeroCurve, SpreadCurve +from curve cimport YieldCurve, SpreadCurve cdef class ContingentLeg: @@ -21,14 +21,14 @@ cdef class ContingentLeg: if self._thisptr is not NULL: free(self._thisptr) - def pv(self, today, step_in_date, value_date, ZeroCurve zc, SpreadCurve sc, + def pv(self, today, step_in_date, value_date, YieldCurve yc, SpreadCurve sc, double recovery_rate): cdef TDate today_c = pydate_to_TDate(today) cdef TDate step_in_date_c = pydate_to_TDate(step_in_date) cdef TDate value_date_c = pydate_to_TDate(value_date) cdef double pv if JpmcdsContingentLegPV(self._thisptr, today_c, value_date_c, step_in_date_c, - zc._thisptr, sc._thisptr, recovery_rate, &pv) == 0: + yc._thisptr, sc._thisptr, recovery_rate, &pv) == 0: return pv else: raise ValueError @@ -81,14 +81,14 @@ cdef class FeeLeg: result.append((TDate_to_pydate(cf.fDate), cf.fAmount)) return result - def pv(self, today, step_in_date, value_date, ZeroCurve zc, SpreadCurve sc, + def pv(self, today, step_in_date, value_date, YieldCurve yc, SpreadCurve sc, TBoolean pay_accrued_at_start): cdef TDate today_c = pydate_to_TDate(today) cdef TDate step_in_date_c = pydate_to_TDate(step_in_date) cdef TDate value_date_c = pydate_to_TDate(value_date) cdef double pv if JpmcdsFeeLegPV(self._thisptr, today_c, step_in_date_c, value_date_c, - zc._thisptr, sc._thisptr, pay_accrued_at_start, &pv) == 0: + yc._thisptr, sc._thisptr, pay_accrued_at_start, &pv) == 0: return pv else: raise ValueError |
