def read_fx_prices(currency_code: str, tail_size: int = 20): """ Retrieve FX prices from a database, print last tail_size rows Will only work for codes in database, so won't do cross rate conversions to find a non existent rate :param currency_code: The currency code, for example 'GBPUSD' :param tail_size: The length of the tail to print :return: None, but print results """ log = logger() arcticfxdata = arcticFxPricesData(log=log.setup( component="arcticFxPricesData")) list_of_codes_all = arcticfxdata.get_list_of_fxcodes() try: assert currency_code in list_of_codes_all except: raise Exception("Currency code %s not in possible codes %s" % (currency_code, list_of_codes_all)) fx_prices = arcticfxdata.get_fx_prices(currency_code) print("/n Last %d FX rates for %s \n\n" % (tail_size, currency_code)) print(fx_prices.tail(tail_size))
def update_fx_prices(): """ Update FX prices stored in Arctic (Mongo) with interactive brokers prices (usually going back about a year) :return: Nothing """ mongo_db = mongoDb( ) # will use default database, host unles specified here log = logger("Update-FX-prices", mongo_db=mongo_db) ib_conn = connectionIB(log=log.setup( component="IB-connection")) # will use default port, host ibfxpricedata = ibFxPricesData(ib_conn, log=log.setup(component="ibFxPricesData")) arcticfxdata = arcticFxPricesData( mongo_db=mongo_db, log=log.setup(component="arcticFxPricesData")) list_of_codes_all = ibfxpricedata.get_list_of_fxcodes( ) # codes must be in .csv file /sysbrokers/IB/ibConfigSpotFx.csv log.msg("FX Codes: %s" % str(list_of_codes_all)) for fx_code in list_of_codes_all: log.label(currency_code=fx_code) new_fx_prices = ibfxpricedata.get_fx_prices( fx_code) # returns fxPrices object arcticfxdata.update_fx_prices(fx_code, new_fx_prices) ib_conn.disconnect()
def _get_fx_data_object(self): database_name = self._database_name host = self._host port = self._port fx_prices_data_object = arcticFxPricesData( mongoDb(database_name=database_name, host=host)) fx_prices_data_object.log = self.log return fx_prices_data_object
def update_fx_prices(): """ Update FX prices stored in Arctic (Mongo) with interactive brokers prices (usually going back about a year) :return: Nothing """ # avoid unique ids conn = connectionIB(client=100) ibfxpricedata = ibFxPricesData(conn) arcticfxdata = arcticFxPricesData() list_of_codes_all = ibfxpricedata.get_list_of_fxcodes( ) # codes must be in .csv file /sysbrokers/IB/ibConfigSpotFx.csv print(list_of_codes_all) for fx_code in list_of_codes_all: print(fx_code) new_fx_prices = ibfxpricedata.get_fx_prices( fx_code) # returns fxPrices object if len(new_fx_prices) == 0: print("couldn't get any more data") continue old_fx_prices = arcticfxdata.get_fx_prices(fx_code) new_fx_prices = new_fx_prices[ new_fx_prices.index > old_fx_prices.index[-1]] if len(new_fx_prices) == 0: print("No new data found") continue # merge old and new print("Old:") print(old_fx_prices.tail(2)) print("New:") print(new_fx_prices.head(2)) fx_prices = pd.concat([old_fx_prices, new_fx_prices], axis=0) fx_prices = fx_prices.sort_index() # remove duplicates fx_prices = fx_prices[~fx_prices.index.duplicated(keep='first')] print("Merged") print(fx_prices.tail(5)) # write arcticfxdata.add_fx_prices(fx_code, fx_prices, ignore_duplication=True)
def update_fx_prices(): """ Update FX prices stored in Arctic (Mongo) with interactive brokers prices (usually going back about a year) :return: Nothing """ log = logger("Update-FX-prices") ib_conn = connectionIB(log=log.setup( component="IB-connection")) # will use default port, host mongo_db = mongoDb( ) # will use default database, host unles specified here ibfxpricedata = ibFxPricesData(ib_conn, mongo_db=mongo_db, log=log.setup(component="ibFxPricesData")) arcticfxdata = arcticFxPricesData( mongo_db=mongo_db, log=log.setup(component="arcticFxPricesData")) list_of_codes_all = ibfxpricedata.get_list_of_fxcodes( ) # codes must be in .csv file /sysbrokers/IB/ibConfigSpotFx.csv log.msg("FX Codes: %s" % str(list_of_codes_all)) for fx_code in list_of_codes_all: log.label(currency_code=fx_code) new_fx_prices = ibfxpricedata.get_fx_prices( fx_code) # returns fxPrices object if len(new_fx_prices) == 0: log.error("Error trying to get data for %s" % fx_code) continue old_fx_prices = arcticfxdata.get_fx_prices(fx_code) new_fx_prices = new_fx_prices[ new_fx_prices.index > old_fx_prices.index[-1]] if len(new_fx_prices) == 0: log.msg("No additional data for %s" % fx_code) continue fx_prices = pd.concat([old_fx_prices, new_fx_prices], axis=0) fx_prices = fx_prices.sort_index() # remove duplicates fx_prices = fx_prices[~fx_prices.index.duplicated(keep='first')] # write arcticfxdata.add_fx_prices(fx_code, fx_prices, ignore_duplication=True)
def spotfx_from_csv_and_investing_dot_com(datapath, ADD_TO_ARCTIC=True, ADD_TO_CSV=True, ADD_EXTRA_DATA=True): # You can adapt this for different providers by changing these parameters if ADD_EXTRA_DATA: investingDotCom_csv_fx_prices = csvFxPricesData( datapath=datapath, config=investing_dot_com_config) if ADD_TO_ARCTIC: arctic_fx_prices = arcticFxPricesData() my_csv_fx_prices_data = csvFxPricesData() list_of_ccy_codes = my_csv_fx_prices_data.get_list_of_fxcodes() for currency_code in list_of_ccy_codes: print(currency_code) fx_prices_my_csv = my_csv_fx_prices_data.get_fx_prices(currency_code) fx_prices = investingDotCom_csv_fx_prices.get_fx_prices(currency_code) if ADD_EXTRA_DATA: fx_prices_investingDotCom = investingDotCom_csv_fx_prices.get_fx_prices( currency_code) print("%d rows for my csv files, %d rows for investing.com" % (len(fx_prices_my_csv), len(fx_prices_investingDotCom))) # Merge; last_date_in_my_csv = fx_prices_my_csv.index[-1] fx_prices_investingDotCom = fx_prices_investingDotCom[ last_date_in_my_csv:] fx_prices = pd.concat( [fx_prices_my_csv, fx_prices_investingDotCom]) fx_prices = fx_prices.loc[~fx_prices.index.duplicated( keep="first")] else: fx_prices = fx_prices_my_csv print("%d rows to write for %s" % (len(fx_prices), currency_code)) if ADD_TO_CSV: my_csv_fx_prices_data.add_fx_prices(currency_code, fx_prices, ignore_duplication=True) if ADD_TO_ARCTIC: arctic_fx_prices.add_fx_prices(currency_code, fx_prices, ignore_duplication=True)
def _get_fx_data_object(self): fx_prices_data_object = arcticFxPricesData(self.mongo_db) fx_prices_data_object.log = self.log return fx_prices_data_object
def _get_fx_data_object(self): fx_prices_data_object = arcticFxPricesData(self._database_name) fx_prices_data_object.log = self.log return fx_prices_data_object
ADD_TO_ARCTIC = True ADD_TO_CSV = True # You may need to change this! # There must be ONLY fx prices here, with filenames "GBPUSD.csv" etc INVESTING_DATA_PATH = "data.other_sources.investing_dot_com.spotfx" if __name__ == '__main__': # You can adapt this for different providers by changing these parameters investingDotCom_csv_fx_prices = csvFxPricesData( datapath=INVESTING_DATA_PATH, price_column="Price", date_column="Date", date_format="%b %d, %Y") if ADD_TO_ARCTIC: arctic_fx_prices = arcticFxPricesData() my_csv_fx_prices = csvFxPricesData() list_of_ccy_codes = investingDotCom_csv_fx_prices.get_list_of_fxcodes() for currency_code in list_of_ccy_codes: print(currency_code) fx_prices_investingDotCom = investingDotCom_csv_fx_prices.get_fx_prices( currency_code) fx_prices_my_csv = my_csv_fx_prices.get_fx_prices(currency_code) print("%d rows for my csv files, %d rows for investing.com" % (len(fx_prices_my_csv), len(fx_prices_investingDotCom))) # Merge; last_date_in_my_csv = fx_prices_my_csv.index[-1]
""" Get FX prices from Quandl and write to Arctic """ from sysdata.quandl.quandl_spotfx_prices import quandlFxPricesData from sysdata.arctic.arctic_spotfx_prices import arcticFxPricesData from sysdata.csv.csv_spot_fx import csvFxPricesData # could get these from stdin ADD_TO_ARCTIC = True ADD_TO_CSV = False if __name__ == '__main__': quandl_fx_prices = quandlFxPricesData() arctic_fx_prices = arcticFxPricesData() csv_fx_prices = csvFxPricesData() list_of_ccy_codes = quandl_fx_prices.get_list_of_fxcodes() for currency_code in list_of_ccy_codes: fx_prices = quandl_fx_prices.get_fx_prices(currency_code) print(fx_prices) if ADD_TO_CSV: csv_fx_prices.add_fx_prices(currency_code, fx_prices) if ADD_TO_ARCTIC: arctic_fx_prices.add_fx_prices(currency_code, fx_prices)
def _get_fx_data_object(self): fx_prices_data_object = arcticFxPricesData(self._database_name) fx_prices_data_object.log = self.log return fx_prices_data_object