Skip to content

Commit

Permalink
Merge pull request #91 from rimrockcapital/fwd_spreaded_ts
Browse files Browse the repository at this point in the history
TermStructures - Exposing ForwardSpreadedTermStructure
  • Loading branch information
dpinte committed May 26, 2015
2 parents 9b4eeae + 2605de5 commit 03d391c
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
include '../../types.pxi'


from quantlib.handle cimport shared_ptr, Handle
from quantlib._quote cimport SimpleQuote, Quote
from _flat_forward cimport YieldTermStructure
from quantlib.time._date cimport Date
from quantlib.time._daycounter cimport DayCounter


cdef extern from 'ql/termstructures/yield/forwardspreadedtermstructure.hpp' namespace 'QuantLib':

cdef cppclass ForwardSpreadedTermStructure(YieldTermStructure):

ForwardSpreadedTermStructure(
Handle[YieldTermStructure]& yieldtermstruct,
Handle[Quote]& spread
) except +
36 changes: 36 additions & 0 deletions quantlib/termstructures/yields/forward_spreaded_term_structure.pyx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
include '../../types.pxi'

from cython.operator cimport dereference as deref
from libcpp.vector cimport vector

cimport quantlib.termstructures.yields._forward_spreaded_term_structure as _fsts
cimport quantlib.termstructures.yields._flat_forward as _ff
cimport quantlib._quote as _qt

from quantlib.handle cimport shared_ptr, Handle
from quantlib.termstructures.yields.flat_forward cimport YieldTermStructure
from quantlib.time.daycounter cimport DayCounter
from quantlib.quotes cimport Quote
from quantlib.time.date cimport Date

cdef class ForwardSpreadedTermStructure(YieldTermStructure):
"""
Constructor Inputs:
1. YieldTermStructure
2. Quote
"""
def __init__(self,YieldTermStructure yldtermstruct, Quote spread):

cdef Handle[_qt.Quote] q_handle = Handle[_qt.Quote](deref(spread._thisptr))
cdef Handle[_ff.YieldTermStructure] yts_handle = deref(yldtermstruct._thisptr.get())
cdef _fsts.ForwardSpreadedTermStructure* _fwdts

_fwdts = new _fsts.ForwardSpreadedTermStructure(
yts_handle,
q_handle
)

self._thisptr = new shared_ptr[Handle[_ff.YieldTermStructure]](
new Handle[_ff.YieldTermStructure](shared_ptr[_ff.YieldTermStructure](_fwdts))
)
53 changes: 53 additions & 0 deletions quantlib/test/test_termstructures.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
from quantlib.time.daycounter import Actual360, Actual365Fixed
from quantlib.time.date import today, Days

from quantlib.compounding import Simple
from quantlib.time.api import Date, Actual360
from quantlib.market.market import libor_market, IborMarket
from quantlib.quotes import SimpleQuote
from quantlib.termstructures.yields.forward_spreaded_term_structure import ForwardSpreadedTermStructure

class SimpleQuoteTestCase(unittest.TestCase):

Expand Down Expand Up @@ -120,3 +125,51 @@ def test_reference_evaluation_data_changed(self):
for i, val in enumerate(expected):
self.assertAlmostEquals(val, calculated[i])

class ForwardSpreadedTestCase(unittest.TestCase):

def test_forward_spreaded_ts(self):
m = libor_market('USD(NY)')
eval_date = Date(20, 9, 2004)

quotes = [('DEP', '1W', SimpleQuote(0.0382)),
('DEP', '1M', SimpleQuote(0.0372)),
('DEP', '3M', SimpleQuote(0.0363)),
('DEP', '6M', SimpleQuote(0.0353)),
('DEP', '9M', SimpleQuote(0.0348)),
('DEP', '1Y', SimpleQuote(0.0345))]

m.set_quotes(eval_date, quotes)
ts = m.bootstrap_term_structure()

discount_ts = m._discount_term_structure
forecast_ts = m._forecast_term_structure
discount_spd = 0.05
forecast_spd = 0.08

fwd_spd_dts = ForwardSpreadedTermStructure(discount_ts, SimpleQuote(discount_spd))
fwd_spd_fts = ForwardSpreadedTermStructure(forecast_ts, SimpleQuote(forecast_spd))

df_rate = round(float(discount_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
dz_rate = round(float(discount_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

fdf_rate = round(float(fwd_spd_dts.forward_rate(Date(1 ,1 , 2005), Date(30 ,1 ,2005), Actual360(), Simple).rate), 2)
fdz_rate = round(float(fwd_spd_dts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

ff_rate = round(float(forecast_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
fz_rate = round(float(forecast_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

ffc_rate= round(float(fwd_spd_fts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
ffz_rate= round(float(fwd_spd_fts.zero_rate(Date(1, 1, 2005), Actual360() ,Simple).rate), 2)

df_diff= fdf_rate - df_rate
dz_diff= fdz_rate - dz_rate
ff_diff = ffc_rate - ff_rate
fz_diff = ffz_rate - fz_rate

self.assertAlmostEquals(df_diff, discount_spd)
self.assertAlmostEquals(dz_diff, discount_spd)
self.assertAlmostEquals(ff_diff, forecast_spd)
self.assertAlmostEquals(fz_diff, forecast_spd)

if __name__ == '__main__':
unittest.main()

0 comments on commit 03d391c

Please sign in to comment.