def daycount(cls, date1, date2, daycounter=None): pydate1, pydate2 = map(pydate, (date1, date2)) if not daycounter: daycounter = cls.ActualActual() qldate1 = qldate_from_pydate(pydate1) qldate2 = qldate_from_pydate(pydate2) return daycounter.day_count(qldate1, qldate2)
def year_fraction(cls, date1, date2, daycounter=None): ''' Calculate the fraction of a year between two date1 and date2, based on the daycount specified. dates may be ccyymmdd or python datetime.dates ''' pydate1, pydate2 = map(pydate, (date1, date2)) if not daycounter: daycounter = cls.ActualActual() qldate1 = qldate_from_pydate(pydate1) qldate2 = qldate_from_pydate(pydate2) return daycounter.year_fraction(qldate1, qldate2)
def test_conversion_from_datetime_to_pyql(self): date1 = datetime.date(2010, 1, 1) qldate1 = qldate_from_pydate(date1) expected_result = Date(1, Jan, 2010) self.assertEquals(expected_result, qldate1)
def next_imm_date(reference_date, tenor): """ Third Wednesday of contract month """ dt = qldate_from_pydate(reference_date) for k in range(tenor): tmp = imm.next_date(dt) dt = pydate_to_qldate(tmp) return pydate_from_qldate(dt)
def test_conversion_from_datetime_to_pyql(self): date1 = datetime.date(2010, 1, 1) qldate1 = qldate_from_pydate(date1) expected_result = Date(1, Jan, 2010) self.assertEqual(expected_result, qldate1)
def pydate_to_qldate(date): """ Converts a datetime object or a date string into a QL Date. """ if isinstance(date, basestring): yy, mm, dd = _parsedate(date) return Date(dd, mm, yy) else: return dt.qldate_from_pydate(date)
def pydate_to_qldate(date): """ Converts a datetime object or a date string into a QL Date. """ if isinstance(date, str): # Changed from basestring for Py2/3 compatibility yy, mm, dd = _parsedate(date) return Date(dd, mm, yy) else: return dt.qldate_from_pydate(date)
def pydate_to_qldate(date): """ Converts a datetime object or a date string into a QL Date. """ if isinstance(date, Date): return date if isinstance(date, basestring): yy, mm, dd = _parsedate(date) return Date(dd, mm, yy) else: return dt.qldate_from_pydate(date)
def make_rate_helper(market, quote, reference_date=None): """ Wrapper for deposit and swaps rate helpers makers TODO: class method of RateHelper? """ rate_type, tenor, quote_value = quote if(rate_type == 'SWAP'): libor_index = market._floating_rate_index spread = SimpleQuote(0) fwdStart = Period(0, Days) helper = SwapRateHelper.from_tenor( quote_value, Period(tenor), market._floating_rate_index.fixing_calendar, code_to_frequency(market._params.fixed_leg_period), BusinessDayConvention.from_name( market._params.fixed_leg_convention), DayCounter.from_name(market._params.fixed_leg_daycount), libor_index, spread, fwdStart) elif(rate_type == 'DEP'): end_of_month = True helper = DepositRateHelper( quote_value, Period(tenor), market._params.settlement_days, market._floating_rate_index.fixing_calendar, market._floating_rate_index.business_day_convention, end_of_month, DayCounter.from_name(market._deposit_daycount)) elif(rate_type == 'ED'): if reference_date is None: raise Exception("Reference date needed with ED Futures data") forward_date = next_imm_date(reference_date, tenor) helper = FuturesRateHelper( rate = SimpleQuote(quote_value), imm_date = qldate_from_pydate(forward_date), length_in_months = 3, calendar = market._floating_rate_index.fixing_calendar, convention = market._floating_rate_index.business_day_convention, end_of_month = True, day_counter = DayCounter.from_name(market._params.floating_leg_daycount)) else: raise Exception("Rate type %s not supported" % rate_type) return (helper)
def is_business_day(cls, date, calendar=None): if not calendar: calendar = cls.TARGET() elif not hasattr(calendar, "advance"): return None qldate = qldate_from_pydate(pydate(date)) try: return calendar.is_business_day(qldate) except: try: return calendar().is_business_day(qldate) except: return None
def advance(cls, date, n, timeunit=None, calendar=None, convention=None): """ Advance pydate according the specified calendar and convention :pydate: e.g. 19600809, date(1964, 9, 29), '5-23-1993' :n: integer :timeunit: e.g., enums.TimeUnits.Days usage ----- Note 9/6/1980 is a weekend >>> Calendars.advance(19800906, 1) datetime.date(1980, 9, 8) """ if not calendar: calendar = cls.TARGET() elif not hasattr(calendar, "advance"): return None if not convention: convention = BusinessDayConventions.Following if not timeunit: timeunit = TimeUnits.Days qldate = qldate_from_pydate(pydate(date)) try: return pydate_from_qldate(calendar.advance(qldate, n, timeunit)) except: try: return pydate_from_qldate( calendar().advance(qldate, n, timeunit) ) except: print("failure {}".format(qldate)) return None
def adjust(cls, date, calendar=None, convention=None): if not calendar: calendar = cls.TARGET() elif not hasattr(calendar, "adjust"): return None if not convention: convention = BusinessDayConventions.Following qldate = qldate_from_pydate(pydate(date)) try: return pydate_from_qldate(calendar.adjust(qldate, convention)) except: try: return pydate_from_qldate(calendar().adjust(qldate, convention)) except: return None
def make_rate_helper(market, quote, reference_date=None): """ Wrapper for deposit and swaps rate helpers makers TODO: class method of RateHelper? """ rate_type, tenor, quote_value = quote if(rate_type == 'SWAP'): libor_index = market._floating_rate_index spread = SimpleQuote(0) fwdStart = Period(0, Days) helper = SwapRateHelper.from_tenor( quote_value, Period(tenor), market._floating_rate_index.fixing_calendar, code_to_frequency(market._params.fixed_leg_period), BusinessDayConvention.from_name( market._params.fixed_leg_convention), DayCounter.from_name(market._params.fixed_leg_daycount), libor_index, spread, fwdStart) elif(rate_type == 'DEP'): end_of_month = True helper = DepositRateHelper( quote_value, Period(tenor), market._params.settlement_days, market._floating_rate_index.fixing_calendar, market._floating_rate_index.business_day_convention, end_of_month, DayCounter.from_name(market._deposit_daycount)) elif(rate_type == 'ED'): if reference_date is None: raise Exception("Reference date needed with ED Futures data") forward_date = next_imm_date(reference_date, tenor) helper = FuturesRateHelper( rate =SimpleQuote(quote_value), imm_date = qldate_from_pydate(forward_date), length_in_months = 3, calendar = market._floating_rate_index.fixing_calendar, convention = market._floating_rate_index.business_day_convention, end_of_month = True, day_counter = DayCounter.from_name( market._params.floating_leg_daycount)) elif rate_type.startswith('ER'): # TODO For Euribor futures, we found it useful to supply the `imm_date` # parameter directly, instead of as a number of periods from the # evaluation date, as for ED futures. To achieve this, we pass the # `imm_date` in the `tenor` field of the quote. helper = FuturesRateHelper( rate=SimpleQuote(quote_value), imm_date=tenor, length_in_months=3, calendar=market._floating_rate_index.fixing_calendar, convention=market._floating_rate_index.business_day_convention, end_of_month=True, day_counter=DayCounter.from_name( market._params.floating_leg_daycount)) else: raise Exception("Rate type %s not supported" % rate_type) return helper
def test_imm_date(self): dt = imm.date('M9') cd = imm.code(qldate_from_pydate(dt)) self.assertEqual(cd, 'M9')
def test_imm_date(self): dt = imm.date('M9') print('IMM date M9: %s' % dt) cd = imm.code(qldate_from_pydate(dt)) print('IMM code for %s: %s' % (dt, cd)) self.assertTrue(cd == 'M9')