Skip to content

Fundamentals: Morningstar Equity Data Feeds data points - #9746

Open
Martin-Molinero wants to merge 35 commits into
QuantConnect:masterfrom
Martin-Molinero:morningstar-edf-new-data-points
Open

Martin-Molinero wants to merge 35 commits into
QuantConnect:masterfrom
Martin-Molinero:morningstar-edf-new-data-points

Conversation

@Martin-Molinero

@Martin-Molinero Martin-Molinero commented Aug 25, 2026

Copy link
Copy Markdown
Member

Updates the fundamental data model for Morningstar's Equity Data Feeds, which replace the previous fundamentals feed in 2026.

New data points (96)

  • Credit risk: DistanceToDefault, ProbabilityOfDefault
  • Company and security flags: IsShellCompany, IsIPO, StateOrCountryOfIncorporation, full/part-time employee counts, TreasuryShares
  • Valuation: diluted and normalized enterprise-value ratios (DilutedEVToEBITDA, NormalizedEVToEBIT, TotalDebtToEV, ...), multi-year averages of the price multiples and yields, NormalizedEarningsYield
  • Bank regulatory metrics: Tier 1/2 capital and ratios, CET1, leverage and liquidity coverage ratios, net interest margin and spread, risk-weighted assets, non-performing loans
  • REIT metrics: funds from operations (basic/diluted/adjusted), net asset value and EPRA measures, with per-share variants

Retired data points
Morningstar no longer provides some series, or some reporting windows of them. Those members are kept so existing algorithms keep compiling, but they now carry [Obsolete] with the alternative and throw NotSupportedException with the same message when read:

DividendCoverageRatio.ThreeMonths was retired by Morningstar in 2026; use DividendCoverageRatio.TwelveMonths.
NormalizedDilutedEPSGrowth was retired by Morningstar in 2026 for all periods; no replacement is available.

GetPeriodValues() and HasValue never touch a retired member, and a field whose default window was retired reports a surviving one as its default.

No behaviour changes for data points that continue to be provided.

Accession number
EarningReports.AccessionNumber and FinancialStatements.AccessionNumber defaulted to OneMonth, a window Morningstar never populates, so HasValue was always false while Value resolved through the fallback; and neither had a TwelveMonths window, so a 10-K's accession number was never exposed although its file date and form type were. Both now default to ThreeMonths like the other filing-metadata fields and declare TwelveMonths, which the new feeds populate for every security.

Closes #9777

@Martin-Molinero
Martin-Molinero force-pushed the morningstar-edf-new-data-points branch 2 times, most recently from a13f304 to 4af1f0a Compare August 25, 2026 23:14
@Martin-Molinero
Martin-Molinero force-pushed the morningstar-edf-new-data-points branch from 4af1f0a to 52191ea Compare September 4, 2026 18:22
@Martin-Molinero
Martin-Molinero marked this pull request as ready for review September 16, 2026 18:04
Martin-Molinero and others added 26 commits September 17, 2026 10:40
IsSPAC, IsMLP, IsBDC and LEI exist as GEDF data ids 28 to 31 and are delivered
by the Equity Data Feeds, but Lean has never had properties for them, so the
converter had nowhere to put them and dropped them.

Verified against the delivered data: 274 companies flag as SPACs, 21 as master
limited partnerships and 57 as business development companies, and the MLP flag
picks out EPD, GEL, MMLP and ARLP. The LEIs match the registered identifiers,
Apple HWUPKR0MPOU8FGXBT394 and JPMorgan 8I5DZWZKVSZI1NUHU748.

Additive: no existing property changes, and the converter's mapping table is
generated by reflecting over these classes, so it picks them up with no change
to the reader.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GEDF data id 1007, delivered in BasicReference and never modelled. 10238 values
come through, correctly formed: ES0113211835 for BBVA, GB0031348658 for
Barclays. Only non US issuers are populated, because ISINs issued by CUSIP
Global Services are a separately licensed package the workbook excludes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GEDF data ids 20452 to 20461, delivered by the new feeds and never modelled:
disposals of businesses and assets, discontinued operations, goodwill and other
impairments, extinguishment of debt, debt restructuring, litigation, and merger
and acquisition income. British American Tobacco's goodwill impairment comes
through as -277,000,000.

