From 0059feac1aa6d44be9e0f9fdcb7fdf03779eddbc Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Mon, 11 Jul 2016 10:41:44 -0400 Subject: add a consctructor for ZeroCurve and rename it to YieldCurve --- curve.pyx | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'curve.pyx') diff --git a/curve.pyx b/curve.pyx index 824c8ce..b8b710d 100644 --- a/curve.pyx +++ b/curve.pyx @@ -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 = malloc(sizeof(TDate) * len(dates)) + cdef size_t i + cdef double* rates = malloc(sizeof(double) * len(dfs)) + for i, d in enumerate(dates): + yc._dates[i] = pydate_to_TDate(d) + JpmcdsDiscountToRateYearFrac(dfs[i], (yc._dates[i]-base_date_c)/365., + 1, &rates[i]); + + yc._thisptr = JpmcdsMakeTCurve(base_date_c, yc._dates, rates, len(dfs), + 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, -- cgit v1.2.3-70-g09d2