Skip to content

Commit 4b373ff

Browse files
committed
make Inflation and Vol term structures inherit from TermStructure
1 parent f3e6275 commit 4b373ff

File tree

8 files changed

+63
-99
lines changed

8 files changed

+63
-99
lines changed

quantlib/termstructure.pyx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ from quantlib.ext cimport static_pointer_cast
22
from quantlib.time.date cimport Date, date_from_qldate
33
from quantlib.time._date cimport Date as QlDate
44
from quantlib.time.daycounter cimport DayCounter
5+
from quantlib.time.calendar cimport Calendar
56
cimport quantlib.time._daycounter as _dc
67

78
cdef class TermStructure(Observable):
@@ -18,20 +19,24 @@ cdef class TermStructure(Observable):
1819
return static_pointer_cast[QlObservable](self._thisptr)
1920

2021
def time_from_reference(self, Date dt):
22+
"""date/time conversion"""
2123
return self.as_ptr().timeFromReference(dt._thisptr)
2224

2325
@property
2426
def reference_date(self):
27+
""" the date at which discount = 1.0 and/or variance = 0.0"""
2528
cdef QlDate ref_date = self.as_ptr().referenceDate()
2629
return date_from_qldate(ref_date)
2730

2831
@property
2932
def max_date(self):
33+
"""the latest date for which the curve can return values"""
3034
cdef QlDate max_date = self.as_ptr().maxDate()
3135
return date_from_qldate(max_date)
3236

3337
@property
3438
def max_time(self):
39+
"""the latest time for which the curve can return values"""
3540
return self.as_ptr().maxTime()
3641

3742
@property
@@ -42,4 +47,11 @@ cdef class TermStructure(Observable):
4247

4348
@property
4449
def settlement_days(self):
50+
""" number of settlement days used for reference date calculation"""
4551
return self.as_ptr().settlementDays()
52+
53+
@property
54+
def calendar(self):
55+
cdef Calendar instance = Calendar.__new__(Calendar)
56+
instance._thisptr = self.as_ptr().calendar()
57+
return instance

quantlib/termstructures/_inflation_term_structure.pxd

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,36 @@ include '../types.pxi'
1212
from libcpp cimport bool
1313

1414
from quantlib.ext cimport shared_ptr
15-
from quantlib.handle cimport Handle
1615
from quantlib.time._date cimport Date
1716
from quantlib.time._calendar cimport Calendar
1817
from quantlib.time._daycounter cimport DayCounter
1918
from quantlib.time._period cimport Period, Frequency
20-
from quantlib.termstructures._yield_term_structure cimport YieldTermStructure
2119
from quantlib.termstructures.inflation._seasonality cimport Seasonality
22-
20+
from .._termstructure cimport TermStructure
2321

2422
cdef extern from 'ql/termstructures/inflationtermstructure.hpp' namespace 'QuantLib' nogil:
2523

26-
cdef cppclass InflationTermStructure:
27-
28-
InflationTermStructure() except +
29-
Date& referenceDate()
30-
Date& maxDate()
31-
Date& baseDate()
32-
Rate baseRate()
33-
24+
cdef cppclass InflationTermStructure(TermStructure):
25+
Date baseDate()
26+
Real baseRate()
3427