Each is a four period field, three, six, nine and twelve months, following the
existing supplemental values. 20462 and 20463 are left out, the workbook maps
them to nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GEDF data id 40011, which sits with MarketCap and the shares outstanding Lean
already models in the 40000 range. Apple comes through at 4.56 trillion and
Microsoft at 3.71 trillion, equal to their undiluted figures as expected for
two companies with little dilution.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GEDF data id 2002, delivered by the BusinessDescription feed and never
modelled, alongside the addresses and market capitalisation already on
CompanyProfile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
GEDF data id 42006, delivered alongside the share counts Lean already models on
CompanyProfile. 8564 of the 8579 values sit at or below the shares outstanding
for the same security, which is what a float should do.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Distance to default and probability of default, the credit risk pair from the
grades feed; shell company and state of incorporation flags; full and part time
employee counts; treasury shares; and whether a security is in its IPO period.
Named by the Equity Data Feeds data definition document, ids 45001 to 45008.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Twenty two ratios the equity feeds ship in volume with no GEDF ancestor: the
diluted and normalized enterprise value ratios, total debt to enterprise value,
normalized earnings yield, and the one, five and ten year averages of the price
multiples and yields. Ids 45009 to 45030, named by the data definition document.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Thirty points the equity feeds carry and Lean had no home for: tier 1 and tier 2
capital and their ratios, common equity tier 1, the leverage and liquidity
coverage ratios, net interest margin and spread, risk weighted assets and non
performing loans; and for REITs the funds from operations family, net asset
value and the EPRA measures, each with its per share twin. Ids 45031 to 45060.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1,151 members that carried data under the old feeds and can never carry any
under the new ones: whole properties, individual reporting windows, and a few
reference scalars. Each keeps its shape so algorithms still compile, warns at
build time with the alternative, and throws NotSupportedException naming it at
run time. GetPeriodValues and HasValue never touch a throwing member, and a
field whose default window went moves its default to a surviving one.

Members whose feeds merely await entitlement are not touched: absence by
permission is not retirement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A whole property that the new feeds drop lost the windows that held data, but
the windows the old feeds had left empty stayed live and quietly returned
nothing, which read as still available. Every modelled window of such a
property now warns and throws, and the wording says in any period.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Retired by Morningstar in 2026, use X, or: for all periods, no replacement is
available. No feed migration, no since the.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Serializers and reflection walk every getter, so a throwing member now also
carries JsonIgnore, and the period walk no longer names a retired window in the
classes that format their tuples with a space. The QuantBook sample moves to a
surviving property.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MCUgFSo2atYSan5TEsvTcK
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FpBP5rey1DYetmkyS5qLmE
65 more period members, in 142 classes, existed in the data files but never carried
a value in the current feeds and carry none in the new ones: mostly one and two
month windows of statement items Morningstar does not fill. They get the same
warning and throwing getter as the retired members, six classes end up retired
for every window.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The annual filing's accession number was in the data for ~8,600 securities but
neither AccessionNumber field declared the window, so a 10-K accession was never
readable. Both fields get TwelveMonths, in the generator's layout; the other
undeclared windows in the data cover a handful of companies and stay out.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Both AccessionNumber fields defaulted to OneMonth, a slot Morningstar fills for
about 6% of the rows it fills ThreeMonths for, so HasValue was false on nearly
every row while Value fell back to the quarterly accession anyway, and the
accession could name a different filing than FileDate and FormType, which
default to ThreeMonths. Now all four describe the same document.

Fixes QuantConnect#9777.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…st securities

164 EQ codes present for ten thousand securities or more and never covered by
Morningstar's mapping workbooks become Lean properties keyed on the EQ code
itself: 40 operation ratios, 6 growth series with a code per window, 3 per share
growth series, 9 per share earnings figures, 20 valuation ratios and 72 statement
items (calculated items and level 3 lines). Windows are the ones the deliveries
carry. The 60 additions made earlier under placeholder ids 45001-45060 move onto
their EQ codes the same way. Sequential and four year growth windows are left
out, Lean has no period for them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Morningstar marks EQ1FM a poor match for OtherNonCashItems; the decision is to
keep the existing property fed rather than empty, so the twin goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
With the Financial Templates workbook mapped, 126 properties and 96 more
windows the September census had marked retired produce values again, so
their deprecations go: 555 retired bases become 437 including the never
populated ones, 729 members throw instead of 1,151. Pending-entitlement
feeds stay out of the map as before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The census of the production output shows DeferredCosts.OneMonth and
NonCurrentDeferredRevenue.TwoMonths carrying values; everything else in the
retired map holds.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
US REITs do not report the European EPRA measures, so every window of these
six classes from the REIT tranche was empty in production.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tions fill

