diff --git a/README.md b/README.md index 798bd0f..a3b5d7c 100644 --- a/README.md +++ b/README.md @@ -68,10 +68,17 @@ For detailed installation instructions for chartpy, findatapy & finmarketpy and [https://github.com/cuemacro/finmarketpy/blob/master/INSTALL.md](https://github.com/cuemacro/finmarketpy/blob/master/INSTALL.md). The tutorial includes details on how to setup your entire Python environment. You can install the library using the below. After installation: -* Make sure you edit the dataconstants class for the correct Quandl API and Twitter API keys etc. +* Make sure you edit the dataconstants class for the correct Eikon API, Quandl API and Twitter API keys etc. * Or you can run set_api_keys.py script to set the API keys via storing in your keyring * Or you can create a datacred.py file which overwrites these keys +* Or some of these API keys can be passed via MarketDataRequest on demand +To install via pip (latest release): +``` +pip install findatapy +``` + +To install newest repo copy: ``` pip install git+https://github.com/cuemacro/findatapy.git ``` @@ -101,18 +108,22 @@ although it lacks some functionality of later Redis versions. # findatapy examples -In findatapy/examples you will find several demos +In findatapy/examples you will find several demos on how to download data from many different sources. Note, +for some such as Bloomberg or Eikon, you'll need to have a licence/subscription for it to work. # Release Notes +* 0.1.15 - findatapy (10 Sep 2020) * 0.1.14 - findatapy (25 Aug 2020) * 0.1.13 - findatapy (24 Aug 2020) * 0.1.12 - findatapy (06 May 2020) # Coding log +* 10 Sep 2020 + * Adding Eikon as a market data source * 25 Aug 2020 - * Fixes for newer Pandas + * Fixes for newer Pandas eg. 1.0.5 * Fixes for ALFRED downloading of economic data * 24 Aug 2020 * Removed .ix references (to work with newer Pandas) diff --git a/findatapy/conf/time_series_categories_fields.csv b/findatapy/conf/time_series_categories_fields.csv index 9dd8069..85b23ba 100644 --- a/findatapy/conf/time_series_categories_fields.csv +++ b/findatapy/conf/time_series_categories_fields.csv @@ -11,6 +11,9 @@ fx,bloomberg,daily,10AM,"close,open,high,low",1-Jan-07 fx-tot,bloomberg,daily,NYC,"close,open,high,low",1-Jan-70 fx,bloomberg,intraday,NYC,"close,open,high,low,volume,events",1-Jan-03 fx,bloomberg,intraday,BSTP,"close,open,high,low,volume,events",1-Jan-03 +fx,eikon,intraday,NYC,"close,open,high,low",1-Jan-03 +fx,eikon,daily,NYC,"close,open,high,low",1-Jan-03 +fx,eikon,tick,NYC,"bid,ask",1-Jan-03 events,bloomberg,daily,NYC,"close,actual-release,survey-median,survey-average,survey-high,survey-low,survey-high,number-observations,release-dt,release-date-time-full,first-revision,first-revision-date",1-Jan-99 fx-implied-vol,bloomberg,daily,NYC,close,1-Jan-95 fx-implied-vol,bloomberg,daily,BGN,close,1-Jan-95 @@ -20,18 +23,6 @@ fx-implied-vol,bloomberg,daily,10AM,close,1-Jan-09 base-depos,bloomberg,daily,NYC,close,1-Jan-95 base-depos,bloomberg,daily,TOK,close,1-Jan-95 base-depos,bloomberg,daily,LDN,close,1-Jan-95 -crypto,bitcoincharts,tick,LOC,"close,volume",1-Jan-15 -crypto,poloniex,intraday,LOC,"close,high,low,open,quote-volume,volume,weighted-average",1-Jan-15 -crypto,poloniex,daily,LOC,"close,high,low,open,quote-volume,volume,weighted-average",1-Jan-15 -crypto,binance,intraday,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",1-Jan-15 -crypto,binance,daily,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",1-Jan-15 -crypto,bitfinex,intraday,LOC,"open,close,high,low,volume",1-Jan-15 -crypto,bitfinex,daily,LOC,"open,close,high,low,volume",1-Jan-15 -crypto,gdax,intraday,LOC,"low,high,open,close,volume",1-Jan-15 -crypto,gdax,daily,LOC,"low,high,open,close,volume",1-Jan-15 -crypto,kraken,intraday,LOC,"close,volume,buy-sell,market-limit,miscellaneous",1-Jan-15 -crypto,huobi,tick,LOC,"amount,close,count,high,low,open,volume",1-Jan-15 -crypto,huobi,daily,LOC,"amount,close,count,high,low,open,volume",1-Jan-15 ,,,,, ,,,,, ,,,,, diff --git a/findatapy/conf/time_series_fields_list.csv b/findatapy/conf/time_series_fields_list.csv index 0e63208..92e7000 100644 --- a/findatapy/conf/time_series_fields_list.csv +++ b/findatapy/conf/time_series_fields_list.csv @@ -47,46 +47,6 @@ alfred,actual-release,actual-release alfred,close,close alfred,release-date-time-full,release-date-time-full alfred,first-revision,first-revision -bitcoincharts,close,close -bitcoincharts,volume,volume -poloniex,close,close -poloniex,high,high -poloniex,low,low -poloniex,open,open -poloniex,quote-volume,quote-volume -poloniex,volume,volume -poloniex,weighted-average,weighted-average -binance,open,open -binance,high,high -binance,low,low -binance,close,close -binance,volume,volume -binance,quote-asset-volume,quote-asset-volume -binance,trade-numbers,trade-numbers -binance,taker-buy-base-asset-volume,taker-buy-base-asset-volume -binance,taker-buy-quote-asset-volume,taker-buy-quote-asset-volume -bitfinex,open,open -bitfinex,close,close -bitfinex,high,high -bitfinex,low,low -bitfinex,volume,volume -gdax,low,low -gdax,high,high -gdax,open,open -gdax,close,close -gdax,volume,volume -kraken,close,close -kraken,volume,volume -kraken,buy-sell,buy-sell -kraken,market-limit,market-limit -kraken,miscellaneous,miscellaneous -huobi,amount,amount -huobi,close,close -huobi,count,count -huobi,high,high -huobi,low,low -huobi,open,open -huobi,volume,vol bloomberg,contract-value,CONTRACT_VALUE bloomberg,last-tradeable-day,LAST_TRADEABLE_DT bloomberg,current-futures-ticker,FUT_CUR_GEN_TICKER @@ -96,3 +56,11 @@ bloomberg,open-interest,OPEN_INT bloomberg,first-notice-date,FUT_NOTICE_FIRST bloomberg,first-tradeable-day,FUT_FIRST_TRADE_DT bloomberg,cal-non-settle-dates,CALENDAR_NON_SETTLEMENT_DATES +eikon,high,HIGH +eikon,close,CLOSE +eikon,low,LOW +eikon,open,OPEN +eikon,count,COUNT +eikon,volume,VOLUME +eikon,bid,BID +eikon,ask,ASK diff --git a/findatapy/conf/time_series_tickers_list.csv b/findatapy/conf/time_series_tickers_list.csv index 17b49ec..ba02169 100644 --- a/findatapy/conf/time_series_tickers_list.csv +++ b/findatapy/conf/time_series_tickers_list.csv @@ -8,6 +8,33 @@ fx,quandl,daily,USDCHF,NYC,close,FRED/DEXSZUS,5:00pm NYC,,, fx,quandl,daily,USDNOK,NYC,close,FRED/DEXNOUS,5:00pm NYC,,, fx,quandl,daily,USDSEK,NYC,close,FRED/DEXSDUS,5:00pm NYC,,, fx,quandl,daily,USDJPY,NYC,close,FRED/DEXJPUS,5:00pm NYC,,, +fx,eikon,daily,EURUSD,NYC,"close,open,high,low",EUR=,5:00pm NYC,,, +fx,eikon,daily,GBPUSD,NYC,"close,open,high,low",GBP=,5:00pm NYC,,, +fx,eikon,daily,AUDUSD,NYC,"close,open,high,low",AUD=,5:00pm NYC,,, +fx,eikon,daily,NZDUSD,NYC,"close,open,high,low",NZD=,5:00pm NYC,,, +fx,eikon,daily,USDCAD,NYC,"close,open,high,low",CAD=,5:00pm NYC,,, +fx,eikon,daily,USDCHF,NYC,"close,open,high,low",CHF=,5:00pm NYC,,, +fx,eikon,daily,USDNOK,NYC,"close,open,high,low",NOK=,5:00pm NYC,,, +fx,eikon,daily,USDSEK,NYC,"close,open,high,low",SEK=,5:00pm NYC,,, +fx,eikon,daily,USDJPY,NYC,"close,open,high,low",JPY=,5:00pm NYC,,, +fx,eikon,intraday,EURUSD,NYC,"close,open,high,low",EUR=,5:00pm NYC,,, +fx,eikon,intraday,GBPUSD,NYC,"close,open,high,low",GBP=,5:00pm NYC,,, +fx,eikon,intraday,AUDUSD,NYC,"close,open,high,low",AUD=,5:00pm NYC,,, +fx,eikon,intraday,NZDUSD,NYC,"close,open,high,low",NZD=,5:00pm NYC,,, +fx,eikon,intraday,USDCAD,NYC,"close,open,high,low",CAD=,5:00pm NYC,,, +fx,eikon,intraday,USDCHF,NYC,"close,open,high,low",CHF=,5:00pm NYC,,, +fx,eikon,intraday,USDNOK,NYC,"close,open,high,low",NOK=,5:00pm NYC,,, +fx,eikon,intraday,USDSEK,NYC,"close,open,high,low",SEK=,5:00pm NYC,,, +fx,eikon,intraday,USDJPY,NYC,"close,open,high,low",JPY=,5:00pm NYC,,, +fx,eikon,tick,EURUSD,NYC,"bid,ask",EUR=,5:00pm NYC,,, +fx,eikon,tick,GBPUSD,NYC,"bid,ask",GBP=,5:00pm NYC,,, +fx,eikon,tick,AUDUSD,NYC,"bid,ask",AUD=,5:00pm NYC,,, +fx,eikon,tick,NZDUSD,NYC,"bid,ask",NZD=,5:00pm NYC,,, +fx,eikon,tick,USDCAD,NYC,"bid,ask",CAD=,5:00pm NYC,,, +fx,eikon,tick,USDCHF,NYC,"bid,ask",CHF=,5:00pm NYC,,, +fx,eikon,tick,USDNOK,NYC,"bid,ask",NOK=,5:00pm NYC,,, +fx,eikon,tick,USDSEK,NYC,"bid,ask",SEK=,5:00pm NYC,,, +fx,eikon,tick,USDJPY,NYC,"bid,ask",JPY=,5:00pm NYC,,, fx,dukascopy,tick,EURUSD,NYC,"bid,ask,bidv,askv,volume",EURUSD,5:00pm NYC,,, fx,dukascopy,tick,GBPUSD,NYC,"bid,ask,bidv,askv,volume",GBPUSD,5:00pm NYC,,, fx,dukascopy,tick,AUDUSD,NYC,"bid,ask,bidv,askv,volume",AUDUSD,5:00pm NYC,,, @@ -290,265 +317,592 @@ events,bloomberg,daily,USD-US CPI Urban Consumers MoM SA,NYC,"close,actual-relea events,bloomberg,daily,USD-Conference Board Consumer Confidence SA 1985=100,NYC,"close,actual-release,survey-median,survey-average,survey-high,survey-low,number-observations,release-dt,release-date-time-full,first-revision,first-revision-date",CONCCONF Index,,,, events,bloomberg,daily,USD-US Durable Goods New Orders Industries MoM SA,NYC,"close,actual-release,survey-median,survey-average,survey-high,survey-low,number-observations,release-dt,release-date-time-full,first-revision,first-revision-date",DGNOCHNG Index,,,, events,bloomberg,daily,USD-US Industrial Production MoM 2007=100 SA,NYC,"close,actual-release,survey-median,survey-average,survey-high,survey-low,number-observations,release-dt,release-date-time-full,first-revision,first-revision-date",IP CHNG Index,,,, -crypto,bitcoincharts,tick,XBTPLN_abucoins,LOC,"close,volume",abucoinsPLN,LOC, -crypto,bitcoincharts,tick,XBTEUR_bc,LOC,"close,volume",bcEUR,LOC, -crypto,bitcoincharts,tick,XBTILS_bit2c,LOC,"close,volume",bit2cILS,LOC, -crypto,bitcoincharts,tick,XBTPLN_bitbay,LOC,"close,volume",bitbayPLN,LOC, -crypto,bitcoincharts,tick,XBTUSD_bitbay,LOC,"close,volume",bitbayUSD,LOC, -crypto,bitcoincharts,tick,XBTJPY_bitflyer,LOC,"close,volume",bitflyerJPY,LOC, -crypto,bitcoincharts,tick,XBTPLN_bitmarket,LOC,"close,volume",bitmarketPLN,LOC, -crypto,bitcoincharts,tick,XBTUSD_bitstamp,LOC,"close,volume",bitstampUSD,LOC, -crypto,bitcoincharts,tick,XBTIDR_bitx,LOC,"close,volume",bitxIDR,LOC, -crypto,bitcoincharts,tick,XBTMYR_bitx,LOC,"close,volume",bitxMYR,LOC, -crypto,bitcoincharts,tick,XBTNGN_bitx,LOC,"close,volume",bitxNGN,LOC, -crypto,bitcoincharts,tick,XBTZAR_bitx,LOC,"close,volume",bitxZAR,LOC, -crypto,bitcoincharts,tick,XBTUSD_btcalpha,LOC,"close,volume",btcalphaUSD,LOC, -crypto,bitcoincharts,tick,XBTJPY_btcbox,LOC,"close,volume",btcboxJPY,LOC, -crypto,bitcoincharts,tick,XBTEUR_btcde,LOC,"close,volume",btcdeEUR,LOC, -crypto,bitcoincharts,tick,XBTAUD_btcmarkets,LOC,"close,volume",btcmarketsAUD,LOC, -crypto,bitcoincharts,tick,XBTIDR_btcoid,LOC,"close,volume",btcoidIDR,LOC, -crypto,bitcoincharts,tick,XBTEUR_cex,LOC,"close,volume",cexEUR,LOC, -crypto,bitcoincharts,tick,XBTUSD_cex,LOC,"close,volume",cexUSD,LOC, -crypto,bitcoincharts,tick,XBTEUR_coinbase,LOC,"close,volume",coinbaseEUR,LOC, -crypto,bitcoincharts,tick,XBTGBP_coinbase,LOC,"close,volume",coinbaseGBP,LOC, -crypto,bitcoincharts,tick,XBTUSD_coinbase,LOC,"close,volume",coinbaseUSD,LOC, -crypto,bitcoincharts,tick,XBTJPY_coincheck,LOC,"close,volume",coincheckJPY,LOC, -crypto,bitcoincharts,tick,XBTEUR_coinfalcon,LOC,"close,volume",coinfalconEUR,LOC, -crypto,bitcoincharts,tick,XBTGBP_coinfloor,LOC,"close,volume",coinfloorGBP,LOC, -crypto,bitcoincharts,tick,XBTRUB_coinsbank,LOC,"close,volume",coinsbankRUB,LOC, -crypto,bitcoincharts,tick,XBTUSD_coinsbank,LOC,"close,volume",coinsbankUSD,LOC, -crypto,bitcoincharts,tick,XBTJPY_fisco,LOC,"close,volume",fiscoJPY,LOC, -crypto,bitcoincharts,tick,XBTBRL_foxbit,LOC,"close,volume",foxbitBRL,LOC, -crypto,bitcoincharts,tick,XBTUSD_getbtc,LOC,"close,volume",getbtcUSD,LOC, -crypto,bitcoincharts,tick,XBTEUR_itbit,LOC,"close,volume",itbitEUR,LOC, -crypto,bitcoincharts,tick,XBTSGD_itbit,LOC,"close,volume",itbitSGD,LOC, -crypto,bitcoincharts,tick,XBTUSD_itbit,LOC,"close,volume",itbitUSD,LOC, -crypto,bitcoincharts,tick,XBTKRW_korbit,LOC,"close,volume",korbitKRW,LOC, -crypto,bitcoincharts,tick,XBTCAD_kraken,LOC,"close,volume",krakenCAD,LOC, -crypto,bitcoincharts,tick,XBTEUR_kraken,LOC,"close,volume",krakenEUR,LOC, -crypto,bitcoincharts,tick,XBTJPY_kraken,LOC,"close,volume",krakenJPY,LOC, -crypto,bitcoincharts,tick,XBTUSD_kraken,LOC,"close,volume",krakenUSD,LOC, -crypto,bitcoincharts,tick,XBTUSD_lake,LOC,"close,volume",lakeUSD,LOC, -crypto,bitcoincharts,tick,XBTAUD_localbtc,LOC,"close,volume",localbtcAUD,LOC, -crypto,bitcoincharts,tick,XBTCAD_localbtc,LOC,"close,volume",localbtcCAD,LOC, -crypto,bitcoincharts,tick,XBTEUR_localbtc,LOC,"close,volume",localbtcEUR,LOC, -crypto,bitcoincharts,tick,XBTGBP_localbtc,LOC,"close,volume",localbtcGBP,LOC, -crypto,bitcoincharts,tick,XBTRUB_localbtc,LOC,"close,volume",localbtcRUB,LOC, -crypto,bitcoincharts,tick,XBTSEK_localbtc,LOC,"close,volume",localbtcSEK,LOC, -crypto,bitcoincharts,tick,XBTUSD_localbtc,LOC,"close,volume",localbtcUSD,LOC, -crypto,bitcoincharts,tick,XBTVEF_localbtc,LOC,"close,volume",localbtcVEF,LOC, -crypto,bitcoincharts,tick,XBTZAR_localbtc,LOC,"close,volume",localbtcZAR,LOC, -crypto,bitcoincharts,tick,XBTBRL_mrcd,LOC,"close,volume",mrcdBRL,LOC, -crypto,bitcoincharts,tick,XBTUSD_okcoin,LOC,"close,volume",okcoinUSD,LOC, -crypto,bitcoincharts,tick,XBTVEF_surbtc,LOC,"close,volume",surbtcVEF,LOC, -crypto,bitcoincharts,tick,XBTPKR_urdubit,LOC,"close,volume",urdubitPKR,LOC, -crypto,bitcoincharts,tick,XBTSLL_virwox,LOC,"close,volume",virwoxSLL,LOC, -crypto,bitcoincharts,tick,XBTEUR_wex,LOC,"close,volume",wexEUR,LOC, -crypto,bitcoincharts,tick,XBTRUB_wex,LOC,"close,volume",wexRUB,LOC, -crypto,bitcoincharts,tick,XBTUSD_wex,LOC,"close,volume",wexUSD,LOC, -crypto,bitcoincharts,tick,XBTJPY_zaif,LOC,"close,volume",zaifJPY,LOC, -crypto,bitcoincharts,tick,XBTEUR_zyado,LOC,"close,volume",zyadoEUR,LOC, -crypto,poloniex,"intraday,daily",XBTUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_BTC,LOC, -crypto,poloniex,"intraday,daily",XRPXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_XRP,LOC, -crypto,poloniex,"intraday,daily",XETXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_ETH,LOC, -crypto,poloniex,"intraday,daily",XRPUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_XRP,LOC, -crypto,poloniex,"intraday,daily",XETUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_ETH,LOC, -crypto,poloniex,"intraday,daily",STRXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_STR,LOC, -crypto,poloniex,"intraday,daily",BCHXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_BCH,LOC, -crypto,poloniex,"intraday,daily",XMRXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_XMR,LOC, -crypto,poloniex,"intraday,daily",BCHUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_BCH,LOC, -crypto,poloniex,"intraday,daily",STRUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_STR,LOC, -crypto,poloniex,"intraday,daily",NXTUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_NXT,LOC, -crypto,poloniex,"intraday,daily",XEMXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_XEM,LOC, -crypto,poloniex,"intraday,daily",NXTXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_NXT,LOC, -crypto,poloniex,"intraday,daily",XLCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_LTC,LOC, -crypto,poloniex,"intraday,daily",LSKXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_LSK,LOC, -crypto,poloniex,"intraday,daily",ETCUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_ETC,LOC, -crypto,poloniex,"intraday,daily",ETCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_ETC,LOC, -crypto,poloniex,"intraday,daily",DASHXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_DASH,LOC, -crypto,poloniex,"intraday,daily",MAIDXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_MAID,LOC, -crypto,poloniex,"intraday,daily",SCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_SC,LOC, -crypto,poloniex,"intraday,daily",BTSXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_BTS,LOC, -crypto,poloniex,"intraday,daily",STRATXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_STRAT,LOC, -crypto,poloniex,"intraday,daily",XLCUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_LTC,LOC, -crypto,poloniex,"intraday,daily",XCPXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_XCP,LOC, -crypto,poloniex,"intraday,daily",XMRUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_XMR,LOC, -crypto,poloniex,"intraday,daily",DOGEXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_DOGE,LOC, -crypto,poloniex,"intraday,daily",DGBXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_DGB,LOC, -crypto,poloniex,"intraday,daily",ZRXXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_ZRX,LOC, -crypto,poloniex,"intraday,daily",SYSXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_SYS,LOC, -crypto,poloniex,"intraday,daily",OMGXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_OMG,LOC, -crypto,poloniex,"intraday,daily",ZECXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_ZEC,LOC, -crypto,poloniex,"intraday,daily",REPXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_REP,LOC, -crypto,poloniex,"intraday,daily",DASHUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_DASH,LOC, -crypto,poloniex,"intraday,daily",FCTXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_FCT,LOC, -crypto,poloniex,"intraday,daily",STEEMXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_STEEM,LOC, -crypto,poloniex,"intraday,daily",BCNXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_BCN,LOC, -crypto,poloniex,"intraday,daily",REPUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_REP,LOC, -crypto,poloniex,"intraday,daily",ZECUSDT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",USDT_ZEC,LOC, -crypto,poloniex,"intraday,daily",BLKXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_BLK,LOC, -crypto,poloniex,"intraday,daily",GNTXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_GNT,LOC, -crypto,poloniex,"intraday,daily",EMC2XBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_EMC2,LOC, -crypto,poloniex,"intraday,daily",VRCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_VRC,LOC, -crypto,poloniex,"intraday,daily",ARDRXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_ARDR,LOC, -crypto,poloniex,"intraday,daily",GAMEXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_GAME,LOC, -crypto,poloniex,"intraday,daily",PASCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_PASC,LOC, -crypto,poloniex,"intraday,daily",STORJXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_STORJ,LOC, -crypto,poloniex,"intraday,daily",VTCXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_VTC,LOC, -crypto,poloniex,"intraday,daily",DCRXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_DCR,LOC, -crypto,poloniex,"intraday,daily",BURSTXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_BURST,LOC, -crypto,poloniex,"intraday,daily",GASXBT,LOC,"close,high,low,open,quote-volume,volume,weighted-average",BTC_GAS,LOC, -crypto,binance,"intraday,daily",XBTUSDT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BTCUSDT,LOC, -crypto,binance,"intraday,daily",XETXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ETHBTC,LOC, -crypto,binance,"intraday,daily",XETUSDT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ETHUSDT,LOC, -crypto,binance,"intraday,daily",TRXXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TRXBTC,LOC, -crypto,binance,"intraday,daily",IOSTXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",IOSTBTC,LOC, -crypto,binance,"intraday,daily",TRXXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TRXETH,LOC, -crypto,binance,"intraday,daily",VENXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",VENBTC,LOC, -crypto,binance,"intraday,daily",WTCXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",WTCBTC,LOC, -crypto,binance,"intraday,daily",TNTXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TNTBTC,LOC, -crypto,binance,"intraday,daily",CNDXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",CNDBTC,LOC, -crypto,binance,"intraday,daily",XRPXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",XRPBTC,LOC, -crypto,binance,"intraday,daily",ELFXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ELFBTC,LOC, -crypto,binance,"intraday,daily",XLMXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",XLMBTC,LOC, -crypto,binance,"intraday,daily",ICXXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ICXBTC,LOC, -crypto,binance,"intraday,daily",TNBXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TNBBTC,LOC, -crypto,binance,"intraday,daily",EOSXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",EOSBTC,LOC, -crypto,binance,"intraday,daily",NEOUSDT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",NEOUSDT,LOC, -crypto,binance,"intraday,daily",NEOXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",NEOBTC,LOC, -crypto,binance,"intraday,daily",EOSXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",EOSETH,LOC, -crypto,binance,"intraday,daily",BNBXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BNBBTC,LOC, -crypto,binance,"intraday,daily",BNBUSDT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BNBUSDT,LOC, -crypto,binance,"intraday,daily",VENXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",VENETH,LOC, -crypto,binance,"intraday,daily",ADAXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ADABTC,LOC, -crypto,binance,"intraday,daily",XRPXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",XRPETH,LOC, -crypto,binance,"intraday,daily",ICXXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ICXETH,LOC, -crypto,binance,"intraday,daily",IOSTXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",IOSTETH,LOC, -crypto,binance,"intraday,daily",POEXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",POEBTC,LOC, -crypto,binance,"intraday,daily",XLMXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",XLMETH,LOC, -crypto,binance,"intraday,daily",PIVXXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",PIVXBTC,LOC, -crypto,binance,"intraday,daily",HSRXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",HSRBTC,LOC, -crypto,binance,"intraday,daily",NEOXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",NEOETH,LOC, -crypto,binance,"intraday,daily",XVGXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",XVGBTC,LOC, -crypto,binance,"intraday,daily",CNDXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",CNDETH,LOC, -crypto,binance,"intraday,daily",TNTXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TNTETH,LOC, -crypto,binance,"intraday,daily",XLCXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",LTCBTC,LOC, -crypto,binance,"intraday,daily",LENDXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",LENDBTC,LOC, -crypto,binance,"intraday,daily",AMBXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",AMBBTC,LOC, -crypto,binance,"intraday,daily",TNBXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",TNBETH,LOC, -crypto,binance,"intraday,daily",ELFXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ELFETH,LOC, -crypto,binance,"intraday,daily",CDTXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",CDTBTC,LOC, -crypto,binance,"intraday,daily",NEBLXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",NEBLBTC,LOC, -crypto,binance,"intraday,daily",BCCXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BCCBTC,LOC, -crypto,binance,"intraday,daily",BCDXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BCDBTC,LOC, -crypto,binance,"intraday,daily",MANAXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",MANABTC,LOC, -crypto,binance,"intraday,daily",ADAXET,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ADAETH,LOC, -crypto,binance,"intraday,daily",VIBEXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",VIBEBTC,LOC, -crypto,binance,"intraday,daily",BATXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",BATBTC,LOC, -crypto,binance,"intraday,daily",GTOXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",GTOBTC,LOC, -crypto,binance,"intraday,daily",ENJXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",ENJBTC,LOC, -crypto,binance,"intraday,daily",IOTAXBT,LOC,"open,high,low,close,volume,quote-asset-volume,trade-numbers,taker-buy-base-asset-volume,taker-buy-quote-asset-volume",IOTABTC,LOC, -crypto,bitfinex,"intraday,daily",XBTUSD,LOC,"open,close,high,low,volume",BTCUSD,LOC, -crypto,bitfinex,"intraday,daily",XETUSD,LOC,"open,close,high,low,volume",ETHUSD,LOC, -crypto,bitfinex,"intraday,daily",XRPUSD,LOC,"open,close,high,low,volume",XRPUSD,LOC, -crypto,bitfinex,"intraday,daily",EOSUSD,LOC,"open,close,high,low,volume",EOSUSD,LOC, -crypto,bitfinex,"intraday,daily",XETXBT,LOC,"open,close,high,low,volume",ETHBTC,LOC, -crypto,bitfinex,"intraday,daily",USDTUSD,LOC,"open,close,high,low,volume",USDTUSD,LOC, -crypto,bitfinex,"intraday,daily",BTCEUR,LOC,"open,close,high,low,volume",BTCEUR,LOC, -crypto,bitfinex,"intraday,daily",NEOUSD,LOC,"open,close,high,low,volume",NEOUSD,LOC, -crypto,bitfinex,"intraday,daily",MIOTAUSD,LOC,"open,close,high,low,volume",MIOTAUSD,LOC, -crypto,bitfinex,"intraday,daily",XLCUSD,LOC,"open,close,high,low,volume",LTCUSD,LOC, -crypto,bitfinex,"intraday,daily",BCHUSD,LOC,"open,close,high,low,volume",BCHUSD,LOC, -crypto,bitfinex,"intraday,daily",BCHXBT,LOC,"open,close,high,low,volume",BCHBTC,LOC, -crypto,bitfinex,"intraday,daily",EOSXBT,LOC,"open,close,high,low,volume",EOSBTC,LOC, -crypto,bitfinex,"intraday,daily",OMGUSD,LOC,"open,close,high,low,volume",OMGUSD,LOC, -crypto,bitfinex,"intraday,daily",EOSXET,LOC,"open,close,high,low,volume",EOSETH,LOC, -crypto,bitfinex,"intraday,daily",ETCUSD,LOC,"open,close,high,low,volume",ETCUSD,LOC, -crypto,bitfinex,"intraday,daily",MIOTAXBT,LOC,"open,close,high,low,volume",MIOTABTC,LOC, -crypto,bitfinex,"intraday,daily",XRPXBT,LOC,"open,close,high,low,volume",XRPBTC,LOC, -crypto,bitfinex,"intraday,daily",DASHUSD,LOC,"open,close,high,low,volume",DASHUSD,LOC, -crypto,bitfinex,"intraday,daily",XLCXBT,LOC,"open,close,high,low,volume",LTCBTC,LOC, -crypto,bitfinex,"intraday,daily",NEOXBT,LOC,"open,close,high,low,volume",NEOBTC,LOC, -crypto,bitfinex,"intraday,daily",ELFUSD,LOC,"open,close,high,low,volume",ELFUSD,LOC, -crypto,bitfinex,"intraday,daily",XMRUSD,LOC,"open,close,high,low,volume",XMRUSD,LOC, -crypto,bitfinex,"intraday,daily",ELFXBT,LOC,"open,close,high,low,volume",ELFBTC,LOC, -crypto,bitfinex,"intraday,daily",OMGXBT,LOC,"open,close,high,low,volume",OMGBTC,LOC, -crypto,bitfinex,"intraday,daily",TRXUSD,LOC,"open,close,high,low,volume",TRXUSD,LOC, -crypto,bitfinex,"intraday,daily",ZECUSD,LOC,"open,close,high,low,volume",ZECUSD,LOC, -crypto,bitfinex,"intraday,daily",DASHXBT,LOC,"open,close,high,low,volume",DASHBTC,LOC, -crypto,bitfinex,"intraday,daily",ETCXBT,LOC,"open,close,high,low,volume",ETCBTC,LOC, -crypto,bitfinex,"intraday,daily",ZECXBT,LOC,"open,close,high,low,volume",ZECBTC,LOC, -crypto,bitfinex,"intraday,daily",XMRXBT,LOC,"open,close,high,low,volume",XMRBTC,LOC, -crypto,bitfinex,"intraday,daily",ELFXET,LOC,"open,close,high,low,volume",ELFETH,LOC, -crypto,bitfinex,"intraday,daily",MIOTAXET,LOC,"open,close,high,low,volume",MIOTAETH,LOC, -crypto,bitfinex,"intraday,daily",TRXXBT,LOC,"open,close,high,low,volume",TRXBTC,LOC, -crypto,bitfinex,"intraday,daily",BTGUSD,LOC,"open,close,high,low,volume",BTGUSD,LOC, -crypto,bitfinex,"intraday,daily",GNTUSD,LOC,"open,close,high,low,volume",GNTUSD,LOC, -crypto,bitfinex,"intraday,daily",TNBUSD,LOC,"open,close,high,low,volume",TNBUSD,LOC, -crypto,bitfinex,"intraday,daily",BTGXBT,LOC,"open,close,high,low,volume",BTGBTC,LOC, -crypto,bitfinex,"intraday,daily",MIOTAEUR,LOC,"open,close,high,low,volume",MIOTAEUR,LOC, -crypto,bitfinex,"intraday,daily",AIDUSD,LOC,"open,close,high,low,volume",AIDUSD,LOC, -crypto,bitfinex,"intraday,daily",NEOXET,LOC,"open,close,high,low,volume",NEOETH,LOC, -crypto,bitfinex,"intraday,daily",SANUSD,LOC,"open,close,high,low,volume",SANUSD,LOC, -crypto,bitfinex,"intraday,daily",QTUMUSD,LOC,"open,close,high,low,volume",QTUMUSD,LOC, -crypto,bitfinex,"intraday,daily",EDOUSD,LOC,"open,close,high,low,volume",EDOUSD,LOC, -crypto,bitfinex,"intraday,daily",SNTUSD,LOC,"open,close,high,low,volume",SNTUSD,LOC, -crypto,bitfinex,"intraday,daily",QSHUSD,LOC,"open,close,high,low,volume",QSHUSD,LOC, -crypto,bitfinex,"intraday,daily",GNTXBT,LOC,"open,close,high,low,volume",GNTBTC,LOC, -crypto,bitfinex,"intraday,daily",BCHXET,LOC,"open,close,high,low,volume",BCHETH,LOC, -crypto,bitfinex,"intraday,daily",SNGUSD,LOC,"open,close,high,low,volume",SNGUSD,LOC, -crypto,bitfinex,"intraday,daily",ZRXUSD,LOC,"open,close,high,low,volume",ZRXUSD,LOC, -crypto,gdax,"intraday,daily",XBTUSD,LOC,"low,high,open,close,volume",BTC-USD,LOC, -crypto,gdax,"intraday,daily",XETUSD,LOC,"low,high,open,close,volume",ETH-USD,LOC, -crypto,gdax,"intraday,daily",XLCUSD,LOC,"low,high,open,close,volume",LTC-USD,LOC, -crypto,gdax,"intraday,daily",XBTEUR,LOC,"low,high,open,close,volume",BTC-EUR,LOC, -crypto,gdax,"intraday,daily",XETXBT,LOC,"low,high,open,close,volume",ETH-BTC,LOC, -crypto,gdax,"intraday,daily",XBTGBP,LOC,"low,high,open,close,volume",BTC-GBP,LOC, -crypto,gdax,"intraday,daily",XLCXBT,LOC,"low,high,open,close,volume",LTC-BTC,LOC, -crypto,kraken,tick,XBTEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XBTEUR,LOC, -crypto,kraken,tick,XETEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETHEUR,LOC, -crypto,kraken,tick,XETUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETHUSD,LOC, -crypto,kraken,tick,XBTUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XBTUSD,LOC, -crypto,kraken,tick,XETXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETHXBT,LOC, -crypto,kraken,tick,XRPEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XRPEUR,LOC, -crypto,kraken,tick,XRPUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XRPUSD,LOC, -crypto,kraken,tick,XRPXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XRPXBT,LOC, -crypto,kraken,tick,XLMXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XLMXBT,LOC, -crypto,kraken,tick,EOSXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",EOSXBT,LOC, -crypto,kraken,tick,USDTUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",USDTUSD,LOC, -crypto,kraken,tick,BCHEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",BCHEUR,LOC, -crypto,kraken,tick,XLCEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",LTCEUR,LOC, -crypto,kraken,tick,ETCXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETCXBT,LOC, -crypto,kraken,tick,EOSXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",EOSETH,LOC, -crypto,kraken,tick,ETCEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETCEUR,LOC, -crypto,kraken,tick,BCHXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",BCHXBT,LOC, -crypto,kraken,tick,BCHUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",BCHUSD,LOC, -crypto,kraken,tick,XLCXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",LTCXBT,LOC, -crypto,kraken,tick,XLCUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",LTCUSD,LOC, -crypto,kraken,tick,ETCUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETCUSD,LOC, -crypto,kraken,tick,XMREUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XMREUR,LOC, -crypto,kraken,tick,ICNXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ICNXBT,LOC, -crypto,kraken,tick,DASHEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",DASHEUR,LOC, -crypto,kraken,tick,ETCXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETCETH,LOC, -crypto,kraken,tick,XMRUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XMRUSD,LOC, -crypto,kraken,tick,XMRXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XMRXBT,LOC, -crypto,kraken,tick,DASHXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",DASHXBT,LOC, -crypto,kraken,tick,REPEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",REPEUR,LOC, -crypto,kraken,tick,ZECEUR,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ZECEUR,LOC, -crypto,kraken,tick,ICNXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ICNETH,LOC, -crypto,kraken,tick,DASHUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",DASHUSD,LOC, -crypto,kraken,tick,XBTCAD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XBTCAD,LOC, -crypto,kraken,tick,ZECXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ZECXBT,LOC, -crypto,kraken,tick,REPXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",REPETH,LOC, -crypto,kraken,tick,XETCAD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETHCAD,LOC, -crypto,kraken,tick,GNOXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",GNOETH,LOC, -crypto,kraken,tick,GNOXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",GNOXBT,LOC, -crypto,kraken,tick,REPXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",REPXBT,LOC, -crypto,kraken,tick,ZECUSD,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ZECUSD,LOC, -crypto,kraken,tick,MLNXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",MLNXBT,LOC, -crypto,kraken,tick,DOGEXBT,LOC,"close,volume,buy-sell,market-limit,miscellaneous",DOGEXBT,LOC, -crypto,kraken,tick,XBTJPY,LOC,"close,volume,buy-sell,market-limit,miscellaneous",XBTJPY,LOC, -crypto,kraken,tick,MLNXET,LOC,"close,volume,buy-sell,market-limit,miscellaneous",MLNETH,LOC, -crypto,kraken,tick,XETJPY,LOC,"close,volume,buy-sell,market-limit,miscellaneous",ETHJPY,LOC, -crypto,huobi,daily,XBTUSD,LOC,"amount,close,count,high,low,open,volume",btcusdt,LOC, -crypto,huobi,tick,XBTUSD,LOC,"amount,close,count,high,low,open,volume",btcusdt,LOC, \ No newline at end of file +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, +,,,,,,,,,, diff --git a/findatapy/market/datavendorweb.py b/findatapy/market/datavendorweb.py index 6998589..a0603b5 100644 --- a/findatapy/market/datavendorweb.py +++ b/findatapy/market/datavendorweb.py @@ -134,6 +134,120 @@ def download_daily(self, market_data_request): return data_frame + +####################################################################################################################### + +# support Eikon +try: + import asyncio + asyncio.set_event_loop(asyncio.SelectorEventLoop()) + import eikon as ek +except: + logger = LoggerManager().getLogger(__name__) + logger.info("Did not load Eikon library") + + +#ek.set_port_number(9400) +#ek.set_port_number(9000) + +class DataVendorEikon(DataVendor): + """Reads in data from Eikon into findatapy library + + """ + + def __init__(self): + super(DataVendorEikon, self).__init__() + + # implement method in abstract superclass + def load_ticker(self, market_data_request): + logger = LoggerManager().getLogger(__name__) + + market_data_request_vendor = self.construct_vendor_market_data_request(market_data_request) + + logger.info("Request Eikon data") + + data_frame = self.download(market_data_request_vendor) + + if data_frame is None or data_frame.index is []: return None + + # Convert from vendor to findatapy tickers/fields + # if data_frame is not None: + # returned_tickers = data_frame.columns + + if data_frame is not None: + # Tidy up tickers into a format that is more easily translatable + # we can often get multiple fields returned (even if we don't ask for them!) + # convert to lower case + returned_fields = market_data_request_vendor.fields + returned_tickers = [] + + for vi in market_data_request_vendor.tickers: + for f in market_data_request_vendor.fields: + returned_tickers.append(vi) + + try: + fields = self.translate_from_vendor_field(returned_fields, market_data_request) + tickers = self.translate_from_vendor_ticker(returned_tickers, market_data_request) + except Exception: + print('error') + + ticker_combined = [] + + for i in range(0, len(tickers)): + try: + ticker_combined.append(tickers[i] + "." + fields[i]) + except: + ticker_combined.append(tickers[i] + ".close") + + data_frame.columns = ticker_combined + data_frame.index.name = 'Date' + + logger.info("Completed request from Eikon for " + str(ticker_combined)) + + # print(data_frame) + return data_frame + + def download(self, market_data_request): + logger = LoggerManager().getLogger(__name__) + + trials = 0 + + data_frame = None + + if market_data_request.freq == 'tick': + freq = 'taq' # Unofficial support https://community.developers.refinitiv.com/questions/48616/how-do-i-get-historical-ticks-using-python-eikon-p.html + elif market_data_request.freq == 'daily': + freq = 'daily' + else: + freq = 'minute' + + while (trials < 5): + try: + # Can sometimes fail first time around + ek.set_app_key(market_data_request.eikon_api_key) + # ek.set_port_number(9000) + + data_frame = ek.get_timeseries(market_data_request.tickers, + start_date=market_data_request.start_date.strftime("%Y-%m-%dT%H:%M:%S"), + end_date=market_data_request.finish_date.strftime("%Y-%m-%dT%H:%M:%S"), + fields=market_data_request.fields, + interval=freq + ) + break + except SyntaxError: + logger.error("The tickers %s do not exist on Eikon." % market_data_request.tickers) + break + except Exception as e: + trials = trials + 1 + logger.info( + "Attempting... " + str(trials) + " request to download from Eikon due to following error: " + str( + e)) + + if trials == 5: + logger.error("Couldn't download from Eikon after several attempts!") + + return data_frame + ####################################################################################################################### # # support Quandl 3.x.x diff --git a/findatapy/market/marketdatagenerator.py b/findatapy/market/marketdatagenerator.py index f1bbedd..3dfc031 100644 --- a/findatapy/market/marketdatagenerator.py +++ b/findatapy/market/marketdatagenerator.py @@ -78,6 +78,10 @@ def get_data_vendor(self, source): from findatapy.market.datavendorweb import DataVendorQuandl data_vendor = DataVendorQuandl() + elif source == 'eikon': + from findatapy.market.datavendorweb import DataVendorEikon + data_vendor = DataVendorEikon() + elif source == 'ons': from findatapy.market.datavendorweb import DataVendorONS data_vendor = DataVendorONS() @@ -217,7 +221,7 @@ def fetch_market_data(self, market_data_request, kill_session = True): data_frame_agg = data_frame_agg.resample(market_data_request.resample).first() if 'dropna' in market_data_request.resample_how: - data_frame_agg = data_frame_agg.dropna(how = 'all') + data_frame_agg = data_frame_agg.dropna(how='all') else: self.logger.warn("No data returned for " + str(market_data_request.tickers)) @@ -442,6 +446,9 @@ def fetch_group_time_series(self, market_data_request_list): if data_frame_group is not None: data_frame_group = [i for i in data_frame_group if i is not None] + # import itertools + # columns = list(itertools.chain.from_iterable([i.columns for i in data_frame_group if i is not None])) + # For debugging! # import pickle # import datetime @@ -450,6 +457,9 @@ def fetch_group_time_series(self, market_data_request_list): if data_frame_group is not None: try: data_frame_agg = self.calculations.pandas_outer_join(data_frame_group) + + # Force ordering to be the same! + # data_frame_agg = data_frame_agg[columns] except Exception as e: self.logger.warning('Possible overlap of columns? Have you specifed same ticker several times: ' + str(e)) diff --git a/findatapy/market/marketdatarequest.py b/findatapy/market/marketdatarequest.py index 21b6bca..0ddd979 100644 --- a/findatapy/market/marketdatarequest.py +++ b/findatapy/market/marketdatarequest.py @@ -79,6 +79,7 @@ def __init__(self, data_source=None, environment="backtest", trade_side='trade', expiry_date=None, resample=None, resample_how='last', md_request=None, abstract_curve=None, quandl_api_key=data_constants.quandl_api_key, fred_api_key=data_constants.fred_api_key, alpha_vantage_api_key=data_constants.alpha_vantage_api_key, + eikon_api_key=data_constants.eikon_api_key, push_to_cache=True, overrides={} ): @@ -121,6 +122,7 @@ def __init__(self, data_source=None, self.quandl_api_key = copy.deepcopy(md_request.quandl_api_key) self.fred_api_key = copy.deepcopy(md_request.fred_api_key) self.alpha_vantage_api_key = copy.deepcopy(md_request.alpha_vantage_api_key) + self.eikon_api_key = copy.deepcopy(md_request.eikon_api_key) self.overrides = copy.deepcopy(md_request.overrides) self.push_to_cache = copy.deepcopy(md_request.push_to_cache) @@ -154,6 +156,7 @@ def __init__(self, data_source=None, self.quandl_api_key = quandl_api_key self.fred_api_key = fred_api_key self.alpha_vantage_api_key = alpha_vantage_api_key + self.eikon_api_key = eikon_api_key self.overrides = overrides self.push_to_cache = push_to_cache @@ -201,7 +204,7 @@ def data_source(self): def data_source(self, data_source): try: valid_data_source = ['ats', 'bloomberg', 'dukascopy', 'fred', 'gain', 'google', 'quandl', 'yahoo', - 'boe'] + 'boe', 'eikon'] if not data_source in valid_data_source: LoggerManager().getLogger(__name__).warning(data_source & " is not a defined data source.") @@ -532,6 +535,14 @@ def alpha_vantage_api_key(self): @alpha_vantage_api_key.setter def alpha_vantage_api_key(self, alpha_vantage_api_key): self.__alpha_vantage_api_key = alpha_vantage_api_key + + @property + def eikon_api_key(self): + return self.__eikon_api_key + + @eikon_api_key.setter + def eikon_api_key(self, eikon_api_key): + self.__eikon_api_key = eikon_api_key @property def overrides(self): diff --git a/findatapy/timeseries/filter.py b/findatapy/timeseries/filter.py index 76706fe..ca2ebbf 100644 --- a/findatapy/timeseries/filter.py +++ b/findatapy/timeseries/filter.py @@ -403,11 +403,15 @@ def filter_time_series_aux(self, start_date, finish_date, data_frame, offset): # CAREFUL: need + 1 otherwise will only return 1 less than usual # return data_frame.iloc[start_date:finish_date] - # just use pandas, quicker and simpler code! + # Just use pandas, quicker and simpler code! if data_frame is None: return None - return data_frame.loc[start_date:finish_date] + # Slower method.. + # return data_frame.loc[start_date:finish_date] + + # Much faster, start and finish dates are inclusive + return data_frame[(data_frame.index >= start_date) & (data_frame.index <= finish_date)] def filter_time_series_by_time_of_day(self, hour, minute, data_frame, in_tz = None, out_tz = None): @@ -668,7 +672,7 @@ def create_tickers_fields_list(self, market_data_request): tickers_fields_list = [] - # create ticker.field combination for series we wish to return + # Create ticker.field combination for series we wish to return for f in fields: for t in tickers: tickers_fields_list.append(t + '.' + f) @@ -680,7 +684,7 @@ def resample_time_series(self, data_frame, freq): def resample_time_series_frequency(self, data_frame, data_resample_freq, data_resample_type = 'mean', fill_empties = False): - # should we take the mean, first, last in our resample + # Should we take the mean, first, last in our resample if data_resample_type == 'mean': data_frame_r = data_frame.resample(data_resample_freq).mean() elif data_resample_type == 'first': @@ -755,29 +759,29 @@ def mask_time_series_by_time(self, df, time_list, time_zone): DataFrame (which the time zone is 'UTC') """ - # change the time zone from 'UTC' to a given one + # Change the time zone from 'UTC' to a given one df.index = df.index.tz_convert(time_zone) df_mask = pandas.DataFrame(0,index=df.index,columns=['mask']) - # mask data with each given tuple + # Mask data with each given tuple for i in range(0, len(time_list)): start_hour = int(time_list[i][0].split(':')[0]) start_minute = int(time_list[i][0].split(':')[1]) end_hour = int(time_list[i][1].split(':')[0]) end_minute = int(time_list[i][1].split(':')[1]) - # e.g. if tuple is ('01:08', '03:02'), + # E.g. if tuple is ('01:08', '03:02'), # take hours in target - take values in [01:00,04:00] narray = np.where(df.index.hour.isin(range(start_hour,end_hour + 1)), 1, 0) df_mask_temp = pandas.DataFrame(index=df.index, columns=df_mask.columns.tolist(), data=narray) - # remove minutes not in target - remove values in [01:00,01:07], [03:03,03:59] + # Remove minutes not in target - remove values in [01:00,01:07], [03:03,03:59] narray = np.where(((df.index.hour == start_hour) & (df.index.minute < start_minute)), 0, 1) df_mask_temp = df_mask_temp * pandas.DataFrame(index=df.index, columns=df_mask.columns.tolist(), data=narray) narray = np.where((df.index.hour == end_hour) & (df.index.minute > end_minute), 0, 1) df_mask_temp = df_mask_temp * pandas.DataFrame(index=df.index, columns=df_mask.columns.tolist(), data=narray) - # collect all the periods we want to keep the data + # Collect all the periods we want to keep the data df_mask = df_mask + df_mask_temp narray = np.where(df_mask == 1, df, 0) @@ -786,11 +790,6 @@ def mask_time_series_by_time(self, df, time_list, time_zone): return df - - - - - ####################################################################################################################### import datetime @@ -898,6 +897,17 @@ def set_market_holidays(self, holiday_df): tsf = Filter() + if True: + import pandas as pd + dates = pd.date_range('01 Jan 2020', '10 Jan 2020', freq='D') + data_frame = pd.DataFrame(index=dates) + + start_date = '03 Jan 2020'; finish_date = '06 Jan 2020' + print(data_frame.loc[start_date:finish_date]) + + # Much faster! + print(data_frame[(data_frame.index >= start_date) & (data_frame.index <= finish_date)]) + if False: start = pandas.to_datetime('2000-01-01') end = pandas.to_datetime('2020-01-01') diff --git a/findatapy/util/dataconstants.py b/findatapy/util/dataconstants.py index 6e5294a..c055bc2 100644 --- a/findatapy/util/dataconstants.py +++ b/findatapy/util/dataconstants.py @@ -148,6 +148,9 @@ class DataConstants(object): # FXCM API (contact FXCM to get this) fxcm_api_key = "x" + # Eikon settings + eikon_api_key = key_store("Eikon") + # Twitter settings (you need to set these up on Twitter) TWITTER_APP_KEY = key_store("Twitter App Key") TWITTER_APP_SECRET = key_store("Twitter App Secret") diff --git a/findatapy_examples/eikondata_example.py b/findatapy_examples/eikondata_example.py new file mode 100644 index 0000000..80c0078 --- /dev/null +++ b/findatapy_examples/eikondata_example.py @@ -0,0 +1,116 @@ +__author__ = 'saeedamen' # Saeed Amen + +# +# Copyright 2020 Cuemacro +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# +# See the License for the specific language governing permissions and limitations under the License. +# + + +if __name__ == '__main__': + ###### below line CRUCIAL when running Windows, otherwise multiprocessing doesn't work! (not necessary on Linux) + from findatapy.util import SwimPool; SwimPool() + + from findatapy.market import Market, MarketDataRequest, MarketDataGenerator + + market = Market(market_data_generator=MarketDataGenerator()) + + from findatapy.util.dataconstants import DataConstants + + eikon_api_key = DataConstants().eikon_api_key + + df = None + + if eikon_api_key is None: + eikon_api_key = 'TYPE_YOUR_API' + + import datetime + from datetime import timedelta + + # You need to have Eikon installed and to have a valid licence for this to work + # For intraday pricing, you can usually access a history back a few months from the current date + # (if you need older history there are other Refinitiv products like Tick History) + + # Note: can sometimes get following error + # eikon.eikonError.EikonError: Error code -1 | Port number was not identified. Check if Eikon Desktop or Eikon API Proxy is running. + + # Steps to check if you get the above error when trying to download via the Eikon Python package, which findatapy uses + # + # 1. Check Eikon Desktop is running, also sometimes downgrading your Eikon Python package might help + # 2. Usually Eikon Data API is running on port 9000, to check this is running try accessing page + # http://localhost:9000/ping?all + # + # The output should be something like this, if the Data API is running + # {"port":9000,"mode":"eikon4","pid":23008,"hasSecure":true,"startedTime":"Wed Sep 09 2020 16:06:24 GMT+0100 (GMT Daylight Time)", + # "subApps":[{"path":"/heap"},{"path":"/ping"},{"path":"/sxs","data":{"hasSecure":true,"sxsApps":{}}},{"path":"/api"}]} + # + # 3. In folder C:\Users\YOURUSERNAME\AppData\Roaming\Refinitiv\Data API Proxy there should be a file .portInUse which has + # only the port used by Eikon eg. the below (if this is different to the port which the Data API Proxy is running, you'll + # likely get the above error) + # + # 9000 + # + # 4. On older versions of Eikon this folder might be c:\Users\YOURUSERNAME\AppData\Thomson Reuters\Eikon API Proxy\ + # 5. It might be necessary to check Eikon logs, to see which port the Data API is running on too, if it's not running on 9000 + # 6. Also check various Refinitiv forum pages such as + # https://community.developers.refinitiv.com/questions/37673/app-cannot-connect-to-server-port-9000-target-mach.html + + # Get recent tick data for FX tick data + md_request = MarketDataRequest( + start_date=datetime.datetime.utcnow() - timedelta(hours=1), # Start date (download data over past decade) + freq='tick', + data_source='eikon', # Use Eikon as data source + tickers=['EURUSD'], # ticker + fields=['bid', 'ask'], # which fields to download + vendor_tickers=['EUR='], # ticker (Eikon/RIC) + vendor_fields=['BID', 'ASK'], # Which Eikon fields to download + eikon_api_key=eikon_api_key) + + df = market.fetch_market(md_request) + + print(df) + + # Get 1 minute intraday data for FX + md_request = MarketDataRequest( + start_date=datetime.datetime.utcnow() - timedelta(days=5), # Start date (download data over past decade) + freq='intraday', + data_source='eikon', # use Eikon as data source + tickers=['EURUSD', 'GBPUSD'], # ticker + fields=['close', 'open', 'high', 'low'], # which fields to download + vendor_tickers=['EUR=', 'GBP='], # ticker (Eikon/RIC) + vendor_fields=['CLOSE', 'OPEN', 'HIGH', 'LOW'], # which Eikon fields to download + eikon_api_key=eikon_api_key) + + df = market.fetch_market(md_request) + + print(df) + + # We can also download G10 FX from Eikon using shortcuts, without specifying RIC + # we just need to specify category at 'fx' + # You can add your own customized tickers by editing the various conf CSV files + md_request = MarketDataRequest( + start_date=datetime.datetime.utcnow() - timedelta(days=5), # Start date (download data over past decade) + freq='intraday', + category='fx', + cut='NYC', + data_source='eikon', # use Eikon as data source + tickers=['EURUSD', 'GBPUSD'], # ticker + fields=['close', 'open', 'high', 'low'], # which fields to download + eikon_api_key=eikon_api_key) + + print(df) + + df = market.fetch_market(md_request) + + # Also let's do this for daily data + md_request.freq = 'daily' + + df = market.fetch_market(md_request) + + print(df) \ No newline at end of file diff --git a/setup.py b/setup.py index ef855c5..155e18e 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ tickers, using configuration files. There is also functionality which is particularly useful for those downloading FX market data.""" setup(name='findatapy', - version='0.1.14', + version='0.1.15', description='Market data library', author='Saeed Amen', author_email='saeed@cuemacro.com', @@ -23,6 +23,7 @@ 'pandas_datareader', 'fxcmpy', 'alpha_vantage', + 'eikon', 'yfinance', 'quandl', 'statsmodels',