For a deeper look into our Eikon Data API, look into:

Overview |  Quickstart |  Documentation |  Downloads |  Tutorials |  Articles

question

Upvotes
Accepted
18 0 0 2

Bond Ratings using Python API

Hello Team, I need to get the same thing shown in this link:


https://community.developers.refinitiv.com/questions/55603/bond-ratings-1.html?childToView=101545


This is my script that needs help to make it work. Thank you.


from refinitiv.data.content import search

import refinitiv.data as rd

import pandas as pd

from datetime import date, timedelta, datetime

import numpy as np


rd.open_session()


response = search.Definition(view=search.Views.FIXED_INCOME_INSTRUMENTS, \

filter = f"MaturityRedemDate ge {datetime.today().strftime('%Y-%m-%d')} and IsActive eq true and (InstrumentTypeDescription eq 'Bond' or InstrumentTypeDescription eq 'Note') "\

"and PrincipalCurrency eq 'GBP' "\

"and InflationProtected eq 'N' "\

"and IndustrySectorDescription ne 'Other Financial' and IndustrySectorDescription ne 'Sovereign' and IndustrySectorDescription ne 'Official and Muni' and IndustrySectorDescription ne 'Supranational' "\

"and IndustrySectorDescription ne 'Banks' and IndustrySectorDescription ne 'Agency' and IndustrySectorDescription ne 'Official and Muni'", \

navigators = "SectorDescription", \

select="IssuerLegalName, RIC, ISIN, IsActive, IssueDate, MaturityRedemDate, MaturityYearsToRedem, IssuerCountry, "\

"PrincipalCurrency, InflationProtected, SearchAllCategoryv3, InstrumentTypeDescription, DebtTypeDescription, AssetType, AssetCategory, AssetTypeDescription, AssetSubTypeDescription, AssetStateName," \

"MoodysRating, MoodysRatingDate, SPBondRatingLatest, SPRating, SPRatingDate, "\

"MaturityDate, RCSOrganisationTypeName, IndustrySectorDescription, DbSubTypeDescription, Sector, SectorDescription,"\

"DocumentTitle, Description", \

top = 10000).get_data()


df = response.data.df


df1 = rd.get_data(

universe=[df["RIC"][1-10000]],

#fields=['TR.GR.Rating(BondRatingSrc=FTC:S&P:MDY).RatingSourceDescription','TR.GR.Rating(BondRatingSrc=FTC:S&P:MDY)','TR.GR.Rating(BondRatingSrc=FTC:S&P:MDY).date']

fields=['TR.GR.Rating.RatingSourceDescription','TR.GR.Rating','TR.GR.Rating.date']

)


display(df1)


the goal is to have, per each entry retrieved by the search, the Zspread and the last ratings information (from Moodys and Fitch, with timestamp) also, do you have any guide that I can use regarding retrieving Fixed Income instruments using the Python API? I often struggle to know which info are available and what's the code (for "filter" or "select") to be used

#technologypython api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
55.7k 144 45 65

@dianne.palmario

Please use universe=df["RIC"][0:10000] instead. The code looks like this:

df1 = rd.get_data(
    universe=df["RIC"][0:10000],
    fields=['TR.GR.Rating.RatingSourceDescription','TR.GR.Rating','TR.GR.Rating.date']
)


display(df1)

The output is:

1674614249638.png

For more information regarding array slicing, please refer to this page.


1674614249638.png (79.7 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

@Jirapongse


I changed to below and it still does not work. It only works if I place one number. Example: universe=[df["RIC"][4]]


universe=[df["RIC"][1:10000]]

#This still does not work

@dianne.palmario please can you try :

universe= df["Instrument"][0:].astype(str).to_list()

If it does not work can you please paste a copy of your error otherwise it is difficult for us to help you. I hope this can help.

@jason.ramchandani01 - here is the error after changing to:

universe= df["Instrument"][0:].astype(str).to_list()


Script and Error.txt

Upvotes
7.9k 10 6 9

@dianne.palmario which part of your script is failing? please copy and paste the error message. thanks


icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

This part is not working:

universe=[df["RIC"][1-10000]]


but when I change this to:

universe=[df["RIC"][4]]

it works, but the problem is, it only display the RIC of the 4th data from the result table. I need all of them (392 rows to be exact).


codebk-bond-rating-search.png


Here is the error message if I change it to 1-10000:

codebk-bond-rating-search-error.png

Upvotes
7.9k 10 6 9

@dianne.palmario so this works for me:

response = search.Definition(
    view=rd.discovery.Views.FIXED_INCOME_INSTRUMENTS,
    filter = "MaturityRedemDate ge 2023-01-01 and IsActive eq true and (InstrumentTypeDescription eq 'Bond' or InstrumentTypeDescription eq 'Note') and PrincipalCurrency eq 'GBP' and InflationProtected eq 'N' and IndustrySectorDescription ne 'Other Financial' and IndustrySectorDescription ne 'Sovereign' and IndustrySectorDescription ne 'Official and Muni' and IndustrySectorDescription ne 'Supranational' and IndustrySectorDescription ne 'Banks' and IndustrySectorDescription ne 'Agency' and IndustrySectorDescription ne 'Official and Muni'",
    navigators = "SectorDescription",
    select="IssuerLegalName, RIC, ISIN, IsActive, IssueDate, MaturityRedemDate, MaturityYearsToRedem, IssuerCountry, PrincipalCurrency, InflationProtected, SearchAllCategoryv3, InstrumentTypeDescription, DebtTypeDescription, AssetType, AssetCategory, AssetTypeDescription, AssetSubTypeDescription, AssetStateName,MoodysRating, MoodysRatingDate, SPBondRatingLatest, SPRating, SPRatingDate,MaturityDate, RCSOrganisationTypeName, IndustrySectorDescription, DbSubTypeDescription, Sector, SectorDescription, DocumentTitle, Description",
    top = 10000).get_data()


response.data.df

1674662598140.png

then:

df1 = rd.get_data(
    universe= response.data.df["RIC"].astype(str).to_list(),
    fields=['TR.GR.Rating.RatingSourceDescription','TR.GR.Rating','TR.GR.Rating.date']
)

df1

1674662659402.png

I hope this is clear for you.




1674662598140.png (254.9 KiB)
1674662659402.png (200.3 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

The above script works! Thank you @jason.ramchandani01


For the search.Definition API Library, do we have any guide that the client can use regarding retrieving Fixed Income instruments using the Python API?

Client often struggle to know which info are available and what's the code (for "filter" or "select") to be used.