3528
cdef cppclass ZeroInflationTermStructure(InflationTermStructure):
36-
37-
ZeroInflationTermStructure() except +
38-
ZeroInflationTermStructure(DayCounter& dayCounter,
39-
Rate baseZeroRate,
40-
Period& lag,
29+
ZeroInflationTermStructure(Date baseDate,
4130
Frequency frequency,
42-
const Handle[YieldTermStructure]& yTS,
31+
DayCounter& dayCounter,
4332
const shared_ptr[Seasonality]& seasonality # = shared_ptr<Seasonality>()
4433
) except +
4534
ZeroInflationTermStructure(const Date& referenceDate,
46-
const Calendar& calendar,
47-
const DayCounter& dayCounter,
48-
Rate baseZeroRate,
49-
const Period& lag,
35+
Date baseDate,
5036
Frequency frequency,
51-
const Handle[YieldTermStructure]& yTS,
37+
const DayCounter& dayCounter,
5238
const shared_ptr[Seasonality] &seasonality # = shared_ptr<Seasonality>())
5339
) except +
5440
ZeroInflationTermStructure(Natural settlementDays,
5541
const Calendar& calendar,
56-
const DayCounter& dayCounter,
57-
Rate baseZeroRate,
58-
const Period& lag,
42+
Date baseDate,
5943
Frequency frequency,
60-
const Handle[YieldTermStructure]& yTS,
44+
const DayCounter& dayCounter,
6145
const shared_ptr[Seasonality] &seasonality # = boost::shared_ptr<Seasonality>()
6246
) except +
6347

@@ -71,15 +55,23 @@ cdef extern from 'ql/termstructures/inflationtermstructure.hpp' namespace 'Quant
7155

7256

7357
cdef cppclass YoYInflationTermStructure(InflationTermStructure):
74-
75-
YoYInflationTermStructure() except +
76-
7758
YoYInflationTermStructure(DayCounter& dayCounter,
78-
Rate baseZeroRate,
79-
Period& lag,
59+
Rate baseYoYRate,
60+
Frequency frequency,
61+
const DayCounter& dayCounter,
62+
const shared_ptr[Seasonality]& seasonality) except +
63+
YoYInflationTermStructure(Date& referenceDate,
64+
Date baseDate,
65+
Rate baseYoYRate,
66+
Frequency frequency,
67+
const DayCounter& dayCounter,
68+
const shared_ptr[Seasonality]& seasonality) except +
69+
YoYInflationTermStructure(Natural settlmentDays,
70+
const Calendar& calendar,
71+
Date baseDate,
72+
Rate baseYoYRate,
8073
Frequency frequency,
81-
bool indexIsInterpolated,
82-
const Handle[YieldTermStructure]& yTS,
74+
const DayCounter& dayCounter,
8375
const shared_ptr[Seasonality]& seasonality) except +
8476

8577
Rate yoyRate(Date& d,

quantlib/termstructures/_vol_term_structure.pxd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ from quantlib.time._calendar cimport Calendar
55
from quantlib.time._date cimport Date
66
from quantlib.time._period cimport Period
77
from quantlib.time.businessdayconvention cimport BusinessDayConvention
8+
from .._termstructure cimport TermStructure
89

910
cdef extern from 'ql/termstructures/voltermstructure.hpp' namespace 'QuantLib' nogil:
10-
cdef cppclass VolatilityTermStructure:
11+
cdef cppclass VolatilityTermStructure(TermStructure):
1112
VolatilityTermStructure(BusinessDayConvention bdc,
1213
const DayCounter& dc) # = DayCounter()
1314
#initialize with a fixed reference date

quantlib/termstructures/inflation/seasonality.pyx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ cdef class Seasonality:
3737
return self._thisptr.get().correctZeroRate(
3838
d._thisptr,
3939
r,
40-
deref(iTS._thisptr))
40+
deref(<_if.InflationTermStructure*>iTS._thisptr.get())
41+
)
4142

4243
def correctYoYRate(self,
4344
Date d,
@@ -47,13 +48,14 @@ cdef class Seasonality:
4748
return self._thisptr.get().correctYoYRate(
4849
d._thisptr,
4950
r,
50-
deref(iTS._thisptr))
51+
deref(<_if.InflationTermStructure*>iTS._thisptr.get()))
5152

5253
def isConsistent(self,
5354
InflationTermStructure iTS):
5455

5556
return self._thisptr.get().isConsistent(
56-
deref(iTS._thisptr))
57+
deref(<_if.InflationTermStructure*>iTS._thisptr.get())
58+
)
5759

5860

5961
cdef class MultiplicativePriceSeasonality(Seasonality):
@@ -94,4 +96,5 @@ cdef class MultiplicativePriceSeasonality(Seasonality):
9496
def isConsistent(self, InflationTermStructure iTS):
9597

9698
return self._thisptr.get().isConsistent(
97-
deref(iTS._thisptr))
99+
deref(<_if.InflationTermStructure*>iTS._thisptr.get())
100+
)

quantlib/termstructures/inflation_term_structure.pxd

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
cimport quantlib.termstructures._inflation_term_structure as _its
2-
from quantlib.ext cimport shared_ptr
1+
from ..termstructure cimport TermStructure
32

4-
cdef class InflationTermStructure:
5-
cdef shared_ptr[_its.InflationTermStructure] _thisptr
3+
cdef class InflationTermStructure(TermStructure):
4+
pass
65

76
cdef class ZeroInflationTermStructure(InflationTermStructure):
87
pass

quantlib/termstructures/inflation_term_structure.pyx

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,45 +14,23 @@ from quantlib.time.date cimport Date, Period, date_from_qldate, period_from_qlpe
1414

