EOD price history limit in Eikon Python API

hi there,

I am trying to retrieve end of day OHLCV for some ETF instrument (XLV) from 01/01/2000 till today via the EIKON Python API. Unfortunately, i can only retrieve data up to 19/06/2018, which is not even 2 years?

I would like to understand why the history is limit to such a short period whereas the Excel API and the Eikon chart allow me to retrieve data up to the desired start date.

Here is the call below where ric='XLV', start_date='20000101', end_date='20200427'. Thank you

fields=["OPEN", "HIGH", "LOW", "CLOSE", "VOLUME"]
df = ek.get_timeseries(ric,
fields=fields,
calendar="tradingdays",
start_date=start_date,
end_date=end_date,
interval='daily')

Best Answer

Answers

  • Hi @Mehdi_deprecated_0

    Please review API limitation at https://developers.refinitiv.com/eikon-apis/eikon-data-api/docs?content=49692&type=documentation_item

    Basically you reached the maximum number of records in a single API call. (3000 rows)

    You should split the API call into multiple smaller periods.
  • Hi @Mehdi_deprecated_0 - you can use the following code to return you a timeseries for as long dates as possible. It currently only works for a single RIC per time but you can loop across a list of RICS and use this and then concatenate to form larger frames. First we need to import some packages:

    import eikon as ek
    import pandas as pd
    import numpy as np
    from dateutil import parser
    from datetime import timedelta
    from datetime import datetime
    import math
    import time
    ek.set_app_key('YOUR API KEY HERE')

    Next we need a date_range helper function:

    def date_range(start, end, intv):
        start = datetime.strptime(start,"%Y-%m-%d")
        end = datetime.strptime(end,"%Y-%m-%d")
        diff = (end  - start ) / intv
        for i in range(intv):
            yield (start + diff * i).strftime("%Y-%m-%d")
        yield end.strftime("%Y-%m-%d")

    Finally we create our new get_daily function (you can of course use other intervals etc). Here we are using a looped get_timeseries call which increments in chunks of 3000 rows - which as you have seen from the answers above is the current per call limit. I have also added a small sleep in there to avoid throttling limits.

    def get_daily(rics,fields,start,end):
        for ric in rics:        
            interval = math.ceil((parser.parse(end) - parser.parse(start)).days / 3000)
            l = list(date_range(start,end,interval))
            df1 = pd.DataFrame()
            df = pd.DataFrame()
            for i in range(interval):
                ts = ek.get_timeseries(rics=ric,fields=fields, start_date=l[0+i],end_date=l[1+i], interval='daily')
                df = df.append(ts)
                time.sleep(0.4)
        return df

    then you can just call the get_daily function with a larger date range and hey presto it all works beautifully:

    rics = ['.GDAXI'] # Just for one ric at the moment I will extend this for multi-ric
    fields = ['OPEN', 'HIGH', 'LOW', 'CLOSE']
    start = '1990-06-04'
    end = '2018-06-04'
    df = get_daily(rics,fields,start,end)
    df

    image

    I hope you can find this of use.