Dokumentation1.0 (latest)
SeitenFundamentaldaten · 11 / 29

Fundamentaldaten

In Arbeit: Fundamentaldaten sind noch nicht voll funktionsfähig. Die Nutzung dieser Funktion in der IDE oder in Backtests kann inkonsistente Fundamentaldaten liefern (fehlende Felder, abweichende Berichtsdaten oder instabile balkenausgerichtete Snapshots). Betrachten Sie die Ergebnisse als experimentell, bis eine künftige Version Fundamentaldaten als stabil kennzeichnet.

QuantCraft-Strategien können Unternehmensfinanzdaten neben den OHLCV-Kursbalken nutzen: Bilanzen, Kapitalflussrechnungen, Gewinn- und Verlustrechnungen sowie Ergebnishistorie / -schätzungen. Die Daten werden einmal pro Symbol vom QuantCraft-Fundamentaldatendienst geladen, als datumsindizierte Tabellen organisiert und Ihrer Strategie während eines Backtests als balkenausgerichtete Snapshots bereitgestellt. Das Timing der Callbacks folgt dem Strategie-Lebenszyklus; konfigurieren Sie Symbole und Daten in Test (Code ausführen).

Über die drei Abschlüsse hinaus erhalten Sie Kennzahlen (91 davon), Werte je Aktie, Bewertungsmultiplikatoren und -renditen sowie Qualitäts-Scores (Piotroski F, Altman Z-Prime, Beneish M) — alle Point-in-Time, alle optional. Sie werden symbolweise ausgerollt, sichern Sie also jeden Zugriff ab: raw["metricsInputs"] is None bedeutet, dass ein Paket älter ist als diese.

Diese Seite behandelt:

  • Welche Finanzberichtsdaten verfügbar sind
  • Wie datumsindizierte Tabellen organisiert sind
  • Wie balkenausgerichtete Nutzlasten während eines Backtests Ihre Callbacks erreichen

Verwandt: Globale Fama-French-Faktorrenditen-Datensätze (nicht pro Ticker) sind eine eigene Funktion — siehe Fama-French-Faktoren (fama_french.qc, kein Callback-Argument). Faktor-rows sind über YYYYMM-Strings indiziert, nicht über Listenindizes.


Was Sie erhalten

Jedes Fundamentaldaten-Paket ist ein einzelnes JSON-Objekt für einen Ticker und enthält:

  • Bilanz — quarterly- und yearly-Berichte.
  • Kapitalfluss — quarterly- und yearly-Berichte.
  • Gewinn- und Verlustrechnung — quarterly- und yearly-Berichte.
  • Ergebnisse (Earnings):
    • History — gemeldetes EPS vs. Schätzungen und Überraschungen nach Berichtsdatum.
    • Trend — Vorwärtsschätzungen, EPS-Trend und Analystenrevisionen.
    • Annual — epsActual pro Geschäftsjahr.
  • Kennzahlen (Ratios) — quarterly- und yearly-Finanzkennzahlen (Margen, Renditen, Liquidität, Verschuldung).
  • Financials extended — erweiterte quarterly- und yearly-Kennzahlen, die nicht in den Kernabschlüssen (GuV, Bilanz, Kapitalfluss) enthalten sind.
  • Je Aktie — quarterly- und yearly-Werte je Aktie wie eingereicht (Aktienanzahl auf der Split-Basis dieser Periode).
  • Bewertung — quarterly- und yearly-Marktkapitalisierung, Enterprise Value, Multiplikatoren und Renditen sowie ein datumsloses latest-Objekt.
  • Scores — quarterly- und yearly-Piotroski-F, Altman-Z-Prime und Beneish-M sowie notApplicableReason.
  • TTM — ein einzelnes Trailing-Twelve-Month-Objekt (nicht nach Periode gruppiert).
  • Kennzahlen-Herkunft — flache Objekte metricsInputs / metricsHealth. metricsInputs ist None bei einem Paket, das älter ist als die Kennzahlen-Erweiterung.
  • Einreichungshistorie — quarterly- und yearly-Einreichungsmetadaten (Formulartyp, Einreichungsdatum, indiziert nach Periodenende). Auch in balkenausgerichteten current(...)-Snapshots enthalten, sofern im Paket vorhanden; Rohtabellen bleiben über f.tables["filingHistory.quarterly"] verfügbar.
  • Unternehmensinformationen — flache Entitätsmetadaten (Name, CIK, SIC, Adresse, Börsen, Ticker). Nicht datumsindiziert und nicht in balkenausgerichteten Snapshots; Zugriff über f.raw["companyInfo"].

Jeder Bericht ist eine Zeile mit camelCase-Kennzahlen — zum Beispiel totalAssets, cash, freeCashFlow, totalRevenue, netIncome, epsActual, epsEstimate, surprisePercent. Numerische Werte können im zugrunde liegenden JSON als Strings ankommen, und jedes fehlende Feld wird als None zurückgegeben.

Ein bestimmter Ticker legt möglicherweise nicht jeden Abschnitt offen. Im Fundamentals Coverage Explorer sehen Sie, welche Felder für einen Ticker verfügbar sind.


Datumsindizierte Tabellen

Für jeden obigen Abschnitt sind die Fundamentaldaten als datumsindizierte Tabelle organisiert: Zeilen sind nach Berichtsdatum (YYYY-MM-DD) indiziert, und die Kennzahlen werden als parallele Listen bereitgestellt, die Sie wie eine Kurshistorie indizieren können.

Die Standard-Tabellenpfade sind:

