def _add_carry_calendar(roll_calendar, roll_parameters_object, dict_of_futures_contract_prices): """ :param roll_calendar: pdDataFrame with current_contract and next_contract :param roll_parameters_object: rollData :return: data frame ready to be rollCalendar """ list_of_contract_dates = list(roll_calendar.current_contract.values) contracts_with_roll_data = [ contractDateWithRollParameters(contractDate(str(contract_date)), roll_parameters_object) for contract_date in list_of_contract_dates ] carry_contract_dates = [ contract.carry_contract().date_str for contract in contracts_with_roll_data ] # Special case if first carry contract missing with a negative offset first_carry_contract = carry_contract_dates[0] if first_carry_contract not in dict_of_futures_contract_prices: # drop the first roll entirely carry_contract_dates.pop(0) # do the same with the calendar or will misalign first_roll_date = roll_calendar.index[0] roll_calendar = roll_calendar.drop(first_roll_date) roll_calendar["carry_contract"] = carry_contract_dates return roll_calendar
def get_contract_chain(instrument_code, data): diag_contracts = diagContracts(data) diag_prices = diagPrices(data) roll_parameters = diag_contracts.get_roll_parameters(instrument_code) # Get the last contract currently being used multiple_prices = diag_prices.get_multiple_prices(instrument_code) current_contract_dict = multiple_prices.current_contract_dict() current_contract_list = list(current_contract_dict.values()) furthest_out_contract_date = max(current_contract_list) furthest_out_contract = contractDateWithRollParameters( contractDate(furthest_out_contract_date), roll_parameters) # To give us wiggle room, and ensure we start collecting the new forward a # little in advance final_contract = furthest_out_contract.next_priced_contract() contract_date_chain = ( final_contract.get_unexpired_contracts_from_now_to_contract_date()) # We have a list of contract_date objects, need futureContracts # create a 'bare' instrument object instrument_object = futuresInstrument(instrument_code) contract_object_chain_as_list = [ futuresContract(instrument_object, contract_date_object) for contract_date_object in contract_date_chain ] contract_object_chain = listOfFuturesContracts( contract_object_chain_as_list) return contract_object_chain
def add_phantom_row(roll_calendar, dict_of_futures_contract_prices: dictFuturesContractFinalPrices, roll_parameters: rollParameters): final_row = roll_calendar.iloc[-1] if datetime.datetime.now()<final_row.name: return roll_calendar virtual_datetime = datetime.datetime.now() + datetime.timedelta(days=5) current_contract_date_str = str(final_row.next_contract) current_contract = contractDateWithRollParameters(contractDate(current_contract_date_str), roll_parameters) next_contract = current_contract.next_held_contract() carry_contract = current_contract.carry_contract() list_of_contract_names = dict_of_futures_contract_prices.keys() try: assert current_contract.date_str in list_of_contract_names except: print("Can't add extra row as data missing") return roll_calendar new_row = pd.DataFrame(dict(current_contract = current_contract_date_str, next_contract = next_contract.date_str, carry_contract = carry_contract.date_str), index=[virtual_datetime]) roll_calendar = pd.concat([roll_calendar, new_row], axis=0) return roll_calendar
def get_contract_date_object_with_roll_parameters(self, instrument_code, contract_date_id): roll_parameters = self.get_roll_parameters(instrument_code) contract_date_with_roll_parameters = contractDateWithRollParameters( contractDate(contract_date_id), roll_parameters) return contract_date_with_roll_parameters
def create_furthest_out_contract_with_roll_parameters_from_contract_date( data: dataBlob, instrument_code: str, furthest_out_contract_date: str): diag_contracts = dataContracts(data) roll_parameters = diag_contracts.get_roll_parameters(instrument_code) furthest_out_contract = contractDateWithRollParameters( contractDate(furthest_out_contract_date), roll_parameters) return furthest_out_contract
def get_contract_date_object_with_roll_parameters( self, instrument_code: str, contract_date_str: str) -> contractDateWithRollParameters: roll_parameters = self.get_roll_parameters(instrument_code) contract_date = self.get_contract_date_object(instrument_code, contract_date_str) contract_date_with_roll_parameters = contractDateWithRollParameters( contract_date, roll_parameters) return contract_date_with_roll_parameters
def extend_current_contracts(self, instrument_code, current_contracts): price_contract_date = current_contracts.price forward_contract_date = current_contracts.forward carry_contract_date = current_contracts.carry roll_parameters = self.get_roll_parameters(instrument_code) price_contract = contractDateWithRollParameters( contractDate(price_contract_date), roll_parameters) forward_contract = contractDateWithRollParameters( contractDate(forward_contract_date), roll_parameters) carry_contract = contractDateWithRollParameters( contractDate(carry_contract_date), roll_parameters) preceeding_price_contract_date = price_contract.previous_priced_contract( ) preceeding_forward_contract_date = forward_contract.previous_priced_contract( ) subsequent_forward_contract_date = forward_contract.next_held_contract( ) # Could be up to 6 contracts # HOW TO PAD THESE ? all_contracts = [ price_contract, forward_contract, preceeding_forward_contract_date, preceeding_price_contract_date, subsequent_forward_contract_date, carry_contract, ] all_contracts_dates = [contract.date_str for contract in all_contracts] unique_all_contract_dates = sorted(set(all_contracts_dates)) unique_all_contract_dates = unique_all_contract_dates + \ [missing_contract] * (6 - len(unique_all_contract_dates)) return unique_all_contract_dates
def _initial_contract_to_try_with(list_of_contract_dates: list, roll_parameters_object: rollParameters, price_dict: dictFuturesContractFinalPrices)\ ->contractWithRollParametersAndPrices: plausible_earliest_contract_date = list_of_contract_dates[0] plausible_earliest_contract = contractDateWithRollParameters( contractDate(plausible_earliest_contract_date), roll_parameters_object ) try_contract = contractWithRollParametersAndPrices( plausible_earliest_contract, price_dict ) return try_contract