summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cdsone.pyx10
-rw-r--r--curve.pxd7
-rw-r--r--curve.pyx25
-rw-r--r--legs.pyx10
4 files changed, 37 insertions, 15 deletions
diff --git a/cdsone.pyx b/cdsone.pyx
index d6bb4ec..13c517e 100644
--- a/cdsone.pyx
+++ b/cdsone.pyx
@@ -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:
diff --git a/curve.pxd b/curve.pxd
index 831baf7..50de68f 100644
--- a/curve.pxd
+++ b/curve.pxd
@@ -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
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,
diff --git a/legs.pyx b/legs.pyx
index 0a07a9b..2df83e3 100644
--- a/legs.pyx
+++ b/legs.pyx
@@ -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