PfadBedeutung
balanceSheet.quarterly / balanceSheet.yearlyBilanz-Snapshots
cashFlow.quarterly / cashFlow.yearlyKapitalflussrechnungen
incomeStatement.quarterly / incomeStatement.yearlyGewinn- und Verlustrechnungen
earnings.HistoryGemeldetes EPS, Schätzungen, Überraschung pro Bericht
earnings.TrendAnalystenschätzungen, EPS-Trend, Revisionen
earnings.AnnualJährliches epsActual
ratios.quarterly / ratios.yearlyFinanzkennzahlen (Margen, Renditen, Liquidität, Verschuldung)
financialsExtended.quarterly / financialsExtended.yearlyErweiterte Finanzkennzahlen
perShare.quarterly / perShare.yearlyWerte je Aktie (wie eingereicht)
valuation.quarterly / valuation.yearlyBewertungsmultiplikatoren und -renditen
scores.quarterly / scores.yearlyPiotroski / Altman / Beneish
filingHistory.quarterly / filingHistory.yearlyEinreichungsmetadaten (Formulartyp, Einreichungsdatum)

Keine Tabellen. valuation.latest, scores.notApplicableReason, ttm, metricsInputs, metricsHealth und companyInfo sind nicht datumsindiziert und fehlen daher in tables, lists und jedem Snapshot zur Balkenzeit — das ist Absicht:

Keine TabelleWarum
valuation.latestEin einzelnes Objekt neben den Datumsschlüsseln, keine Periode
scores.notApplicableReasonEin String neben den Datumsschlüsseln
ttmEin einzelnes Objekt; die Werte sind Skalare statt Zeilen-Dicts
metricsInputs / metricsHealthFlache Herkunftsobjekte
companyInfoFlache Entitätsmetadaten

Alle diese gelten Stand Upload statt pro Periode; sie aus tables herauszuhalten hält sie auch aus jedem Snapshot zur Balkenzeit heraus — ein Backtest kann also nicht versehentlich den heutigen Kurs von einem Balken aus 2019 lesen. Greifen Sie stattdessen über f.raw darauf zu. Ein leerer Block ({"quarterly": {}, "yearly": {}}, so sehen die scores eines Finanzsektor-Einreichers aus) registriert gar keine Tabelle.

Index-Konvention: neueste zuerst

In jeder dieser Tabellen ist Index 0 die jüngste zulässige Periode, Index 1 die vorherige, und so weiter. Das entspricht der Funktionsweise von Kursserien im Rest von QuantCraft.

Wenn Sie ein Paket direkt laden möchten (zum Beispiel außerhalb eines Backtests), sieht die Grundform so aus:

from quantcraft.fundamentals import QcFundamentals f = QcFundamentals(token, "fundamentals/AAPL.json.gz") latest_total_assets = f.tables["balanceSheet.quarterly"]["totalAssets"][0] prior_total_assets = f.tables["balanceSheet.quarterly"]["totalAssets"][1] same = f.lists["balanceSheet.quarterly.totalAssets"][0] whole = f.raw

Was Sie von einem geladenen Paket lesen können:

AttributWas es liefert
f.rawDer vollständige dekodierte JSON-Baum.
f.symbolAufgelöster Ticker (z. B. "AAPL").
f.tablesDict von DateKeyedTable-Objekten, indiziert über Punktpfad (z. B. "balanceSheet.quarterly").
f.table(path)Komfortzugriff auf eine einzelne DateKeyedTable.
f.listsFlache Zuordnung, indiziert über "<tablePath>.<fieldName>", Werte neueste zuerst ausgerichtet.

Eine DateKeyedTable stellt periods (die YYYY-MM-DD-Schlüssel, neueste zuerst), columns (Feld → Werte) bereit und unterstützt die Indizierung table["fieldName"].

Felder zur Laufzeit entdecken ist einfach: sorted(f.lists.keys()) zeigt jede flache Serie, und sorted(t.columns.keys()) zeigt die Spalten einer Tabelle — nützlich, wenn ein Server Felder hinzufügt oder entfernt.


Balkenausgerichtete Nutzlasten in Backtests

In einem Backtest lesen Sie Fundamentaldaten nicht als Rohtabellen — die Engine wählt den passenden Bericht für den aktuellen Balken und übergibt ihn Ihren Callbacks als Snapshot. Das heißt balkenausgerichtete Nutzlast.

Fundamentaldaten für einen Backtest konfigurieren

Im Tab Symbol & data von Run backtest:

  1. Aktivieren Sie Uses fundamentals (select if your strategy requires fundamental data) (erfordert Anmeldung — QuantCraft sendet Ihr Sitzungstoken, um B2-Fundamentaldaten-Dateien zu laden). Bulk- und Chart-Forward-Läufe nennen es Use fundamentals (optional). Das Kontrollkästchen wird angezeigt, wenn Fundamentaldaten-Funktionen in Ihrem Build verfügbar sind, ist aber deaktiviert (mit Premium-Hinweis), sofern Sie nicht Premium haben oder der Gratisdaten-Zugang aktiviert ist.
  2. Wählen Sie ein oder mehrere Fundamentaldaten-Pakete aus der Mehrfachauswahl (Pfade wie fundamentals/AAPL.json.gz).

Mit einer Screener-Symbolquelle (Backtest) oder einem Screener-Ziel (Bulk-Läufe in AutoTrading / QuantCloud) müssen Sie nichts auswählen: Aktivieren Sie Fundamentaldaten, und jedes vom Screen gewählte Symbol erhält sein eigenes Paket, sodass fundamentals.current(bar["t"], symbol=symbol) für jedes funktioniert. Die Pakete stammen aus dem eigenen Download des Screeners (nichts wird doppelt abgerufen), und ein Symbol, das der Screener noch nicht heruntergeladen hat, wird einmal abgerufen und behalten. In einem Live-Lauf folgen die Pakete jedem erneuten Screen. Manuelle Auswahlen werden weiterhin als Extras akzeptiert (z. B. ein Benchmark-Ticker). Ein Symbol, dessen Daten nicht geladen werden können, liefert None, statt den Lauf scheitern zu lassen — der Output-Bereich gibt aus, wie viele geladen wurden.

OHLCV-Symbole und Fundamentaldaten-Symbole sind unabhängig. Sie können RNMBY über den Broker-Feed backtesten, während Sie die Fundamentaldaten von RHM.XETRA laden — übergeben Sie im Code den richtigen Ticker an fundamentals.current(..., symbol="RHM.XETRA") (oder Entsprechendes).

