def test_finished_roll_pre_expiry_static_transition(dates): contract_dates = dates.iloc[0:2] ts = dates.iloc[0] + BDay(-2) cols = pd.MultiIndex.from_product([[0], ['front', 'back']]) idx = [-9, -8] transition = pd.DataFrame([[1.0, 0.0], [0.0, 1.0]], index=idx, columns=cols) wts = mappings.static_transition(ts, contract_dates, transition) wts_exp = [(0, 'CLZ16', 1.0, ts)] assert wts == wts_exp
def test_non_numeric_column_static_transition(dates): contract_dates = dates.iloc[0:2] ts = dates.iloc[0] + BDay(-8) cols = pd.MultiIndex.from_product([["CL1"], ['front', 'back']]) idx = [-2, -1, 0] transition = pd.DataFrame([[1.0, 0.0], [0.5, 0.5], [0.0, 1.0]], index=idx, columns=cols) wts = mappings.static_transition(ts, contract_dates, transition) wts_exp = [("CL1", 'CLX16', 1.0, ts)] assert wts == wts_exp
def test_static_bad_transitions(dates): contract_dates = dates.iloc[[0]] ts = dates.iloc[0] + BDay(-8) # transition does not contain 'front' column cols = pd.MultiIndex.from_product([[0], ['not_front', 'back']]) idx = [-2, -1, 0] transition = pd.DataFrame([[1.0, 0.0], [0.5, 0.5], [0.0, 1.0]], index=idx, columns=cols) with pytest.raises(ValueError): mappings.static_transition(ts, contract_dates, transition) # transition does not sum to one across rows cols = pd.MultiIndex.from_product([[0], ['front', 'back']]) transition = pd.DataFrame([[1.0, 0.0], [0.5, 0.0], [0.0, 1.0]], index=idx, columns=cols) with pytest.raises(ValueError): mappings.static_transition(ts, contract_dates, transition) # transition is not monotonic increasing in back transition = pd.DataFrame([[0.7, 0.3], [0.8, 0.2], [0.0, 1.0]], index=idx, columns=cols) with pytest.raises(ValueError): mappings.static_transition(ts, contract_dates, transition)
def test_not_in_roll_one_generic_filtering_front_contracts_static_transition( dates): # NOQA contract_dates = dates.iloc[0:2] ts = dates.iloc[1] + BDay(-8) cols = pd.MultiIndex.from_product([[0], ['front', 'back']]) idx = [-2, -1, 0] transition = pd.DataFrame([[1.0, 0.0], [0.5, 0.5], [0.0, 1.0]], index=idx, columns=cols) wts = mappings.static_transition(ts, contract_dates, transition) wts_exp = [(0, 'CLZ16', 1.0, ts)] assert wts == wts_exp
def test_invalid_contract_dates(): ts = [pd.Timestamp("2016-10-19")] cols = pd.MultiIndex.from_product([[0, 1], ['front', 'back']]) idx = [-1, 0] trans = pd.DataFrame([[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0]], index=idx, columns=cols) non_unique_index = pd.Series( [pd.Timestamp('2016-10-20'), pd.Timestamp('2016-11-21')], index=['instr1', 'instr1']) with pytest.raises(ValueError): mappings.roller(ts, non_unique_index, mappings.static_transition, transition=trans) non_unique_vals = pd.Series( [pd.Timestamp('2016-10-20'), pd.Timestamp('2016-10-20')], index=['instr1', 'instr2']) with pytest.raises(ValueError): mappings.roller(ts, non_unique_vals, mappings.static_transition, transition=trans) non_monotonic_vals = pd.Series( [pd.Timestamp('2016-10-20'), pd.Timestamp('2016-10-19')], index=['instr1', 'instr2']) with pytest.raises(ValueError): mappings.static_transition(ts[0], non_monotonic_vals, transition=trans) not_enough_vals = pd.Series([pd.Timestamp('2016-10-19')], index=['instr1']) with pytest.raises(IndexError): mappings.static_transition(ts[0], not_enough_vals, transition=trans)
def test_no_roll_date_two_generics_static_transition(dates): dt = dates.iloc[0] contract_dates = dates ts = dt + BDay(-8) cols = pd.MultiIndex.from_product([[0, 1], ['front', 'back']]) idx = [-2, -1, 0] transition = pd.DataFrame( [[1.0, 0.0, 1.0, 0.0], [0.5, 0.5, 0.5, 0.5], [0.0, 1.0, 0.0, 1.0]], index=idx, columns=cols) wts = mappings.static_transition(ts, contract_dates, transition) wts_exp = [(0, 'CLX16', 1.0, ts), (1, 'CLZ16', 1.0, ts)] assert wts == wts_exp
def test_roll_with_holiday(dates): contract_dates = dates.iloc[-2:] ts = pd.Timestamp("2016-11-17") cols = pd.MultiIndex.from_product([[0], ['front', 'back']]) idx = [-2, -1, 0] transition = pd.DataFrame([[1.0, 0.0], [0.5, 0.5], [0.0, 1.0]], index=idx, columns=cols) holidays = [np.datetime64("2016-11-18")] # the holiday moves the roll schedule up one day, since Friday is # excluded as a day wts = mappings.static_transition(ts, contract_dates, transition, holidays) wts_exp = [(0, 'CLZ16', 0.5, ts), (0, 'CLF17', 0.5, ts)] assert wts == wts_exp