def test_rule_m_(): date: dt = RelativeDate('1M', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 4) date: dt = RelativeDate('4M', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 25)
def test_rule_b(): date: dt = RelativeDate('-1b', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 15) date: dt = RelativeDate('+1b', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 20)
def test_rule_z_(): date: dt = RelativeDate('1Z', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 3) date: dt = RelativeDate('4Z', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 24)
def test_rule_r_(): date: dt = RelativeDate('1R', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 7) date: dt = RelativeDate('4R', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 28)
def test_rule_w_(): date: dt = RelativeDate('1W', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 6) date: dt = RelativeDate('4W', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 27)
def test_rule_y(): date: dt = RelativeDate('2y', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2023, 1, 19) date: dt = RelativeDate('-2y', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2019, 1, 21)
def test_rule_k(): date: dt = RelativeDate('1k', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2022, 1, 19) date: dt = RelativeDate('-1k', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2020, 1, 20)
def test_rule_t_(): date: dt = RelativeDate('1T', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 5) date: dt = RelativeDate('4T', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 26)
def test_rule_v_(): date: dt = RelativeDate('1V', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 2) date: dt = RelativeDate('4V', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 23)
def test_rule_u(): date: dt = RelativeDate('1u', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 20) date: dt = RelativeDate('2u', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 21) date: dt = RelativeDate('-2u', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 14)
def test_rule_g(): date: dt = RelativeDate('1g', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 26) date: dt = RelativeDate('3g', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 2, 9) date: dt = RelativeDate('-1g', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 12)
def test_rdate_datagrid(mocker): mocker.patch.object(GsSession.__class__, 'default_value', return_value=GsSession.get(Environment.QA, 'client_id', 'secret')) name = 'Testing' SPX = get_test_entity('MA4B66MW5E27U8P32SB') close = DataCoordinate( measure=DataMeasure.CLOSE_PRICE, frequency=DataFrequency.DAILY, ) last_trade_price = DataCoordinate( measure=DataMeasure.TRADE_PRICE, frequency=DataFrequency.REAL_TIME, ) rows = [ DataRow(SPX), ] columns = [ DataColumn(name="1d Chg (RT)", processor=ChangeProcessor(AppendProcessor(close, last_trade_price, start=RelativeDate("-1d", base_date=date(2021, 1, 22))))) ] datagrid = DataGrid(name=name, rows=rows, columns=columns) start_date = datagrid.columns[0].processor.children['a'].start assert start_date.base_date == RelativeDate('-1d', base_date=date(2021, 1, 22)).base_date assert start_date.rule == RelativeDate('-1d').rule datagrid.initialize() datagrid.poll() assert str(datagrid._data_queries[0].query.start) == '2021-01-21' as_dict = datagrid.as_dict() start = as_dict['parameters']['columns'][0]['parameters']['a']['parameters']['start'] assert start['type'] == 'relativeDate' assert start['value'] == {'rule': '-1d', 'baseDate': '2021-01-22'} # Check that base_date is not persisted when not passed in. columns = [ DataColumn(name="1d Chg (RT)", processor=ChangeProcessor(AppendProcessor(close, last_trade_price, start=RelativeDate("-1d")))) ] datagrid = DataGrid(name=name, rows=rows, columns=columns) as_dict = datagrid.as_dict() start = as_dict['parameters']['columns'][0]['parameters']['a']['parameters']['start'] assert start['type'] == 'relativeDate' assert start['type'] == 'relativeDate' assert start['value'] == {'rule': '-1d'}
def _resolve_rdates(self, rule_cache: Dict = None): # TODO: Thread this... rule_cache = rule_cache or {} # Default to no calendar for rdate for external and oauth calendar = [] if not GsSession.current.is_internal() and isinstance(GsSession.current, OAuth2Session) else None for entity_id, rules in self.rdate_entity_map.items(): entity = self.entity_map.get(entity_id) currencies = None exchanges = None if isinstance(entity, Entity): entity_dict = entity.get_entity() currency = entity_dict.get("currency") exchange = entity_dict.get("exchange") currencies = [currency] if currency else None exchanges = [exchange] if exchange else None for rule_base_date_tuple in rules: rule, base_date = rule_base_date_tuple[0], rule_base_date_tuple[1] cache_key = get_rdate_cache_key(rule_base_date_tuple[0], rule_base_date_tuple[1], currencies, exchanges) date_value = rule_cache.get(cache_key) if date_value is None: if base_date: base_date = dt.datetime.strptime(base_date, "%Y-%m-%d").date() date_value = RelativeDate(rule, base_date).apply_rule(currencies=currencies, exchanges=exchanges, holiday_calendar=calendar) rule_cache[cache_key] = date_value self.rule_cache[get_entity_rdate_key(entity_id, rule, base_date)] = date_value
def get_df_with_retries(fetcher, start_date, end_date, exchange, retries=1): """ Loads results from Data Service by calling fetcher function. Shifts query date range back by business days until result is not empty or retry limit reached. This is a fallback feature in case a data upload is late. Measure implementations should be written such that retries are usually not required. :param fetcher: a no-argument function runs a data query and returns a DataFrame :param start_date: initial start date for query :param end_date: initial end date for query :param exchange: exchange to use for holiday calendar :param retries: maximum number of retries :return: DataFrame """ retries = max(retries, 0) while retries > -1: with DataContext(start_date, end_date): result = fetcher() if not result.empty: break kwargs = {'exchanges': [exchange]} if exchange else {} # no need to include any part of the previous date range since it's known to be empty end_date = RelativeDate('-1b', base_date=start_date).apply_rule(**kwargs) start_date = end_date retries -= 1 return result
def test_rule_parsing(): assert RelativeDate('A')._get_rules() == ['A'] assert RelativeDate('1d')._get_rules() == ['1d'] assert RelativeDate('-1d')._get_rules() == ['-1d'] assert RelativeDate('1y-1d')._get_rules() == ['1y', '-1d'] assert RelativeDate('-1y-1d')._get_rules() == ['-1y', '-1d'] assert RelativeDate('-1y+1d')._get_rules() == ['-1y', '1d']
def test_currency_holiday_calendars(): replace = Replacer() replace('gs_quant.api.gs.data.GsDataApi.query_data', Mock(side_effect=mock_holiday_data)) rdate = RelativeDate('-1b', base_date=dt(2022, 4, 12)) assert dt(2022, 4, 11) == rdate.apply_rule(currencies=[]) assert dt(2022, 4, 11) == rdate.apply_rule(currencies=['GBP']) assert dt(2022, 4, 8) == rdate.apply_rule(currencies=['USD']) assert dt(2022, 4, 8) == rdate.apply_rule() replace.restore()
def get_final_date(inst, create_date, duration, holiday_calendar=None): global final_date_cache cache_key = (inst, create_date, duration, holiday_calendar) if cache_key in final_date_cache: return final_date_cache[cache_key] if duration is None: final_date_cache[cache_key] = dt.date.max return dt.date.max if isinstance(duration, (dt.datetime, dt.date)): final_date_cache[cache_key] = duration return duration if hasattr(inst, str(duration)): final_date_cache[cache_key] = getattr(inst, str(duration)) return getattr(inst, str(duration)) final_date_cache[cache_key] = RelativeDate( duration, create_date).apply_rule(holiday_calendar=holiday_calendar) return final_date_cache[cache_key]
def test_rule_e(): date: dt = RelativeDate('e', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 31)
def test_chaining(): date: dt = RelativeDate('J+14d+0u+4u', base_date=dt( 2021, 1, 19)).apply_rule(holiday_calendar=holiday_calendar) assert date == dt(2021, 1, 22)
def test_rule_a_(): date: dt = RelativeDate('A', base_date=dt(2021, 1, 19)).apply_rule() assert date == dt(2021, 1, 1)