Created
August 12, 2012 04:40
-
-
Save tlmaloney/3329770 to your computer and use it in GitHub Desktop.
DateMeasure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
: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