Sind mehrere Pakete ausgewählt, nutzen Sie ein explizites symbol= bei fundamentals.current / get_data_with_offset, wenn Sie ein bestimmtes Paket brauchen. Das primäre Paket für balkenausgerichtete Snapshots ist standardmäßig das erste OHLCV-Symbol in Ihrer Symbolliste, sofern die Engine keine andere Regel anwendet.

Für Low-Level-Tabellenzugriff außerhalb von Callbacks nutzen Sie qc_fundamentals aus quantcraft.process.runtime, wenn es nicht None ist (z. B. qc_fundamentals.raw["companyInfo"]). Es hält nur das primäre Paket; nutzen Sie für jeden anderen Ticker das Callback-Handle fundamentals mit symbol=.

Sind Fundamentaldaten nicht konfiguriert, übergibt die Engine einfach fundamentals=None an Ihre Callbacks, und Sie sichern das mit einer Prüfung ab.

Point-in-Time (Backtest): Sowohl die Backtest-Engine als auch Debug Test konstruieren BacktestFundamentals(..., backtest_mode=True), daher nutzen current / get_data_with_offset Einreichungsdatum-Gating (use_filing_date=True) — eine Periode wird ausgeschlossen, wenn ihr filing_date nach der Balkenzeit liegt. Hat eine Periode kein nutzbares filing_date, wird stattdessen eine angenommene Einreichungsfrist verwendet — 45 Tage nach Periodenende bei Quartalstabellen, 90 Tage bei Jahrestabellen (default_filing_lag_days) —, statt den Bericht an dem Tag sichtbar zu machen, an dem seine Periode schließt. Forward-Läufe verwenden die Periodenende-Zulässigkeit (backtest_mode=False). Bevorzugen Sie in IDE-Backtests das Callback-Handle fundamentals; der direkte Aufruf von qc_fundamentals.get_data_with_offset(...) ohne use_filing_date=True kann gegenüber Einreichungsdaten vorausschauen.

Forward-Läufe: Ein Live-Lauf lädt seine Fundamentaldaten etwa stündlich neu und innerhalb von etwa 5 Minuten, nachdem die Daten des Screeners aktualisiert wurden. Ein fehlgeschlagenes Neuladen behält die vorherigen Daten. Da das „Jetzt“ eines Forward-Laufs wirklich heute ist, sind die Blöcke Stand Upload (raw["ttm"], raw["valuation"]["latest"], …) dort aktuelle Daten, kein Look-ahead.

Alte Callbacks: Ältere Strategien nutzen möglicherweise ein separates Argument qc_fundamentals oder ein rohes Dict statt BacktestFundamentals. Die moderne Signatur übergibt fundamentals als drittes Argument an on_bar / on_tick. Der Modul-Alias fundamentals_as_of_bar entspricht derselben balkenausgerichteten Nutzlastform.

Der Callback-Parameter fundamentals

Sind Fundamentaldaten geladen, übergibt die Engine ein BacktestFundamentals-Handle als Argument fundamentals an on_bar, on_tick und (bei Verwendung in Forward-Läufen) on_timer:

def on_bar(bar_index, bar, fundamentals=None, symbol=None): if fundamentals is None: return snap = fundamentals.current(bar["t"]) bs_q = (snap.get("balanceSheet") or {}).get("quarterly") or {} total_assets = bs_q.get("totalAssets")
Methode / MemberZweck
fundamentals.current(bar_time, symbol=None)Snapshot-Dict zu dieser Balkenzeit (im Backtest nach Einreichungsdatum gefiltert). Das optionale symbol wählt das geladene Paket; weglassen für das primäre. Enthält filingHistory, wenn im Paket vorhanden.
fundamentals.get_data_with_offset(bar_time, offset, *, symbol=None, print_on_shortfall=True)N-te frühere Periode pro Untertabelle für das gewählte Paket (gleicher Einreichungsdatum-Modus wie current).
fundamentals.symbolsTupel der Großbuchstaben-Schlüssel jedes geladenen Pakets.
fundamentals.primary_symbol()Primärer Schlüssel, der verwendet wird, wenn symbol weggelassen wird.
fundamentals.reload_all()Lädt jedes Paket neu herunter. Forward-Läufe rufen dies für Sie auf; Sie brauchen es selten.

Wie der Snapshot aussieht

Ein balkenausgerichteter Snapshot ist ein verschachteltes Dict mit nur den Perioden, die zu diesem Balken gültig sind (in IDE-Backtests nach Einreichungsdatum gefiltert). Jeder nicht-null-Abschnitt enthält ein periodEnd plus die Kennzahlen des Berichts:

{ "barTime": "2026-06-01T00:00:00+00:00", "symbol": "AAPL", "balanceSheet": { "quarterly": { "periodEnd": "2026-03-31", "totalAssets": 352000000.0, "cash": 51000000.0 }, "yearly": { "periodEnd": "2025-09-30", "totalAssets": 344000000.0 } }, "cashFlow": { "quarterly": { "periodEnd": "2026-03-31", "freeCashFlow": 24500000.0 } }, "incomeStatement": { "quarterly": { "periodEnd": "2026-03-31", "totalRevenue": 95000000.0, "netIncome": 23000000.0 } }, "earnings": { "History": { "periodEnd": "2026-03-31", "reportDate": "2026-05-02", "epsActual": 1.53 }, "Trend": null, "Annual": { "periodEnd": "2025-09-30", "epsActual": 6.13 } }, "ratios": { "quarterly": { "periodEnd": "2026-03-31", "grossMargin": 0.47, "operatingMargin": 0.31, "currentRatio": 1.04 }, "yearly": { "periodEnd": "2025-09-30", "grossMargin": 0.46, "currentRatio": 0.87 } }, "financialsExtended": { "quarterly": { "periodEnd": "2026-03-31", "ebitda": 38000000000.0, "ebitdaMargin": 0.40 }, "yearly": { "periodEnd": "2025-09-30", "ebitda": 134000000000.0 } }, "perShare": { "quarterly": { "periodEnd": "2026-03-31", "bookValuePerShare": 4.3, "grahamNumber": null }, "yearly": null }, "valuation": { "quarterly": { "periodEnd": "2026-03-31", "marketCap": 3812000000.0, "priceToEarningsRatio": null, "earningsYield": -5.0, "priceBasis": "split-adjusted", "approximate": true }, "yearly": null }, "scores": { "quarterly": { "periodEnd": "2026-03-31", "piotroskiFScore": 3, "beneishMScore": -1.94 }, "yearly": null }, "filingHistory": { "quarterly": { "periodEnd": "2026-03-31", "formType": "10-Q", "filedAt": "2026-05-02" }, "yearly": { "periodEnd": "2025-09-30", "formType": "10-K", "filedAt": "2025-10-31" } } }

