def back_out_from_current_and_forward_data(rollCalendar, current_and_forward_data, roll_parameters_object): """ :param current_and_forward_data: output from futuresDataForSim.FuturesData.get_current_and_forward_price_data(instrument_code) columns: PRICE, FORWARD, FORWARD_CONTRACT, PRICE_CONTRACT :return: rollCalendar """ current_and_forward_unique = current_and_forward_data[~current_and_forward_data.index.duplicated(keep='last')] roll_dates = current_and_forward_unique.index[1:][current_and_forward_unique[1:].PRICE_CONTRACT.values>current_and_forward_unique[:-1].PRICE_CONTRACT.values] days_before = current_and_forward_unique.index[:-1][current_and_forward_unique[:-1].PRICE_CONTRACT.values<current_and_forward_unique[1:].PRICE_CONTRACT.values] ## Duplicates are possible (double rolls) current_contracts = [contractDate(current_and_forward_unique.loc[date_index].PRICE_CONTRACT).contract_date for date_index in days_before] next_contracts = [contractDate(current_and_forward_unique.loc[date_index].PRICE_CONTRACT).contract_date for date_index in roll_dates] roll_calendar = pd.DataFrame(dict(current_contract = current_contracts, next_contract = next_contracts), index = roll_dates) roll_calendar_with_carry = _add_carry_calendar(roll_calendar, roll_parameters_object) roll_calendar_object = rollCalendar(roll_calendar_with_carry) return roll_calendar_object
def __init__(self, instrument_object, contract_date_object, **kwargs): """ futuresContract(futuresInstrument, contractDate) OR futuresContract("instrument_code", "yyyymm") :param instrument_object: str or futuresInstrument :param contract_date_object: contractDate or contractDateWithRollParameters or str """ if type(instrument_object) is str: if type(contract_date_object) is str: # create a simple object self.instrument = futuresInstrument(instrument_object) self.contract_date = contractDate(contract_date_object) if type(contract_date_object) is list: if len(contract_date_object) == 1: self.instrument = futuresInstrument(instrument_object) self.contract_date = contractDate(contract_date_object[0]) else: self.instrument = futuresInstrument(instrument_object) self.contract_date = [ contractDate(contract_date) for contract_date in contract_date_object ] else: self.instrument = instrument_object self.contract_date = contract_date_object self._is_empty = False self.params = kwargs
def back_out_from_current_and_forward_data(rollCalendar, current_and_forward_data, roll_parameters_object): """ :param current_and_forward_data: output from futuresDataForSim.FuturesData.get_current_and_forward_price_data(instrument_code) columns: PRICE, FORWARD, FORWARD_CONTRACT, PRICE_CONTRACT :return: rollCalendar """ current_and_forward_unique = current_and_forward_data[~current_and_forward_data.index.duplicated(keep='last')] roll_dates = current_and_forward_unique.index[1:][current_and_forward_unique[1:].PRICE_CONTRACT.values>current_and_forward_unique[:-1].PRICE_CONTRACT.values] days_before = current_and_forward_unique.index[:-1][current_and_forward_unique[:-1].PRICE_CONTRACT.values<current_and_forward_unique[1:].PRICE_CONTRACT.values] ## Duplicates are possible (double rolls) current_contracts = [contractDate(current_and_forward_unique.loc[date_index].PRICE_CONTRACT).contract_date for date_index in days_before] next_contracts = [contractDate(current_and_forward_unique.loc[date_index].PRICE_CONTRACT).contract_date for date_index in roll_dates] roll_calendar = pd.DataFrame(dict(current_contract = current_contracts, next_contract = next_contracts), index = roll_dates) roll_calendar_with_carry = _add_carry_calendar(roll_calendar, roll_parameters_object) roll_calendar_object = rollCalendar(roll_calendar_with_carry) return roll_calendar_object
def create_empty(futuresContract): fake_instrument = futuresInstrument("EMPTY") fake_contract_date = contractDate("150001") futures_contract = futuresContract(fake_instrument, fake_contract_date) futures_contract._is_empty = True return futures_contract
def create_empty(futuresContract): fake_instrument = futuresInstrument("EMPTY") fake_contract_date = contractDate("150001") futures_contract = futuresContract(fake_instrument, fake_contract_date) futures_contract._is_empty = True return futures_contract
def last_current_contract(self): """ Returns the oldest contract in the final row of the row calendar :return: contractDate """ final_row = self.tail(1).values last_contract_numeric = final_row.max() last_contract = contractDate(str(last_contract_numeric)) return last_contract
def series_of_price_contracts_within_daterange(listOfFuturesContracts, instrument_object, roll_parameters, first_contract_date, last_date): """ We want to get all the contracts that fit in the roll cycle between two dates So for example suppose we want all contracts since 1st January 1980, to the present day, for Eurodollar; where the rollcycle = "HMUZ" (quarterly IMM) and last_date is 1st January 2021 then we'd get all quarterly contracts with expiries between 1st January 1980 to 1st January 2021 This uses the pricing rollCycle in roll data :param instrument_object: An instrument object, containing roll information :param roll_parameters: rollParameters :param first_contract_date: The first contract date :param current_date: The date when we want to stop getting contracts datetime.datetime :return: list of futuresContracts """ first_contract = futuresContract(instrument_object, contractDate(first_contract_date)) assert last_date > first_contract.expiry_date list_of_contracts = [first_contract] ## note the same instrument_object will be shared by all in the list so we can modify it directly if needed date_still_valid = True current_contract = first_contract while date_still_valid: next_contract = current_contract.next_priced_contract() if current_contract.contract_date.stop_holding() > last_date: date_still_valid = False else: list_of_contracts.append(next_contract) current_contract = next_contract if len(list_of_contracts) > MAX_CONTRACT_SIZE: raise Exception("Too many contracts - check your inputs") return listOfFuturesContracts(list_of_contracts)
def test_contractDate(self): contract_date201801 = contractDate("201801") contract_date20180115 = contractDate("20180115") # dictionary contract_date_dict_201801 = contract_date201801.as_dict() self.assertEqual( contract_date_dict_201801, dict(expiry_date=(2018, 1, 1), contract_date="201801", approx_expiry_offset=0)) contract_date_dict_20180115 = contract_date20180115.as_dict() self.assertEqual( contract_date_dict_20180115, dict(expiry_date=(2018, 1, 15), contract_date="20180115", approx_expiry_offset=0)) new_contractdate20801 = contractDate.create_from_dict( contract_date_dict_201801) self.assertEqual(contract_date201801.contract_date, new_contractdate20801.contract_date) self.assertEqual(contract_date201801.expiry_date.year, new_contractdate20801.expiry_date.year) # basic functionality self.assertEqual(contract_date201801.contract_date, "20180100") self.assertEqual(contract_date20180115.contract_date, "20180115") self.assertEqual(contract_date201801.year(), 2018) self.assertEqual(contract_date201801.month(), 1) self.assertEqual(contract_date201801._only_has_month, True) self.assertEqual(contract_date20180115.day(), 15) self.assertEqual(contract_date201801.letter_month(), "F") self.assertEqual(contract_date201801.as_date(), datetime.datetime(2018, 1, 1)) self.assertEqual(contract_date20180115.as_date(), datetime.datetime(2018, 1, 15)) # check date comparision self.assertEqual( contract_date201801.check_if_expiry_after_date( datetime.datetime(2018, 2, 1)), False) self.assertEqual( contract_date201801.check_if_expiry_after_date( datetime.datetime(2017, 12, 31)), True) # alternative method to define contracts contract_date201801b = contractDate.contract_date_from_numbers(2018, 1) contract_date20180115b = contractDate.contract_date_from_numbers( 2018, 1, 15) self.assertEqual(contract_date201801b.contract_date, "20180100") self.assertEqual(contract_date20180115b.contract_date, "20180115") # check expiry dates contract_date201803_withexpiry = contractDate("201803", expiry_date=(2008, 3, 15)) contract_date201801b_withexpiry = contractDate.contract_date_from_numbers( 2018, 1, expiry_date=(2008, 1, 16)) self.assertEqual(contract_date201803_withexpiry.expiry_date, datetime.datetime(2008, 3, 15)) self.assertEqual(contract_date201801b_withexpiry.expiry_date, datetime.datetime(2008, 1, 16)) # check expiry dates with contract offset contract_date201803_withexpiry_offset = contractDate( "201803", approx_expiry_offset=40) contract_date201801b_withexpiry_offset = contractDate.contract_date_from_numbers( 2018, 1, approx_expiry_offset=-20) self.assertEqual(contract_date201803_withexpiry_offset.expiry_date, datetime.datetime(2018, 4, 10)) self.assertEqual(contract_date201801b_withexpiry_offset.expiry_date, datetime.datetime(2017, 12, 12))
def simple(futuresContract, instrument_code, contract_date, **kwargs): DeprecationWarning("futuresContract.simple(x,y) is deprecated, use futuresContract(x,y) instead") return futuresContract(futuresInstrument(instrument_code), contractDate(contract_date, **kwargs))
def simple(futuresContract, instrument_code, contract_date, **kwargs): return futuresContract(futuresInstrument(instrument_code), contractDate(contract_date, **kwargs))
def test_contractDate(self): contract_date201801=contractDate("201801") contract_date20180115=contractDate("20180115") contract_date20180100=contractDate("20180100") self.assertEqual(contract_date20180100.contract_date, "20180100") # dictionary contract_date_dict_201801 = contract_date201801.as_dict() self.assertEqual(contract_date_dict_201801, dict(expiry_date=(2018,1,1), contract_date="201801", approx_expiry_offset=0)) contract_date_dict_20180115 = contract_date20180115.as_dict() self.assertEqual(contract_date_dict_20180115, dict(expiry_date=(2018,1,15), contract_date="20180115", approx_expiry_offset=0)) new_contractdate20801=contractDate.create_from_dict(contract_date_dict_201801) self.assertEqual(contract_date201801.contract_date, new_contractdate20801.contract_date) self.assertEqual(contract_date201801.expiry_date.year, new_contractdate20801.expiry_date.year) # basic functionality self.assertEqual(contract_date201801.contract_date, "20180100") self.assertEqual(contract_date20180115.contract_date, "20180115") self.assertEqual(contract_date201801.year(), 2018) self.assertEqual(contract_date201801.month(), 1) self.assertEqual(contract_date201801._only_has_month, True) self.assertEqual(contract_date20180115.day(), 15) self.assertEqual(contract_date201801.letter_month(), "F") self.assertEqual(contract_date201801.as_date(), datetime.datetime(2018,1,1)) self.assertEqual(contract_date20180115.as_date(), datetime.datetime(2018,1,15)) # check date comparision self.assertEqual(contract_date201801.check_if_expiry_after_date(datetime.datetime(2018,2,1)), False) self.assertEqual(contract_date201801.check_if_expiry_after_date(datetime.datetime(2017,12,31)), True) # alternative method to define contracts contract_date201801b = contractDate.contract_date_from_numbers(2018,1) contract_date20180115b = contractDate.contract_date_from_numbers(2018,1, 15) self.assertEqual(contract_date201801b.contract_date, "20180100") self.assertEqual(contract_date20180115b.contract_date, "20180115") # check expiry dates contract_date201803_withexpiry=contractDate("201803", expiry_date=(2008,3,15)) contract_date201801b_withexpiry = contractDate.contract_date_from_numbers(2018,1, expiry_date = (2008,1,16)) self.assertEqual(contract_date201803_withexpiry.expiry_date, datetime.datetime(2008,3,15)) self.assertEqual(contract_date201801b_withexpiry.expiry_date, datetime.datetime(2008,1,16)) # check expiry dates with contract offset contract_date201803_withexpiry_offset=contractDate("201803", approx_expiry_offset=40) contract_date201801b_withexpiry_offset = contractDate.contract_date_from_numbers(2018,1, approx_expiry_offset=-20) self.assertEqual(contract_date201803_withexpiry_offset.expiry_date, datetime.datetime(2018,4,10)) self.assertEqual(contract_date201801b_withexpiry_offset.expiry_date, datetime.datetime(2017,12,12))
def simple(futuresContract, instrument_code, contract_date, **kwargs): return futuresContract(futuresInstrument(instrument_code), contractDate(contract_date, **kwargs))