1515
from libcpp.vector cimport vector
1616
from cython.operator cimport dereference as deref
17-
from quantlib.ext cimport static_pointer_cast
1817

19-
cimport quantlib.time._daycounter as _dc
20-
from quantlib.time.daycounter cimport DayCounter
18+
from quantlib.time._period cimport Days
2119

22-
from quantlib.time._period cimport Frequency, Days
23-
from quantlib.time.calendar cimport Calendar
24-
25-
from quantlib.termstructures.yield_term_structure cimport YieldTermStructure
26-
27-
cimport quantlib.termstructures.yields._flat_forward as _ff
28-
cimport quantlib._interest_rate as _ir
2920
cimport quantlib.termstructures._inflation_term_structure as _if
30-
cimport quantlib.termstructures.inflation._seasonality as _se
31-
32-
from quantlib.termstructures.inflation.seasonality cimport Seasonality
3321

34-
cdef class InflationTermStructure:
22+
cdef class InflationTermStructure(TermStructure):
3523
"""Abstract Base Class.
3624
"""
3725

38-
property max_date:
39-
def __get__(self):
40-
cdef _date.Date max_date = self._thisptr.get().maxDate()
41-
return date_from_qldate(max_date)
42-
43-
@property
44-
def reference_date(self):
45-
cdef _date.Date reference_date = self._thisptr.get().referenceDate()
46-
return date_from_qldate(reference_date)
47-
4826
@property
4927
def base_date(self):
50-
cdef _date.Date base_date = self._thisptr.get().baseDate()
28+
cdef _date.Date base_date = (<_if.InflationTermStructure*>self._thisptr.get()).baseDate()
5129
return date_from_qldate(base_date)
5230

5331
@property
5432
def base_rate(self):
55-
return self._thisptr.get().baseRate()
33+
return (<_if.InflationTermStructure*>self._thisptr.get()).baseRate()
5634

5735
cdef class ZeroInflationTermStructure(InflationTermStructure):
5836

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from libcpp cimport bool as cbool
2-
from quantlib.ext cimport shared_ptr
1+
from ..termstructure cimport TermStructure
32
from . cimport _vol_term_structure as _vts
43

5-
cdef class VolatilityTermStructure:
6-
cdef shared_ptr[_vts.VolatilityTermStructure] _thisptr
7-
cdef _vts.VolatilityTermStructure* as_ptr(self) nogil
4+
cdef class VolatilityTermStructure(TermStructure):
5+
cdef _vts.VolatilityTermStructure* as_vol_ts(self) noexcept nogil
Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,21 @@
11
from libcpp cimport bool
22
from cython.operator cimport dereference as deref
33
from quantlib.time.date cimport date_from_qldate
4-
from quantlib.time.calendar cimport Calendar
5-
from quantlib.time.date cimport Date, Period
6-
cimport quantlib.time._calendar as _calendar
4+
from quantlib.time.date cimport Period
75

8-
cdef class VolatilityTermStructure:
6+
cdef class VolatilityTermStructure(TermStructure):
97

10-
cdef inline _vts.VolatilityTermStructure* as_ptr(self) nogil:
11-
return self._thisptr.get()
12-
13-
def time_from_reference(self, Date date not None):
14-
return self.as_ptr().timeFromReference(date._thisptr)
15-
16-
@property
17-
def reference_date(self):
18-
return date_from_qldate(self.as_ptr().referenceDate())
19-
20-
@property
21-
def calendar(self):
22-
cdef Calendar instance = Calendar.__new__(Calendar)
23-
instance._thisptr = self.as_ptr().calendar()
24-
return instance
25-
26-
@property
27-
def settlement_days(self):
28-
return self.as_ptr().settlementDays()
8+
cdef inline _vts.VolatilityTermStructure* as_vol_ts(self) noexcept nogil:
9+
return <_vts.VolatilityTermStructure*>self._thisptr.get()
2910

3011
def option_date_from_tenor(self, Period period not None):
3112
return date_from_qldate(
32-
self.as_ptr().optionDateFromTenor(deref(period._thisptr)))
13+
self.as_vol_ts().optionDateFromTenor(deref(period._thisptr)))
3314

3415
@property
3516
def extrapolation(self):
36-
return self.as_ptr().allowsExtrapolation()
17+
return self.as_vol_ts().allowsExtrapolation()
3718

3819
@extrapolation.setter
3920
def extrapolation(self, bool b):
40-
self.as_ptr().enableExtrapolation(b)
21+
self.as_vol_ts().enableExtrapolation(b)

0 commit comments

Comments
 (0)