Trend kann null sein, wenn zur Balkenzeit oder davor keine Periode in Frage kommt. Das priceToEarningsRatio: null neben earningsYield: -5.0 oben ist ein Verlustunternehmen, kein fehlender Wert — siehe Bewertung.

Nie im Snapshot: ttm, valuation.latest, scores.notApplicableReason, metricsInputs, metricsHealth, companyInfo. Sie gelten Stand Upload statt pro Periode; sie an einen Balken zu hängen würde zukünftige Information in einen Backtest durchsickern lassen. Lesen Sie sie aus qc_fundamentals.raw[...].

Dasselbe Dict pro Balken erscheint im Feld fundamentals jeder Zeile im strukturierten Backtest-Ergebnis, sodass das, was Sie in Ihrer Strategie sehen, mit dem übereinstimmt, was in den Ergebnisdaten steht.

Ältere Perioden nachschlagen (get_data_with_offset)

Manchmal möchten Sie nicht den neuesten Bericht zu einer Balkenzeit, sondern einen früheren — das vorige Quartal, das vorige Geschäftsjahr, die vorige Ergebniszeile:

prior = fundamentals.get_data_with_offset(bar["t"], 1) prev_bs_q = (prior or {}).get("balanceSheet", {}).get("quarterly")

Verhalten:

  • Jede Untertabelle wird unabhängig indiziert. Mit offset=1 geht der Abschnitt balanceSheet.quarterly ein Quartal zurück, während balanceSheet.yearly ein Geschäftsjahr zurückgeht, und so weiter.
  • Hat eine Untertabelle vor dem aktuellen Balken nicht genug Historie, ist ihr Abschnitt im zurückgegebenen Dict null (und eine einzeilige Notiz kann ausgegeben werden).
  • Die Form entspricht current(...), plus ein "offset": <int> auf oberster Ebene.
  • Bei der rohen QcFundamentals-API lautet die bevorzugte Signatur f.get_data_with_offset(bar_time, offset, *, print_on_shortfall=True, use_filing_date=False). Die Modulfunktion get_data_with_offset(qc, bar_time, offset, *, print_on_shortfall=True) hat keinen Parameter use_filing_date — sie verwendet immer die Periodenende-Zulässigkeit; rufen Sie also die Methode mit use_filing_date=True auf (oder nutzen Sie das Callback-Handle) für Point-in-Time-Daten. Der Standard use_filing_date=False bedeutet nur Periodenende-Zulässigkeit (kann gegenüber Einreichungsdaten vorausschauen). Mit use_filing_date=True fällt eine Periode, deren filing_date fehlt, auf eine angenommene Frist von 45 Tagen (quartalsweise) / 90 Tagen (jährlich) nach Periodenende zurück. Bevorzugen Sie in IDE-Backtests das Callback-Handle fundamentals, das das Einreichungsdatum-Gating automatisch nutzt.

Fundamentaldaten bei mehreren Symbolen

Wenn Sie mehrere Pakete laden (für Cross-Sectional- oder Vergleichsstrategien), können Sie mit symbol="TICKER" wählen, aus welchem Sie lesen:

def on_bar(bar_index, bar, fundamentals=None, symbol=None): if fundamentals is None: return primary_snap = fundamentals.current(bar["t"]) msft_snap = fundamentals.current(bar["t"], symbol="MSFT") aapl_prior = fundamentals.get_data_with_offset(bar["t"], 1, symbol="AAPL")
  • Das Weglassen von symbol nutzt das primäre Paket: das einzige geladene; sonst fundamentals.primary, falls gesetzt, sonst das gehandelte Symbol, sonst den alphabetisch ersten geladenen Ticker. Bei einem Multi-Symbol- oder Screener-Lauf kann dieser Rückfall stillschweigend das falsche Unternehmen sein — übergeben Sie dort immer symbol=symbol.
  • fundamentals.symbols listet jeden aktuell geladenen Ticker-Schlüssel in Großbuchstaben.
  • fundamentals.primary_symbol() gibt den primären Schlüssel zurück.
  • Das im Backtest gehandelte Symbol kann sich von den Fundamentaldaten-Symbolen unterscheiden, die Sie laden — zum Beispiel SPY handeln und dabei die Fundamentaldaten von AAPL und MSFT lesen.

Zulässige Balkenzeiten

Sowohl current(...) als auch get_data_with_offset(...) akzeptieren mehrere Zeitformate, sodass Sie bar["t"], bar.t[0] oder einen eigenen Wert übergeben können:

  • datetime (naive werden als UTC behandelt),
  • date,
  • ISO-String (einschließlich eines abschließenden Z),
  • UNIX-Epoch-Sekunden (int / float).

Praktische Muster

Einige gängige Formen:

def on_bar(bar_index, bar, fundamentals=None, symbol=None): if fundamentals is None: return snap = fundamentals.current(bar["t"]) if not snap: return bs_q = (snap.get("balanceSheet") or {}).get("quarterly") or {} is_q = (snap.get("incomeStatement") or {}).get("quarterly") or {} if (bs_q.get("totalAssets") or 0) > 0 and (is_q.get("netIncome") or 0) > 0: ...
def on_bar(bar_index, bar, fundamentals=None, symbol=None): if fundamentals is None: return snap = fundamentals.current(bar["t"]) or {} prior = fundamentals.get_data_with_offset(bar["t"], 1) or {} cur = ((snap.get("incomeStatement") or {}).get("quarterly") or {}).get("totalRevenue") prev = ((prior.get("incomeStatement") or {}).get("quarterly") or {}).get("totalRevenue") if cur and prev: revenue_growth = (cur - prev) / prev

