Skip to content

Instantly share code, notes, and snippets.

@tlmaloney
Created August 12, 2012 04:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tlmaloney/3329770 to your computer and use it in GitHub Desktop.
Save tlmaloney/3329770 to your computer and use it in GitHub Desktop.
DateMeasure
'''
:Name: DateMeasureKit
:Descr: The way we make calculations based on the number of days between two dates
:Synopsis: Contains a set of conventions for determining the day-count between two dates. Finds both the number of days between two dates and the corresponding day count factor.
:Author: dpollini
tmaloney
:Platform: Linux
'''
import QuantLib
class DateMeasure(object):
"""An abstract base class for date measures"""
name = None
def measure_time(self, date, schedule):
'''Returns a measure of time between date and
schedule.prev_date(date)
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
pass
def dcf(self, date, schedule):
'''Returns the Day Count Factor -- a ratio of the measure between date
and schedule.prev_date(date) and some other measure
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
pass
class Measure30360(DateMeasure):
name = '30360'
def measure_time(self, date, schedule):
'''Returns a measure of time between date and
schedule.prev_date(date) using the 30/360 day count convention
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
# Implements 30/360 calculation
d1 = QuantLib.Date(schedule.prev_date(date).serial_date)
d2 = QuantLib.Date(date.serial_date)
day_counter = QuantLib.Thirty360()
return day_counter.dayCount(d1, d2)
def dcf(self, date, schedule):
'''Returns the Day Count Factor -- ratio of
self.measure_time(date, schedule) and 360.
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
return self.measure_time(date, schedule)/360.
class MeasureACT360(DateMeasure):
name = 'ACT360'
def measure_time(self, date, schedule):
'''Returns a measure of time between date and
schedule.prev_date(date) using the Actual/360 day count convention
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
# Implements ACT/360 calculation
d1 = QuantLib.Date(schedule.prev_date(date).serial_date)
d2 = QuantLib.Date(date.serial_date)
day_counter = QuantLib.Actual360()
return day_counter.dayCount(d1, d2)
def dcf(self, date, schedule):
'''Returns the Day Count Factor -- ratio of
self.measure_time(date, schedule) and 360.
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
return self.measure_time(date, schedule)/360.
class MeasureACT365(DateMeasure):
name = 'ACT365'
def measure_time(self, date, schedule):
'''Returns a measure of time between date and
schedule.prev_date(date) using the Actual 365 day count convention
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
# Implements ACT/365 calculation
d1 = QuantLib.Date(schedule.prev_date(date).serial_date)
d2 = QuantLib.Date(date.serial_date)
day_counter = QuantLib.Actual365Fixed()
return day_counter.dayCount(d1, d2)
def dcf(self, date, schedule):
'''Returns the Day Count Factor -- ratio of
self.measure_time(date, schedule) and 365.
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
return self.measure_time(date, schedule)/365.
class MeasureACTACT(DateMeasure):
name = 'ACTACT'
def measure_time(self, date, schedule):
'''Returns a measure of time between date and
schedule.prev_date(date) using the Actual/Actual day count convention
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
# Implements ACT/365 calculation
d1 = QuantLib.Date(schedule.prev_date(date).serial_date)
d2 = QuantLib.Date(date.serial_date)
day_counter = QuantLib.ActualActual()
return day_counter.dayCount(d1, d2)
def dcf(self, date, schedule):
'''Returns the Day Count Factor -- ratio of
self.measure_time(date, schedule) and
self.measure_time(schedule.next_date(date), schedule)
Keyword arguments:
date -- SerialDate instance
schedule -- Schedule instance
'''
payment_date = schedule.next_date(date)
return float(self.measure_time(date, schedule)) / \
self.measure_time(payment_date, schedule)
_MEASURES = {}
_MEASURES[Measure30360.name] = Measure30360()
_MEASURES[MeasureACT360.name] = MeasureACT360()
_MEASURES[MeasureACT365.name] = MeasureACT365()
_MEASURES[MeasureACTACT.name] = MeasureACTACT()
def get_day_counter(name):
"""Returns the Measure object corresponding to name
Keyword arguments:
name -- String (e.g. 'ACT365')
"""
return _MEASURES[name]
def get_names():
"""Returns the names of all available measures
"""
return _MEASURES.keys()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment