question

Upvotes
Accepted
30 8 10 14

How to retrieve the entire mutual fund universe trading in the US market?

With the below code I can only retrieve upto 10k mutual funds. I can use IssueLipperGlobalSchemeName filter but there are too many lipper schemes in this PDF and some of the lipper schemes are not exactly matching with the Python output (Eg: In the PDF one of the schemes is called "Equity Sector Information Technology " but in Python output its showing "Equity Sector Information Tech").

Is there any other filter that I can apply so that I can retrieve all the mutual funds (including all the share classes) trading in the US market without missing any of the funds? If this is not possible, how can I get all the lipper global scheme names using python code so that I can use that as a filter in a loop? I need all equity, bond and alternative mutual funds trading in the US market.


Python code

import refinitiv.dataplatform as rdp
rdp.open_desktop_session('<API key>')
 
df = rdp.search(
    view = rdp.SearchViews.FundQuotes,
    filter = """IssuerCountry eq 'USA' and ExchangeCode eq 'LIP' and AssetStateName eq 'Active'""",
    select = """RIC,TickerSymbol,DocumentTitle,ExchangeCode,AssetStateName,CommonName,ExchangeName,FundType,
     FundClassLipperID,FundClassCurrency,IssueLipperGlobalSchemeName,IssuerCountry,AssetType""",
    top = 10_000
)
print(df)
refinitiv-dataplatform-eikon#technologyrdp-apifundsrdp searchuniverse
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.

Upvote
Accepted
86.2k 292 53 79

@BlackBird

Thanks for reaching out to us.

The output is limited to 10,000 entries. You may need to add more conditions in the filter.

For example, you can add the endswith(RIC,'x') condition in the filter. x represents 0 to 9.

Therefore, it requires 10 requests to get all entries. For example:

df = search.Definition(
    view=search.Views.FUND_QUOTES,
    select="RIC,TickerSymbol,DocumentTitle,ExchangeCode,AssetStateName,CommonName,ExchangeName,FundType,FundClassLipperID,FundClassCurrency,IssueLipperGlobalSchemeName,IssuerCountry,AssetType", 
    filter="IssuerCountry eq 'USA' and ExchangeCode eq 'LIP' and AssetStateName eq 'Active' and endswith(RIC,'0')",
    top=10000
).get_data()
df.data.df

The output is:

1674632943582.png

You can use other conditions.

Regarding the IssueLipperGlobalSchemeName, you can use navigators to get the list of all IssueLipperGlobalSchemeName values.

df = search.Definition(
    view=search.Views.FUND_QUOTES,
    select="RIC,TickerSymbol,DocumentTitle,ExchangeCode,AssetStateName,CommonName,ExchangeName,FundType,FundClassLipperID,FundClassCurrency,IssueLipperGlobalSchemeName,IssuerCountry,AssetType,", 
    filter="IssuerCountry eq 'USA' and ExchangeCode eq 'LIP' and AssetStateName eq 'Active'",
    top=0,
    navigators="IssueLipperGlobalSchemeName"
).get_data()
df.data.raw["Navigators"]['IssueLipperGlobalSchemeName']

The output is:

1674632759944.png

I am using the Refinitiv Data Library for Python.


1674632943582.png (42.4 KiB)
1674632759944.png (103.0 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.

Upvotes
1.8k 3 3 4

Hi @BlackBird,

I can only comment on getting such fund list using RDP Funds API. Your screening should use fund's status and registered for sale attributes rather than the fund classifications in the PDF you mentioned. Basically, I assume you want the funds meets the following criteria:

1. Active (i.e. funds are not liquidated nor merged).

2. Mutual funds only (not including hedge funds, insurance funds, pension funds, ETF, etc)

3. Registered for sale in USA.

Then the following RDP Funds API query will return the funds (share-class level) identifiers and it currently got 25,181 funds:

https://api.refinitiv.com/data/funds/v1/assets?screen={criteriaItems:[{"selectedItem":"n10016","compareValue":"25349","operation":"Equal","logicalOperator":"AND"},{"selectedItem":"n12328","compareValue":"381","operation":"Equal"},{"selectedItem":"n11011","compareValue":"1005","operation":"Equal"}]}&properties=codes

Basically the above REST request will get the results in JSON:

{
  "assets": [
    {
      "id": "40000007",
......
],
  "totalRecords": 25181,
  "fromIndex": 0,
  "toIndex": 9,
  "pageNumber": 1
}

You need to loop the request to get all the data as the data is too long to be included in a single result JSON.

I checked the returned funds and there are about 40 funds domiciled in USA but not registered for sale in US and also some funds registered for sale in USA but domiciled in Ireland. I am not sure if that is correct, but if you have doubts on the contents, you need raise that to the Lipper US data team to confirm.

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.

Thanks. This reduced the universe from 38k to 28k.
If I remove the criteria to include only Mutual Funds, i.e. including other types of funds such as Pension funds, ETFs, etc, Lipper got 33,392 funds (share-class level). I do not know where is the 38K reference count come from. Maybe it includes funds that are merged or liquidated?

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

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