Fundamentaldaten-Feldreferenz

Die Verfügbarkeit der Felder hängt vom Symbol ab — nicht jeder Emittent meldet jede Zeile. Nutzen Sie zur Laufzeit sorted(f.lists.keys()) oder sorted(t.columns.keys()), um zu sehen, was ein bestimmtes Paket tatsächlich bereitstellt. Numerische Werte können als Strings ankommen; wandeln Sie sie für Rechnungen mit float(...) um.

Bilanz

Tabellen: balanceSheet.quarterly, balanceSheet.yearly

FeldFeld
accountsPayablelongTermInvestments
accumulatedAmortizationnegativeGoodwill
accumulatedDepreciationnetDebt
accumulatedOtherComprehensiveIncomenetInvestedCapital
additionalPaidInCapitalnetReceivables
capitalLeaseObligationsnetTangibleAssets
capitalStocknetWorkingCapital
capitalSurplusenoncontrollingInterestInConsolidatedEntity
cashnonCurrrentAssetsOther
cashAndEquivalentsnonCurrentAssetsTotal
cashAndShortTermInvestmentsnonCurrentLiabilitiesOther
commonStocknonCurrentLiabilitiesTotal
commonStockSharesOutstandingotherAssets
commonStockTotalEquityotherCurrentAssets
currency_symbolotherCurrentLiab
currentDeferredRevenueotherLiab
dateotherStockholderEquity
deferredLongTermAssetChargespreferredStockRedeemable
deferredLongTermLiabpreferredStockTotalEquity
earningAssetspropertyPlantAndEquipmentGross
filing_datepropertyPlantAndEquipmentNet
goodWillpropertyPlantEquipment
intangibleAssetsretainedEarnings
inventoryretainedEarningsTotalEquity
liabilitiesAndStockholdersEquityshortLongTermDebt
longTermDebtshortLongTermDebtTotal
longTermDebtTotalshortTermDebt
shortTermInvestmentstemporaryEquityRedeemableNoncontrollingInterests
totalAssetstotalCurrentAssets
totalCurrentLiabilitiestotalLiab
totalPermanentEquitytotalStockholderEquity
treasuryStockwarrants

Kapitalfluss

Tabellen: cashFlow.quarterly, cashFlow.yearly

FeldFeld
beginPeriodCashFlowendPeriodCashFlow
capitalExpendituresexchangeRateChanges
cashAndCashEquivalentsChangesfiling_date
cashFlowsOtherOperatingfreeCashFlow
changeInCashinvestments
changeInWorkingCapitalissuanceOfCapitalStock
changeReceivablesnetBorrowings
changeToAccountReceivablesnetIncome
changeToInventoryotherCashflowsFromFinancingActivities
changeToLiabilitiesotherCashflowsFromInvestingActivities
changeToNetincomeotherNonCashItems
changeToOperatingActivitiessalePurchaseOfStock
currency_symbolstockBasedCompensation
datetotalCashflowsFromInvestingActivities
depreciationtotalCashFromFinancingActivities
dividendsPaidtotalCashFromOperatingActivities

Gewinn- und Verlustrechnung

Tabellen: incomeStatement.quarterly, incomeStatement.yearly

FeldFeld
costOfRevenuenetIncomeFromContinuingOps
currency_symbolnetInterestIncome
datenonOperatingIncomeNetOther
depreciationAndAmortizationnonRecurring
discontinuedOperationsoperatingIncome
effectOfAccountingChargesotherItems
ebitotherOperatingExpenses
ebitdapreferredStockAndOtherAdjustments
extraordinaryItemsreconciledDepreciation
filing_dateresearchDevelopment
grossProfitsellingAndMarketingExpenses
incomeBeforeTaxsellingGeneralAdministrative
incomeTaxExpensetaxProvision
interestExpensetotalOperatingExpenses
interestIncometotalOtherIncomeExpenseNet
minorityInteresttotalRevenue
netIncome
netIncomeApplicableToCommonShares

Ergebnisse — History

Tabelle: earnings.History (gemeldetes EPS vs. Schätzungen pro Berichtsdatum)

FeldBeschreibung
beforeAfterMarketWann der Bericht relativ zu den Handelszeiten veröffentlicht wurde
currencyBerichtswährung
datePeriodenende-Datum
epsActualGemeldetes EPS
epsEstimateKonsens-EPS-Schätzung
epsDifferenceepsActual − epsEstimate
reportDateDatum, an dem die Zahlen gemeldet wurden
surprisePercentEPS-Überraschung in Prozent

Ergebnisse — Trend

Tabelle: earnings.Trend (Vorwärtsschätzungen und Revisionen)

FeldFeld
dateepsTrendCurrent
periodepsTrend7daysAgo
growthepsTrend30daysAgo
earningsEstimateAvgepsTrend60daysAgo
earningsEstimateLowepsTrend90daysAgo
earningsEstimateHighepsRevisionsUpLast7days
earningsEstimateYearAgoEpsepsRevisionsUpLast30days
earningsEstimateNumberOfAnalystsepsRevisionsDownLast7days
earningsEstimateGrowthepsRevisionsDownLast30days
revenueEstimateAvg
revenueEstimateLow
revenueEstimateHigh
revenueEstimateYearAgoEps
revenueEstimateNumberOfAnalysts
revenueEstimateGrowth

Ergebnisse — Annual

Tabelle: earnings.Annual (jährliches gemeldetes EPS)

FeldBeschreibung
dateGeschäftsjahresende-Datum
epsActualGemeldetes Jahres-EPS

Kennzahlen (Ratios)

Tabellen: ratios.quarterly, ratios.yearly

