Need Python API call formula to get historical price start date today and end date is TR.FirstTradeD

df, err = ek.get_data(
instruments = ['IBM'],
fields = ['TR.PriceClose'],
parameters = {
'SDate': '2022-01-25',
'EDate': 'TR.FirstTradeDate',
'Frq': 'D'
}
)

display(df)



Any idea how to accomplish this?

Best Answer

  • pf
    pf
    Answer ✓

    Hi @kenley.macandog123 ,

    You need to split into 2 steps.

    from datetime import date

    # 1. retrieve TR.FirstTradeDate
    df, err = ek.get_data(
    instruments=['IBM'],
    fields=['TR.FirstTradeDate'],
    field_name=True
    )
    sdate = df.iloc[0]['TR.FIRSTTRADEDATE']

    # 2. then request historic
    df, err = ek.get_data(
    instruments=['IBM'],
    fields=['TR.PriceClose.date', 'TR.PriceClose'],
    parameters={
    'SDate': sdate,
    'EDate': str(date.today()),
    'Frq': 'D'
    }
    )

Answers

  • Thank you @pf


    The client is also considering this workaround. Please advise.


    I already have the option below: first take the start dates, then look them up one by one. Is there simpler, that avoids the additional loop getting the first dates ?

    start_dates, err = ek.get_data(
    instruments = ric_list,
    fields = ['TR.FirstTradeDate']
    )
    print(err)

    ek.set_app_key(key)
    all_rets = pd.DataFrame()
    for ric in ric_list:
    st_date = start_dates.loc[ start_dates['Instrument'] == ric, 'First Trade Date' ].tolist()[0]
    if (st_date == '') or (st_date is None):
    st_date = '2000-01-01'
    print(ric, ' has no start date. Setting default.')

    df, err = ek.get_data(
    instruments = [ric],
    fields = ['TR.TotalReturn1D.date','TR.TotalReturn1D'],
    parameters = {
    'SDate': st_date,
    'EDate': '-1D',
    'Frq': 'D'
    })
    if err is not None: print(ric, err)
    all_rets = all_rets.append(df)
    print(ric, ':', df.shape[0], ' rows. Cumulative: ', all_rets.shape[0], ' rows.')
    print('Final data has %d rows' % df.shape[0])

  • Hi @kenley.macandog123 ,

    Sorry for the delay to reply !
    I don't see any other way except to request in 2 steps.