summaryrefslogtreecommitdiffstats
path: root/curve.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'curve.pyx')
-rw-r--r--curve.pyx25
1 files changed, 21 insertions, 4 deletions
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 = <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,