91 Kennzahlen seit der Kennzahlen-Erweiterung (94 Schlüssel, zählt man date, currency_symbol und filing_date mit). Zuerst steht der ursprüngliche Satz; alles ab Working Capital ist neu. Ein Symbol mitten im Rollout trägt möglicherweise nur den ursprünglichen Satz, ermitteln Sie die tatsächliche Liste daher mit sorted(f.table("ratios.quarterly").columns.keys()).

Ursprünglicher Satz

Marge- und Renditefelder in dieser Gruppe (grossMargin, operatingMargin usw.) sind Dezimalbrüche — mit 100 multiplizieren für Prozent. debtToEquity wurde in debtToEquityRatio umbenannt.

FeldFeld
grossMargincurrentRatio
operatingMarginquickRatio
netProfitMargincashRatio
returnOnAssetsdebtToEquityRatio
returnOnEquitydebtToAssetsRatio
operatingCashFlowMargininterestCoverageRatio
freeCashFlowMarginassetTurnover
freeCashFlowToNetIncomeinventoryTurnover
receivablesTurnover

Working Capital

FeldHinweise
daysSalesOutstandingTage, 2 Dez.
daysInventoryOutstandingTage, 2 Dez.
daysPayablesOutstandingTage, 2 Dez.
cashConversionCycleTage, 2 Dez. — mit Vorzeichen; negativ (einnehmen, bevor man zahlt) ist wünschenswert, kein Fehler
operatingCycleTage, 2 Dez.
payablesTurnoverEinfache Dezimalzahl
workingCapitalTurnoverEinfache Dezimalzahl
fixedAssetTurnoverEinfache Dezimalzahl
netWorkingCapitalToAssetsEinfache Dezimalzahl
defensiveIntervalRatioEinfache Dezimalzahl

Verschuldung und Deckung

Alle einfache Dezimalzahlen (4 Dez.).

FeldFeld
totalDebtToEquityRationetDebtToFreeCashFlowRatio
netDebtToEquityRatioequityMultiplier
longTermDebtToEquityRatioebitdaInterestCoverageRatio
longTermDebtToCapitalRatiocashFlowInterestCoverageRatio
capitalizationRatiocashFlowToDebtRatio
debtToEbitdaRatiodebtServiceCoverageRatio
netDebtToEbitdaRatio

Renditen

FeldHinweise
effectiveTaxRate%
returnOnInvestedCapital%
returnOnCapitalEmployed%
returnOnTangibleEquity%
cashReturnOnInvestedCapital%
operatingReturnOnAssets%
returnOnEquityDupontMargin%
returnOnEquityDupontTurnoverEinfache Dezimalzahl
returnOnEquityDupontLeverageEinfache Dezimalzahl
nopatGeldbetrag-String, 2 Dez. — der Ausreißer in einem sonst durchweg numerischen Block
investedCapitalGeldbetrag-String, 2 Dez.
capitalEmployedGeldbetrag-String, 2 Dez.

Margen und Kapitalintensität

FeldHinweise
ebitMargin%
ebitdaMargin%
pretaxMargin%
researchAndDevelopmentToRevenue%
sellingGeneralAdministrativeToRevenue%
stockBasedCompensationToRevenue%
capexToRevenue%
capexToOperatingCashFlow%
accrualsRatio%
assetQualityRatio%
capexToDepreciationRatioEinfache Dezimalzahl (4 Dez.)
cashConversionRatioEinfache Dezimalzahl (4 Dez.)

Ausschüttung

Alle Prozentwerte (2 Dez.): dividendPayoutRatio, freeCashFlowPayoutRatio, shareholderPayoutToFreeCashFlow, retentionRatio, sustainableGrowthRate.

Wachstum, Jahr über Jahr

Alle Prozentwerte (2 Dez.). Umsatz- / Nettoergebnis- / EPS-Wachstum sind hier nicht dupliziert — sie stehen in earnings.Trend.

FeldFeld
grossProfitGrowthYoYtotalAssetsGrowthYoY
operatingIncomeGrowthYoYtotalStockholderEquityGrowthYoY
ebitdaGrowthYoYtotalDebtGrowthYoY
operatingCashFlowGrowthYoYdividendsPaidGrowthYoY
freeCashFlowGrowthYoYsharesDilutedGrowthYoY — negativ bedeutet Aktienrückkäufe
capitalExpendituresGrowthYoYbookValuePerShareGrowthYoY

CAGRs — nur yearly

Alle Prozentwerte (2 Dez.) und null in jeder quarterly-Periode — ein Filter oder eine Regel, die eines davon für eine Quartalsperiode verlangt, lässt jedes Symbol durchfallen.

revenueCagr3y / revenueCagr5y, netIncomeCagr3y / netIncomeCagr5y, epsCagr3y / epsCagr5y, freeCashFlowCagr3y / freeCashFlowCagr5y, dividendCagr3y / dividendCagr5y.

Financials extended

Tabellen: financialsExtended.quarterly, financialsExtended.yearly

Die Felder variieren je Symbol und sind hier nicht aufgezählt. Ermitteln Sie zur Laufzeit, was ein geladenes Paket bereitstellt:

t = f.table("financialsExtended.quarterly") if t: print(sorted(t.columns.keys()))

Zu den üblichen Feldern gehören erweiterte EBITDA-Kennzahlen, Working-Capital-Komponenten und Werte je Aktie, die nicht in der Kern-GuV enthalten sind.

Ausgemusterte Felder: ebitda, ebitdaMargin, enterpriseValue, priceToEarnings, priceToBook, priceToSales, evToEbitda und evToRevenue werden aus Financials extended zugunsten der Versionen in Bewertung und Kennzahlen zurückgezogen, die auf Trailing-Twelve-Month-Basis berechnet werden (die Werte unterscheiden sich daher).

Je Aktie

Tabellen: perShare.quarterly, perShare.yearly

