diff options
| author | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-07-11 10:41:44 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@serenitascapital.com> | 2016-07-11 16:21:24 -0400 |
| commit | 0059feac1aa6d44be9e0f9fdcb7fdf03779eddbc (patch) | |
| tree | 1574d7263af3271f8cb0b31ac0ab690ea7ad6eb3 /curve.pyx | |
| parent | 36f6bec51667a7df7606eba7d53879dca54a1575 (diff) | |
| download | pyisda-0059feac1aa6d44be9e0f9fdcb7fdf03779eddbc.tar.gz | |
add a consctructor for ZeroCurve and rename it to YieldCurve
Diffstat (limited to 'curve.pyx')
| -rw-r--r-- | curve.pyx | 25 |
1 files changed, 21 insertions, 4 deletions
@@ -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, |