The production census shows twenty windows whose new file never holds a value
(NetIncomeFromTaxLossCarryforward in every window, GainOnSaleOfPPE and
GainLossonSaleofAssets at three and nine months, TotalMoneyMarketInvestments
at six, and smaller ones): they throw like the other retired members. Six
members deprecated as never populated carry values now that their same-name
codes are mapped, so their deprecation goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The new feeds deliver the balance sheet, income statement and cash flow
statement on different days. FinancialStatements.PeriodEndingDate now moves
once every statement has reached the period, as the old feeds' single file
made it, and its documentation says so; BalanceSheet.BSPeriodEndingDate,
IncomeStatement.ISPeriodEndingDate and CashFlowStatement.CFPeriodEndingDate
carry each statement's own date for whoever wants the finer grain.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The statement class already says which statement the date belongs to, so the
BS, IS and CF prefixes only repeated it: BalanceSheet.PeriodEndingDate,
IncomeStatement.PeriodEndingDate and CashFlowStatement.PeriodEndingDate. The
merged FinancialStatements.PeriodEndingDate is dated by the filing the
statements were reported in, as before; its summary no longer describes a
consensus, which the data showed unnecessary.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Martin-Molinero and others added 9 commits September 17, 2026 10:40
…is that line

GeneralAndAdministrativeExpense (20045) was fed by the selling, general and
administrative total, so the general and administrative line EQSI9 had been
added beside it under a second name. The workbook was wrong: the old
property's values are EQSI9's (Microsoft fiscal 2021: 5,107M against the
25,224M total), so 20045 now reads that line and the duplicate goes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Audited against the previous generation's values, the workbook had sent
TotalExpenses, InterestExpense, InterestIncome, CapitalLeaseObligations,
OtherCurrentBorrowings, ImpairmentOfCapitalAssets, LossonExtinguishmentofDebt
and WriteOff to lines that reproduce none of their old values, and had
retired AdditionalPaidInCapital outright; the lines that do reproduce them
had been added beside under new names. Each old property now reads its line
and the second name goes: CostOfRevenueAndOperatingExpense,
InterestExpenseCalculated, InterestAndDividendIncome,
CapitalLeaseObligationsCalculated, CurrentPortionOfLongTermDebt,
ImpairmentWriteOffWriteDownOfCapitalAssetsAdjustment,
GainLossOnExtinguishmentOfDebtAdjustment,
WriteOffWriteDownOfOtherAssetsAdjustment, AdditionalPaidInCapitalSharePremium.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The migration retired these on the workbook's word: it named no new data
point for them. The value audit found the lines the feeds deliver them
under, and the census on the new output confirms the values are there, so
they read again: AdditionalPaidInCapital (49.4M cells), TotalInvestments,
HeldToMaturitySecurities, MoneyMarketInvestments, LoansReceivable,
CashAndDueFromBanks, BankIndebtedness, BankLoansTotal, ConvertibleLoansTotal,
AccruedandDeferredIncome, AccruedInterestReceivable, ComTreShaNum,
NotesReceivable, OtherReserves, ProceedsFromLoans, GainOnSaleOfPPE, the four
reported normalized figures and FinancialStatements.FileDate's one, two and
nine month windows. The windows the new feeds still leave empty stay
deprecated, and the two nine month windows neither generation ever filled
are deprecated for the first time.

The census gate now passes against Lean with no mismatch.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The complete 15 Sep census of the new output against the previous
generation shows values in 87 members the August deprecation had retired
on the workbook's word: StockBasedCompensation for 9,438 securities,
DepreciationAndAmortization and ReconciledDepreciation for 8,368,
ImpairmentOfCapitalAssets and LossonExtinguishmentofDebt for 9,438,
NormalizedEBITDA for 8,322, the bank interest income and expense lines
for 350 to 770, the insurance and cash flow detail lines for fewer.
Their period classes come back as they were before that commit and
the parents lose the attributes; the windows the new output still
leaves empty stay retired, 17 windows over 14 members.

TotalCapitalization comes back with them: it had no single code in the
new feeds, and the converter now carries it as the sum the workbook
gives, total equity plus long term debt, on the year end and quarter
windows.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The line the converter read for it reproduced about half the previous
generation's values and Morningstar recommends nothing for it, so the
mapping is dropped and the member reads as retired once more.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
They were still marked retired for all periods although the converter maps a line
of the new feeds to each and the latest census finds values for them; the windows
the new output leaves empty stay retired.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
54 members read a line of the new Morningstar feeds that is narrower, wider or
otherwise not what the summary said: a non-current portion where the doc said
total, net where it said gross, all debt where it said long term. The summaries
now follow Morningstar's definition of the line that fills them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Martin-Molinero
Martin-Molinero force-pushed the morningstar-edf-new-data-points branch from 7a52235 to cc56f2d Compare September 17, 2026 13:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fundamentals: AccessionNumber default period is OneMonth, so HasValue is always false (and no 12M slot for 10-K accessions)

1 participant