Ein Datensatz wie eingereicht: sharesOutstanding liegt auf der Split-Basis, die für diese Periode gemeldet wurde, und ist daher über eine Split-Grenze hinweg nicht vergleichbar. Nutzen Sie Bewertung für alles Vergleichende. Werte sind 4-Dezimalstellen-Strings, sofern nicht anders angegeben.

FeldHinweise
datePeriodenende-Datum
sharesOutstandingString mit 2 Dezimalstellen
sharesBasis"dei" / "weightedAverageSharesDiluted" / "weightedAverageSharesBasic"
bookValuePerShare, tangibleBookValuePerShare
revenuePerShare, ebitdaPerShare
operatingCashFlowPerShare, freeCashFlowPerShare
cashPerShare, netCashPerShare
netDebtPerShare, totalDebtPerShare
workingCapitalPerShare, retainedEarningsPerShare
dividendsPaidPerShare
netCurrentAssetValuePerShareGraham-NCAV
grahamNumber

Bewertung

Tabellen: valuation.quarterly, valuation.yearly (plus das Nicht-Tabellen-Objekt valuation.latest)

Drei Regeln:

  1. Multiplikatoren sind marketCap / Aggregat, nicht price / perShare. Berechnen Sie sie nicht aus perShare neu — angepasste Vergleichswerte lassen beide bei älteren Perioden auseinanderlaufen.
  2. Ein None-Multiplikator neben einer Rendite mit Vorzeichen ist korrekt, kein Fehler. Die unten als null bei nicht positivem Nenner markierten Multiplikatoren werden None, wenn ihr Nenner nicht positiv ist, während Renditen und bookToMarketRatio ihr Vorzeichen behalten. Ein Verlustunternehmen zeigt priceToEarningsRatio: None und earningsYield: -5.0.
  3. Multiplikatoren sind Trailing-Twelve-Month, auch bei Quartalsperioden — ein Quartals-KGV ist ein echtes Trailing-KGV, kein annualisiertes Quartal.

Metadaten

FeldHinweise
datePeriodenende-Datum
sharePriceString mit 4 Dezimalstellen
priceDateYYYY-MM-DD
priceLagDaysGanzzahl
priceBasis"as-quoted" (neuester) / "split-adjusted" / "unreconciled" — seien Sie bei "unreconciled" misstrauisch
approximatetrue bei historischen Perioden (Rest-Dividendenrückanpassung)
sharesRebasedDie Aktienanzahl wurde auf die aktuelle Split-Basis umgestellt
sharesOutstandingString mit 2 Dezimalstellen, aktuelle Split-Basis — weicht bei älteren Perioden von perShare.sharesOutstanding (wie eingereicht) ab

Größe: marketCap, enterpriseValue — Geldbetrag-Strings mit 2 Dezimalstellen.

Multiplikatoren (Zahlen mit 4 Dezimalstellen)

FeldNull bei nicht positivem Nenner
priceToEarningsRatioja
priceToBookRatioja
priceToTangibleBookRatioja
priceToSalesRatio
priceToFreeCashFlowRatioja
priceToOperatingCashFlowRatioja
pegRatioTrailingja
enterpriseValueToEbitdaRatioja
enterpriseValueToEbitRatioja
enterpriseValueToSalesRatio
enterpriseValueToFreeCashFlowRatioja
enterpriseValueToOperatingCashFlowRatio
enterpriseValueToInvestedCapitalRatio
bookToMarketRatiobehält sein Vorzeichen
netDebtToMarketCapRatio
marketCapToTotalAssets
altmanZScore

Renditen — Prozentwerte mit 2 Dezimalstellen, mit Vorzeichen: earningsYield, ebitToEnterpriseValueYield, freeCashFlowYield, operatingCashFlowYield, dividendYield, buybackYield, shareholderYield.

valuation.latest — keine Periode. Ein einzelnes Objekt mit jedem obigen Feld plus priceAsOf, priceAgeDays, priceSource, fundamentalsAsOf und ttmBasis. Es liegt neben den Datumsschlüsseln, ist also kein Tabelleneintrag und erscheint nie in einem Snapshot zur Balkenzeit — es in einem Backtest zu lesen wäre Look-ahead. Greifen Sie über qc_fundamentals.raw["valuation"]["latest"] darauf zu; es ist None, wenn kein Kurs verfügbar ist.

Scores

Tabellen: scores.quarterly, scores.yearly

FeldHinweise
datePeriodenende-Datum
piotroskiFScoreGanzzahl 0–9
piotroskiComponentsObjekt oder None — Schlüssel roaPositive, cfoPositive, roaImproved, accrualQuality, leverageImproved, currentRatioImproved, noShareIssuance, grossMarginImproved, assetTurnoverImproved, jeweils 1, 0 oder None
altmanZScorePrivate4 Dez. — Z-Prime, Buchwert des Eigenkapitals
beneishMScore4 Dez.
beneishComponentsObjekt oder None — Schlüssel dsri, gmi, aqi, sgi, depi, sgai, tata, lvgi (Zahlen mit 4 Dez.)

Zwei erwartete Abwesenheiten, von denen keine ein Fehler ist:

  • Die früheste Periode eines Einreichers trägt keine Scores — sie brauchen ein Vorjahr zum Vergleich.
  • Bei SIC 6000–6799 (Banken, Broker, Versicherer, REITs) sind beide Buckets leer, und scores.notApplicableReason ist "financial-sector-sic". Behandeln Sie das als „nicht anwendbar“, nicht als „keine Daten“. Lesen Sie es aus qc_fundamentals.raw["scores"]["notApplicableReason"].

TTM

