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
예제 #2
0
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
예제 #4
0
    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
예제 #6
0
    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
예제 #7
0
    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
예제 #8
0
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