def test_roll_parameters(self): data = mongoRollParametersData(database_name='test') # test db so okay to do this data._mongo.db.drop_collection(data._mongo.collection_name) codes = data.get_list_of_instruments() self.assertEqual(codes, []) roll_object = data.get_roll_parameters("EDOLLAR") self.assertTrue(roll_object.empty()) roll_object = rollParameters(hold_rollcycle ="HMUZ", priced_rollcycle="HM") data.add_roll_parameters(roll_object, "EDOLLAR") self.assertEqual(data.get_list_of_instruments(), ['EDOLLAR']) found_object = data.get_roll_parameters("EDOLLAR") self.assertEqual(found_object.hold_rollcycle.cyclestring, "HMUZ") found_object = data['EDOLLAR'] self.assertEqual(found_object.priced_rollcycle.cyclestring, "HM") codes = data.get_list_of_instruments() self.assertEqual(codes, ['EDOLLAR']) data.delete_roll_parameters("EDOLLAR", are_you_sure=True) found_object = data.get_roll_parameters("EDOLLAR") self.assertTrue(found_object.empty()) codes = data.get_list_of_instruments() self.assertEqual(codes, [])
def get_roll_parameters_from_mongo(instrument_code): mongo_roll_parameters = mongoRollParametersData() roll_parameters = mongo_roll_parameters.get_roll_parameters(instrument_code) if roll_parameters.empty(): raise Exception("Instrument %s missing from %s" % (instrument_code, mongo_roll_parameters)) return roll_parameters
def get_roll_parameters_from_mongo(instrument_code): mongo_roll_parameters = mongoRollParametersData() roll_parameters = mongo_roll_parameters.get_roll_parameters( instrument_code) if roll_parameters.empty(): raise Exception("Instrument %s missing from %s" % (instrument_code, mongo_roll_parameters)) return roll_parameters
def process_multiple_prices_single_instrument( instrument_code, adjust_calendar_to_prices=True, csv_multiple_data_path=arg_not_supplied, csv_roll_data_path=arg_not_supplied, ADD_TO_ARCTIC=True, ADD_TO_CSV=False, ): ( csv_roll_calendars, arctic_individual_futures_prices, arctic_multiple_prices, csv_multiple_prices, ) = _get_data_inputs(csv_roll_data_path, csv_multiple_data_path) dict_of_futures_contract_prices = ( arctic_individual_futures_prices.get_all_prices_for_instrument( instrument_code)) dict_of_futures_contract_closing_prices = ( dict_of_futures_contract_prices.final_prices()) roll_calendar = csv_roll_calendars.get_roll_calendar(instrument_code) # Add first phantom row so that the last calendar entry won't be consumed by adjust_roll_calendar() m = mongoRollParametersData() roll_parameters = m.get_roll_parameters(instrument_code) roll_calendar = add_phantom_row(roll_calendar, dict_of_futures_contract_closing_prices, roll_parameters) if adjust_calendar_to_prices: roll_calendar = adjust_roll_calendar(instrument_code, roll_calendar) # Second phantom row is needed in order to process the whole set of closing prices (and not stop after the last roll-over) roll_calendar = add_phantom_row(roll_calendar, dict_of_futures_contract_closing_prices, roll_parameters) multiple_prices = futuresMultiplePrices.create_from_raw_data( roll_calendar, dict_of_futures_contract_closing_prices) print(multiple_prices) if ADD_TO_ARCTIC: arctic_multiple_prices.add_multiple_prices(instrument_code, multiple_prices, ignore_duplication=True) if ADD_TO_CSV: csv_multiple_prices.add_multiple_prices(instrument_code, multiple_prices, ignore_duplication=True) return multiple_prices
def build_and_write_roll_calendar(instrument_code, output_datapath=arg_not_supplied, check_before_writing=True): if output_datapath is arg_not_supplied: print( "*** WARNING *** This will overwrite the provided roll calendar. Might be better to use a temporary directory!" ) else: print("Writing to %s" % output_datapath) arctic_prices = arcticFuturesContractPriceData() mongo_rollparameters = mongoRollParametersData() csv_roll_calendars = csvRollCalendarData(output_datapath) dict_of_all_futures_contract_prices = arctic_prices.get_all_prices_for_instrument( instrument_code) dict_of_futures_contract_prices = dict_of_all_futures_contract_prices.final_prices( ) roll_parameters_object = mongo_rollparameters.get_roll_parameters( instrument_code) # might take a few seconds print("Prepping roll calendar... might take a few seconds") roll_calendar = rollCalendar.create_from_prices( dict_of_futures_contract_prices, roll_parameters_object) # checks - this might fail roll_calendar.check_if_date_index_monotonic() # this should never fail roll_calendar.check_dates_are_valid_for_prices( dict_of_futures_contract_prices) # Write to csv # Will not work if an existing calendar exists if check_before_writing: check_happy_to_write = input( "Are you ok to write this csv to path %s? [might be worth writing and hacking manually] (yes/other)?" % csv_roll_calendars.datapath) else: check_happy_to_write = "yes" if check_happy_to_write == "yes": print("Adding roll calendar") csv_roll_calendars.add_roll_calendar(instrument_code, roll_calendar, ignore_duplication=True) else: print("Not writing") return roll_calendar
def build_and_write_roll_calendar( instrument_code, output_datapath=None, check_before_writing=True ): artic_prices = arcticFuturesContractPriceData() mongo_rollparameters = mongoRollParametersData() csv_roll_calendars = csvRollCalendarData(output_datapath) dict_of_all_futures_contract_prices = artic_prices.get_all_prices_for_instrument( instrument_code) dict_of_futures_contract_prices = dict_of_all_futures_contract_prices.final_prices() roll_parameters_object = mongo_rollparameters.get_roll_parameters( instrument_code) # might take a few seconds print("Prepping roll calendar... might take a few seconds") roll_calendar = rollCalendar.create_from_prices( dict_of_futures_contract_prices, roll_parameters_object ) # checks - this might fail check_monotonic = roll_calendar.check_if_date_index_monotonic() # this should never fail check_valid = roll_calendar.check_dates_are_valid_for_prices( dict_of_futures_contract_prices ) # Write to csv # Will not work if an existing calendar exists if check_before_writing: check_happy_to_write = input( "Are you ok to write this csv? [might be worth writing and hacking manually] (yes/other)?" ) else: check_happy_to_write = "yes" if check_happy_to_write == "yes": csv_roll_calendars.add_roll_calendar( roll_calendar, instrument_code, ignore_duplication=True ) else: print("Not writing") return roll_calendar
def process_multiple_prices_single_instrument( instrument_code, adjust_calendar_to_prices=True, csv_multiple_data_path=arg_not_supplied, csv_roll_data_path=arg_not_supplied, ADD_TO_ARCTIC=True, ADD_TO_CSV=False, ): ( csv_roll_calendars, arctic_individual_futures_prices, arctic_multiple_prices, csv_multiple_prices, ) = _get_data_inputs(csv_roll_data_path, csv_multiple_data_path) roll_calendar = csv_roll_calendars.get_roll_calendar(instrument_code) if adjust_calendar_to_prices: roll_calendar = adjust_roll_calendar(instrument_code, roll_calendar) dict_of_futures_contract_prices = ( arctic_individual_futures_prices.get_all_prices_for_instrument( instrument_code)) dict_of_futures_contract_closing_prices = ( dict_of_futures_contract_prices.final_prices()) m = mongoRollParametersData() roll_parameters = m.get_roll_parameters(instrument_code) roll_calendar = add_phantom_row(roll_calendar, dict_of_futures_contract_closing_prices, roll_parameters) multiple_prices = futuresMultiplePrices.create_from_raw_data( roll_calendar, dict_of_futures_contract_closing_prices) print(multiple_prices) if ADD_TO_ARCTIC: arctic_multiple_prices.add_multiple_prices(instrument_code, multiple_prices, ignore_duplication=True) if ADD_TO_CSV: csv_multiple_prices.add_multiple_prices(instrument_code, multiple_prices, ignore_duplication=True) return multiple_prices
def get_instrument_spec_from_mongo(instrument_code): mongo_instruments = mongoFuturesInstrumentData() mongo_roll_data = mongoRollParametersData() instrument_object = mongo_instruments.get_instrument_data(instrument_code) if instrument_object.empty(): raise Exception("Instrument %s missing from %s" % (instrument_code, mongo_instruments)) roll_parameters = mongo_roll_data.get_roll_parameters(instrument_code) if roll_parameters.empty(): raise Exception("Instrument %s missing from %s" % (instrument_code, mongo_roll_data)) return (instrument_object, roll_parameters)
from sysdata.sim.csv_futures_sim_data import csvFuturesSimData from sysobjects.roll_calendars import rollCalendar from sysdata.csv.csv_roll_calendars import csvRollCalendarData from sysdata.mongodb.mongo_roll_data import mongoRollParametersData """ Generate the roll calendars from existing data """ if __name__ == "__main__": csv_roll_calendars = csvRollCalendarData() sim_futures_data = csvFuturesSimData() mongo_rollparameters = mongoRollParametersData() instrument_list = sim_futures_data.get_instrument_list() for instrument_code in instrument_list: print(instrument_code) multiple_prices = sim_futures_data.get_all_multiple_prices( instrument_code) roll_parameters = mongo_rollparameters.get_roll_parameters( instrument_code) roll_calendar = rollCalendar.back_out_from_multiple_prices( multiple_prices) print("Calendar:") print(roll_calendar) # We ignore duplicates since this is run regularly csv_roll_calendars.add_roll_calendar(instrument_code, roll_calendar, ignore_duplication=True)
""" Populate a mongo DB collection with roll data from a csv """ from sysdata.mongodb.mongo_roll_data import mongoRollParametersData from sysinit.futures.rolldata_from_csv import initCsvFuturesRollData data_out = mongoRollParametersData() data_in = initCsvFuturesRollData() instrument_list = data_in.get_list_of_instruments() for instrument_code in instrument_list: instrument_object = data_in.get_roll_parameters(instrument_code) data_out.delete_roll_parameters(instrument_code, are_you_sure=True) data_out.add_roll_parameters(instrument_object, instrument_code) # check instrument_added = data_out.get_roll_parameters(instrument_code) print("Added %s: %s to %s" % (instrument_code, instrument_added, data_out))
from sysdata.csv.csv_sim_futures_data import csvFuturesSimData from sysdata.futures.roll_calendars import rollCalendar from sysdata.csv.csv_roll_calendars import csvRollCalendarData from sysdata.mongodb.mongo_roll_data import mongoRollParametersData """ Generate the roll calendars from existing data """ if __name__ == '__main__': csv_roll_calendars = csvRollCalendarData() sim_futures_data = csvFuturesSimData() mongo_rollparameters = mongoRollParametersData() instrument_list = sim_futures_data.get_instrument_list() for instrument_code in instrument_list: print(instrument_code) current_and_forward_data = sim_futures_data.get_current_and_forward_price_data(instrument_code) roll_parameters = mongo_rollparameters.get_roll_parameters(instrument_code) roll_calendar = rollCalendar.back_out_from_current_and_forward_data(current_and_forward_data, roll_parameters) print("Calendar:") print(roll_calendar) ## We ignore duplicates since this is run regularly csv_roll_calendars.add_roll_calendar(roll_calendar, instrument_code, ignore_duplication=True)
""" Populate a mongo DB collection with roll data from a csv """ from sysdata.mongodb.mongo_roll_data import mongoRollParametersData from sysinit.futures.csv_data_readers.rolldata_from_csv import initCsvFuturesRollData data_out = mongoRollParametersData() data_in = initCsvFuturesRollData() instrument_list = data_in.get_list_of_instruments() for instrument_code in instrument_list: instrument_object = data_in.get_roll_parameters(instrument_code) data_out.delete_roll_parameters(instrument_code, are_you_sure=True) data_out.add_roll_parameters(instrument_object, instrument_code) # check instrument_added = data_out.get_roll_parameters(instrument_code) print("Added %s: %s to %s" % (instrument_code, instrument_added, data_out))