ttm ist ein einzelnes Objekt, keine Tabelle — Trailing-Twelve-Month-Aggregate Stand Upload, nicht Stand eines Balkens. Es erscheint nie in einem Snapshot; greifen Sie über qc_fundamentals.raw["ttm"] darauf zu (in Forward-Läufen unbedenklich, im Backtest Look-ahead).

  • Metadaten: basis ("quarterly" / "annual"), asOf, periodsUsed (list[str]), complete (bool), synthetic (bool — das Geschäfts-Q4 wurde rekonstruiert; normal, meist true), coverageDays (etwa 365).
  • Flüsse — über 4 Quartale summiert, Strings mit 2 Dezimalstellen außer epsBasic / epsDiluted (4 Dez.): totalRevenue, grossProfit, operatingIncome, ebit, ebitda, netIncome, epsBasic, epsDiluted, depreciationAndAmortization, interestExpense, incomeBeforeTax, incomeTaxExpense, costOfRevenue, sellingGeneralAdministrative, researchDevelopment, taxProvision, totalCashFromOperatingActivities, totalCashflowsFromInvestingActivities, capitalExpenditures, freeCashFlow, dividendsPaid, stockBasedCompensation, paymentsForRepurchaseOfCommonStock, proceedsFromIssuanceOfCommonStock, repaymentsOfLongTermDebt.
  • Stichtagswerte — jüngste Periode, nie summiert, Strings mit 2 Dezimalstellen: totalAssets, totalLiab, totalStockholderEquity, totalCurrentAssets, totalCurrentLiabilities, totalDebt, netDebt, cashAndShortTermInvestments, goodWill, intangibleAssets, netWorkingCapital, retainedEarnings, netReceivables, inventory, accountsPayable, propertyPlantAndEquipmentNet, preferredStockTotalEquity, commonStockSharesOutstanding, minorityInterest.

Kennzahlen-Herkunft (metricsInputs / metricsHealth)

Flache Objekte, die beschreiben, woher die Kennzahlen stammen:

"metricsInputs": { "metricsVersion": 1, "priceAsOf": "2026-08-21", "priceSource": "…" | null, // source of valuation.latest "historicalPriceSource": "stooq" | null, // source of valuation.quarterly/yearly "sharesSource": "dei" | "weightedAverageSharesDiluted" | "weightedAverageSharesBasic" | null, "dividendSource": "nasdaq" | "edgar-xbrl" | "cash-flow" | null, "ttmBasis": "quarterly" | "annual" | null, "historicalValuation": true } "metricsHealth": { "prices": "ok" | "stale" | "absent", // current price for valuation.latest "historicalPrices": "ok" | "absent", "splits": "ok" | "absent", "calendar": "ok" | "absent" }

Prüfen Sie metricsHealth["prices"] != "absent", bevor Sie sich auf kursbasierte Felder verlassen; "stale" ist weiterhin nutzbar — vergleichen Sie mit priceAsOf. metricsInputs is None bedeutet ein Paket, das älter ist als die Kennzahlen-Erweiterung. Felder erscheinen pro Symbol, sobald es erneut hochgeladen wird, daher ist die Abdeckung eine Weile uneinheitlich: Behandeln Sie jeden obigen Block als optional.

Typkonventionen für die Kennzahlenblöcke

KlasseJSON-TypDezimalstellenBeispiel
GeldbetragsaggregateString2"4519282704050.00"
Werte je Aktie, sharePriceString4"309.3500"
AktienanzahlenString2"14608963000.00"
Kennzahlen / Multiplikatoren / Umschlag / Deckung / ScoresZahl428.0462
Prozentwerte (Margen, Renditen, Ausschüttung, Wachstum, CAGR, Steuersatz)Zahl242.35 bedeutet 42,35 %
Tage (DSO / DIO / DPO / CCC / Betriebszyklus)Zahl229.2
Anzahlen (piotroskiFScore, priceLagDays)Zahlganzzahlig8
DatenString—YYYY-MM-DD

Jede Kennzahl ist unabhängig nullable. Ein Periodenobjekt entfällt ganz, wenn alle seine Nicht-Metadaten-Schlüssel null sind. Ein Block ist {"quarterly": {}, "yearly": {}}, wenn er leer ist — nie null, nie weggelassen. NaN / Infinity erscheinen nie.

Unternehmensinformationen

companyInfo ist ein flaches Objekt — es ist nicht datumsindiziert und erscheint nicht in current(...)- / get_data_with_offset(...)-Snapshots. Greifen Sie direkt darauf zu:

info = f.raw["companyInfo"]
FeldTypHinweise
entityTypestring | nullz. B. "operating"
entityNamestring | nullRechtlicher Name der Entität
cikstring | nullSEC Central Index Key
sicstring | nullSIC-Branchencode
sicDescriptionstring | nullLesbare SIC-Kategorie
stateOfIncorporationstring | nullZweibuchstabiger Staatencode
fiscalYearEndstring | nullFormat "MMDD", z. B. "0926" = 26. Sep.
categorystring | nullEinreicherkategorie
phonestring | nullKontakttelefonnummer
exchangesstring[]Börsencodes
tickersstring[]Tickersymbole
businessAddressobject | nullstreet1, street2, city, stateOrCountry, zipCode

Hinweise und Stolperfallen

  • Sichern Sie immer gegen None ab. Sind Fundamentaldaten nicht konfiguriert, ist fundamentals None. Innerhalb eines Snapshots können einzelne Abschnitte (z. B. earnings.Trend, scores) bei manchen Balken ebenfalls null sein, und die Blöcke der Kennzahlen-Erweiterung können bei älteren Paketen ganz fehlen.
  • Übergeben Sie immer symbol= bei Multi-Symbol- und Screener-Läufen — der Rückfall auf das primäre Paket ist möglicherweise nicht der Ticker, bei dem Sie gerade sind.
  • Zahlen können Strings sein. Das zugrunde liegende JSON liefert numerische Kennzahlen oft als Strings; wandeln Sie sie für Rechnungen mit float(...) um.
  • Neueste-zuerst-Indizierung gilt für datumsindizierte Tabellen und für Offset-Abfragen — Index 0 ist die jüngste zulässige Periode zur Balkenzeit, 1 die davor usw.
  • Der Zeitstempel des Balkens ist die maßgebliche Quelle, welcher Bericht „aktuell“ ist — übergeben Sie bar["t"] (oder bar.t[0]) direkt; Sie müssen ihn nicht selbst parsen.
Fundamentaldaten — Dokumentation (1.0 (latest)) | QuantCraft