Morningstar
US Fundamental Data
Introduction
The US Fundamental Data by Morningstar tracks US Equity fundamentals. The data covers 5,000 US Equities, starts in January 1998, and is delivered on a daily frequency. This dataset is created by using a combination of string matching, Regular Expressions, and Machine Learning to gather the fundamental data published by companies.
For older symbols, the file date is approximated 45 days after the as of date. When a filing date is present on the Morningstar data, it is used. As we are a quant platform, all the data is loaded using "As Original Reported" figures. If there was a mistake reporting the figure, this will not be fixed later. The market typically responds quickly to these initially reported figures. Data is available for multiple periods depending on the property. Periods available include: 1 mo, 2 mo, 3 mo, 6 mo, 9 mo, 12 mo, 1 Yr, 2 Yr, 3 Yr, and 5 Yr. Morningstar symbols cover the NYSE, NASDAQ, AMEX, and BATS exchanges.
In live trading, Morningstar data is delivered to your algorithm at approximately 6 am each day. The majority of the fundamental data update occurs once per month. This includes updates to all of the key information for each security Morningstar supports. On top of this monthly update, there are daily updates of the financial ratios.
As Morningstar data arrives, it updates the master copy and is passed into your algorithm, similar to how TradeBars are fill-forwarded in your data feed. If there have been no updates for a day, you'll receive the same fundamental data.
This dataset depends on the US Equity Security Master dataset because the US Equity Security Master dataset contains information on splits, dividends, and symbol changes.
For more information about the US Fundamental Data dataset, including CLI commands and pricing, see the dataset listing.
About the Provider
Morningstar was founded by Joe Mansueto in 1984 with the goal of empowering investors by connecting people to the investing information and tools they need. Morningstar provides access extensive line of products and services for individual investors, financial advisors, asset managers, and retirement plan providers. Morningstar provides data on approximately 525,000 investment offerings including stocks, mutual funds, and similar vehicles, along with real-time global market data on nearly 18 million equities, indexes, futures, options, commodities, and precious metals, in addition to foreign exchange and Treasury markets. Morningstar also offers investment management services through its investment advisory subsidiaries, with $244 billion in assets under advisement or management as of 2021.
Supported Assets
To view the supported assets in the US Fundamental dataset, see the Data Explorer.
Data Point Attributes
The US Fundamentals dataset provides FineFundamental objects. To filter FineFundamental objects, you can use the MorningstarSectorCode, MorningstarIndustryGroupCode, and MorningstarIndustryCode enumeration values.
FineFundamental Attributes
FineFundamental objects have the following attributes:
MorningstarSectorCode Enumeration
Sectors are large super categories of data. To access the sector of an Equity, use the MorningstarSectorCode property.
filteredFine = fine.Where(x => x.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Technology);
filtered_fine = [x for x in fine if x.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Technology]
The MorningstarSectorCode enumeration has the following members:
MorningstarIndustryGroupCode Enumeration
Industry groups are clusters of related industries which tie together. To access the industry group of an Equity, use the MorningstarIndustryGroupCode property.
filteredFine = fine.Where(x => x.AssetClassification.MorningstarIndustryGroupCode == MorningstarIndustryGroupCode.ApplicationSoftware);
filtered_fine = [x for x in fine if x.AssetClassification.MorningstarIndustryGroupCode == MorningstarIndustryGroupCode.ApplicationSoftware]
The MorningstarIndustryGroupCode enumeration has the following members:
MorningstarIndustryCode Enumeration
Industries are the finest level of classification available and are the individual industries according to the Morningstar classification system. To access the industry group of an Equity, use the MorningstarIndustryCode property.
filteredFine = fine.Where(x => x.AssetClassification.MorningstarIndustryCode == MorningstarIndustryCode.SoftwareApplication);
filtered_fine = [x for x in fine if x.AssetClassification.MorningstarIndustryCode == MorningstarIndustryCode.SoftwareApplication]
The MorningstarIndustryCode enumeration has the following members:
Exchange ID Values
The exchange ID represents the exchange that lists the Equity. To access the exchange ID of an Equity, use the PrimaryExchangeID property.
filteredFine = fine.Where(x => x.CompanyReference.PrimaryExchangeID == "NAS");
filtered_fine = [x for x in fine if x.CompanyReference.PrimaryExchangeID == "NAS"]
The exchanges are represented by the following string values:
String Representation | Exchange |
---|---|
NYS | New York Stock Exchange (NYSE) |
NAS | NASDAQ |
ASE | American Stock Exchange (AMEX) |
TSE | Tokyo Stock Exchange |
AMS | Amsterdam Internet Exchange |
SGO | Santiago Stock Exchange |
XMAD | Madrid Stock Exchange |
ASX | Australian Securities Exchange |
BVMF | B3 (stock exchange) |
LON | London Stock Exchange |
TKS | Istanbul Stock Exchange Settlement and Custody Bank |
SHG | Shanghai Exchange |
LIM | Lima Stock Exchange |
FRA | Frankfurt Stock Exchange |
JSE | Johannesburg Stock Exchange |
MIL | Milan Stock Exchange |
TAE | Tel Aviv Stock Exchange |
STO | Stockholm Stock Exchange |
ETR | Deutsche Boerse Xetra Core |
PAR | Paris Stock Exchange |
BUE | Buenos Aires Stock Exchange |
KRX | Korea Exchange |
SWX | SIX Swiss Exchange |
PINX | Pink Sheets (OTC) |
CSE | Canadian Securities Exchange |
PHS | Philippine Stock Exchange |
MEX | Mexican Stock Exchange |
TAI | Taiwan Stock Exchange |
IDX | Indonesia Stock Exchange |
OSL | Oslo Stock Exchange |
BOG | Colombia Stock Exchange |
NSE | National Stock Exchange of India |
HEL | Nasdaq Helsinki |
MISX | Moscow Exchange |
HKG | Hong Kong Stock Exchange |
IST | Istanbul Stock Exchange |
BOM | Bombay Stock Exchange |
TSX | Toronto Stock Exchange |
BRU | Brussels Stock Exchange |
BATS | BATS Global Markets |
ARCX | NYSE Arca |
GREY | Grey Market (OTC) |
DUS | Dusseldorf Stock Exchange |
BER | Berlin Stock Exchange |
ROCO | Taipei Exchange |
CNQ | Canadian Trading and Quotation System Inc. |
BSP | Bangko Sentral ng Pilipinas |
NEOE | NEO Exchange |
Requesting Data
To add US Fundamental data to your algorithm, pass a fine universe selection method to the AddUniverse or AddUniverseSelection method.
class MorningStarDataAlgorithm(QCAlgorithm): def Initialize(self) -> None: self.SetStartDate(2021, 1, 1) self.SetEndDate(2021, 7, 1) self.SetCash(100000) self.AddUniverse(self.SelectCoarse, self.SelectFine)
namespace QuantConnect { public class MorningStarDataAlgorithm : QCAlgorithm { public override void Initialize() { SetStartDate(2021, 1, 1); SetEndDate(2021, 7, 1); SetCash(100000); AddUniverse(SelectCoarse, SelectFine); } } }
Accessing Data
To access fundamental data, use the FineFundamental objects in your second selection function or use the Fundamental property of the Equity objects in your algorithm. The Symbol objects you return from the coarse selection function are the Symbol objects that comprise the FineFundamental objects in your fine fundamental selection function.
def SelectCoarse(self, coarse: List[CoarseFundamental]) -> List[Symbol]: selected = [c for c in coarse if c.HasFundamentalData] sorted_by_dollar_volume = sorted(selected, key=lambda c: c.DollarVolume, reverse=True) return [ c.Symbol for c in sorted_by_dollar_volume[:20] ] def SelectFine(self, fine: List[FineFundamental]) -> List[Symbol]: sorted_by_pe_ratio = sorted(fine, key=lambda f: f.ValuationRatios.PERatio, reverse=True) return [ f.Symbol for f in sorted_by_pe_ratio[:5] ]
public IEnumerable<Symbol> SelectCoarse(IEnumerable<CoarseFundamental> coarse) { return coarse.OrderByDescending(x => x.DollarVolume).Take(20).Select(x => x.Symbol); } public IEnumerable<Symbol> SelectFine(IEnumerable<FineFundamental> fine) { return fine.OrderByDescending(x => x.ValuationRatios.PERatio).Take(5).Select(x => x.Symbol); }
Many of the MorningStar values are MultiPeriodField objects. These objects represent a timespan of data, normally either OneMonth, ThreeMonths, SixMonths, or TwelveMonths. To view the objects, see the the auto-generated classes in the LEAN GitHub repository.
To access fundamental data outside of your fine fundamental selection function, use the Fundamental property of the Equity objects in your algorithm.
fundamentals = self.Securities[symbol].Fundamentals
var fundamentals = Securities[symbol].Fundamentals;
Historical Data
It's currently only possible to get historical fundamental data from the Research Environment. To get historical data, call the GetFundamental method with the Equity Symbol, a FineFundamental property, a start date, and an end date. If there is no data in the period you request, the history result is empty.
history = qb.GetFundamental(symbol, "ValuationRatios.PERatio", datetime(2021, 1, 1), datetime(2021, 7, 1))
var history = qb.GetFundamental(symbol, "ValuationRatios.PERatio", new DateTime(2021, 1, 1), new DateTime(2021, 7, 1));
For more information about historical US Equity fundamental data in the Research Environment, see Equity Fundamental Data.
To be notified when historical fundamental data is available in an algorithm, subscribe to GitHub Issue #4890.
Example Applications
The US Fundamentals dataset enables you to design strategies harnessing fundamental data points. Examples include the following strategies:
- Ranking a universe of securities by a value factor like the book-to-market ratio and buying a subset of the universe with the best factor ranking
- Using the Morningstar asset classification to target specific industries or to ensure your strategy is diversified across several sectors
- Trading securities that recently performed an IPO