Time Series Yield

Hi i am currently trying to work out my own Dividend Yield.

I am using the following code to retrieve the daily price close and hope to index and match it with the dividend ex date.

df, err = ek.get_data(

instruments = [Instrument],

fields = [


'TR.PriceClose.date'

'TR.DivAdjustedNet',

'TR.DivAdjustedGross',

'TR.DivRecordDate',

'TR.DivPayDate',

'TR.DivExDate',

'TR.PriceClose'


],

parameters = {'SDate': '2021-10-01', 'EDate': 1,}

)


display(df)

Best Answer

  • pf
    pf LSEG
    Answer ✓

    Hi @ken03 ,

    To retrieve Price Close for each Dividend Ex Div, you need to split into 3 steps:

    1. request Dividend Ex date
    2. request Price Close for each Div Ex date
    3. append Price Close to initial result

    Example:

    df, err = ek.get_data(
    instruments = [Instrument],
    fields = ['TR.DivAdjustedNet', 'TR.DivAdjustedGross', 'TR.DivRecordDate', 'TR.DivPayDate', 'TR.DivExDate'],
    parameters={'SDate': '2021-10-01', 'EDate': 1,}
    )
    prices = []
    for d in df["Dividend Ex Date"]:
    price_df, err = ek.get_data(
    instruments = ["AAPL.O"],
    fields = ['TR.PriceClose.date', 'TR.PriceClose'],
    parameters={'SDate': d}
    )
    prices.append(price_df["Price Close"][0])
    print(price_df.to_string())

    df["Price Close"] = prices
    display(df)

    To optimize, I'll recommend you to migrate from eikon to refinitv-data library and use asynchronous get_data_async() function to retrieve Price Close with a multi-treaded implementation:

    import refinitiv-data as rd
    import asyncio

    session = rd.session.desktop.Definition(app_key="<YOUR APP KEY>").get_session()
    rd.session.set_default(session)
    session.open()

    ex_div_dates = rd.get_data(
    universe=["AAPL.O"],
    fields=['TR.DivAdjustedNet', 'TR.DivAdjustedGross', 'TR.DivRecordDate', 'TR.DivPayDate', 'TR.DivExDate'],
    parameters={'SDate': '2021-10-01', 'EDate': 1,}
    )
    dates = [str(d.date()) for d in ex_div_dates["Dividend Ex Date"]]
    ex_div_dates.set_index("Dividend Ex Date", inplace=True)

    loop = asyncio.get_event_loop()
    tasks = [loop.create_task(
    rd.content.fundamental_and_reference.Definition(
    universe=["AAPL.O"],
    fields=['TR.PriceClose.date', 'TR.PriceClose'],
    parameters={'SDate': d}).get_data_async()) for d in dates]

    results = loop.run_until_complete(asyncio.gather(*tasks))
    prices = pd.concat([r.data.df for r in results])
    prices.sort_values(by=["Date"])
    prices.set_index("Date", inplace=True)
    final_result = pd.merge(ex_div_dates, prices, left_index=True, right_index=True))
    display(final_result)

    session.close()

Answers