Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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
Exemplo n.º 7
0
    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))
Exemplo n.º 9
0
 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))
Exemplo n.º 10
0
    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))
Exemplo n.º 12
0
    def simple(futuresContract, instrument_code, contract_date, **kwargs):

        return futuresContract(futuresInstrument(instrument_code), contractDate(contract_date, **kwargs))