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-rowssind überYYYYMM-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- undyearly-Berichte. - Kapitalfluss —
quarterly- undyearly-Berichte. - Gewinn- und Verlustrechnung —
quarterly- undyearly-Berichte. - Ergebnisse (Earnings):
- History — gemeldetes EPS vs. Schätzungen und Überraschungen nach Berichtsdatum.
- Trend — Vorwärtsschätzungen, EPS-Trend und Analystenrevisionen.
- Annual —
epsActualpro Geschäftsjahr.
- Kennzahlen (Ratios) —
quarterly- undyearly-Finanzkennzahlen (Margen, Renditen, Liquidität, Verschuldung). - Financials extended — erweiterte
quarterly- undyearly-Kennzahlen, die nicht in den Kernabschlüssen (GuV, Bilanz, Kapitalfluss) enthalten sind. - Je Aktie —
quarterly- undyearly-Werte je Aktie wie eingereicht (Aktienanzahl auf der Split-Basis dieser Periode). - Bewertung —
quarterly- undyearly-Marktkapitalisierung, Enterprise Value, Multiplikatoren und Renditen sowie ein datumsloseslatest-Objekt. - Scores —
quarterly- undyearly-Piotroski-F, Altman-Z-Prime und Beneish-M sowienotApplicableReason. - TTM — ein einzelnes Trailing-Twelve-Month-Objekt (nicht nach Periode gruppiert).
- Kennzahlen-Herkunft — flache Objekte
metricsInputs/metricsHealth.metricsInputsistNonebei einem Paket, das älter ist als die Kennzahlen-Erweiterung. - Einreichungshistorie —
quarterly- undyearly-Einreichungsmetadaten (Formulartyp, Einreichungsdatum, indiziert nach Periodenende). Auch in balkenausgerichtetencurrent(...)-Snapshots enthalten, sofern im Paket vorhanden; Rohtabellen bleiben überf.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:
| Pfad | Bedeutung |
|---|---|
balanceSheet.quarterly / balanceSheet.yearly | Bilanz-Snapshots |
cashFlow.quarterly / cashFlow.yearly | Kapitalflussrechnungen |
incomeStatement.quarterly / incomeStatement.yearly | Gewinn- und Verlustrechnungen |
earnings.History | Gemeldetes EPS, Schätzungen, Überraschung pro Bericht |
earnings.Trend | Analystenschätzungen, EPS-Trend, Revisionen |
earnings.Annual | Jährliches epsActual |
ratios.quarterly / ratios.yearly | Finanzkennzahlen (Margen, Renditen, Liquidität, Verschuldung) |
financialsExtended.quarterly / financialsExtended.yearly | Erweiterte Finanzkennzahlen |
perShare.quarterly / perShare.yearly | Werte je Aktie (wie eingereicht) |
valuation.quarterly / valuation.yearly | Bewertungsmultiplikatoren und -renditen |
scores.quarterly / scores.yearly | Piotroski / Altman / Beneish |
filingHistory.quarterly / filingHistory.yearly | Einreichungsmetadaten (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 Tabelle | Warum |
|---|---|
valuation.latest | Ein einzelnes Objekt neben den Datumsschlüsseln, keine Periode |
scores.notApplicableReason | Ein String neben den Datumsschlüsseln |
ttm | Ein einzelnes Objekt; die Werte sind Skalare statt Zeilen-Dicts |
metricsInputs / metricsHealth | Flache Herkunftsobjekte |
companyInfo | Flache 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.rawWas Sie von einem geladenen Paket lesen können:
| Attribut | Was es liefert |
|---|---|
f.raw | Der vollständige dekodierte JSON-Baum. |
f.symbol | Aufgelöster Ticker (z. B. "AAPL"). |
f.tables | Dict von DateKeyedTable-Objekten, indiziert über Punktpfad (z. B. "balanceSheet.quarterly"). |
f.table(path) | Komfortzugriff auf eine einzelne DateKeyedTable. |
f.lists | Flache 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, undsorted(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:
- 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.
- 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_fundamentalsoder ein rohes Dict stattBacktestFundamentals. Die moderne Signatur übergibtfundamentalsals drittes Argument anon_bar/on_tick. Der Modul-Aliasfundamentals_as_of_barentspricht 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 / Member | Zweck |
|---|---|
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.symbols | Tupel 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=1geht der AbschnittbalanceSheet.quarterlyein Quartal zurück, währendbalanceSheet.yearlyein 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 Signaturf.get_data_with_offset(bar_time, offset, *, print_on_shortfall=True, use_filing_date=False). Die Modulfunktionget_data_with_offset(qc, bar_time, offset, *, print_on_shortfall=True)hat keinen Parameteruse_filing_date— sie verwendet immer die Periodenende-Zulässigkeit; rufen Sie also die Methode mituse_filing_date=Trueauf (oder nutzen Sie das Callback-Handle) für Point-in-Time-Daten. Der Standarduse_filing_date=Falsebedeutet nur Periodenende-Zulässigkeit (kann gegenüber Einreichungsdaten vorausschauen). Mituse_filing_date=Truefällt eine Periode, derenfiling_datefehlt, auf eine angenommene Frist von 45 Tagen (quartalsweise) / 90 Tagen (jährlich) nach Periodenende zurück. Bevorzugen Sie in IDE-Backtests das Callback-Handlefundamentals, 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
symbolnutzt das primäre Paket: das einzige geladene; sonstfundamentals.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 immersymbol=symbol. fundamentals.symbolslistet 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
SPYhandeln und dabei die Fundamentaldaten vonAAPLundMSFTlesen.
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) / prevFundamentaldaten-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())odersorted(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 mitfloat(...)um.
Bilanz
Tabellen: balanceSheet.quarterly, balanceSheet.yearly
| Feld | Feld |
|---|---|
accountsPayable | longTermInvestments |
accumulatedAmortization | negativeGoodwill |
accumulatedDepreciation | netDebt |
accumulatedOtherComprehensiveIncome | netInvestedCapital |
additionalPaidInCapital | netReceivables |
capitalLeaseObligations | netTangibleAssets |
capitalStock | netWorkingCapital |
capitalSurpluse | noncontrollingInterestInConsolidatedEntity |
cash | nonCurrrentAssetsOther |
cashAndEquivalents | nonCurrentAssetsTotal |
cashAndShortTermInvestments | nonCurrentLiabilitiesOther |
commonStock | nonCurrentLiabilitiesTotal |
commonStockSharesOutstanding | otherAssets |
commonStockTotalEquity | otherCurrentAssets |
currency_symbol | otherCurrentLiab |
currentDeferredRevenue | otherLiab |
date | otherStockholderEquity |
deferredLongTermAssetCharges | preferredStockRedeemable |
deferredLongTermLiab | preferredStockTotalEquity |
earningAssets | propertyPlantAndEquipmentGross |
filing_date | propertyPlantAndEquipmentNet |
goodWill | propertyPlantEquipment |
intangibleAssets | retainedEarnings |
inventory | retainedEarningsTotalEquity |
liabilitiesAndStockholdersEquity | shortLongTermDebt |
longTermDebt | shortLongTermDebtTotal |
longTermDebtTotal | shortTermDebt |
shortTermInvestments | temporaryEquityRedeemableNoncontrollingInterests |
totalAssets | totalCurrentAssets |
totalCurrentLiabilities | totalLiab |
totalPermanentEquity | totalStockholderEquity |
treasuryStock | warrants |
Kapitalfluss
Tabellen: cashFlow.quarterly, cashFlow.yearly
| Feld | Feld |
|---|---|
beginPeriodCashFlow | endPeriodCashFlow |
capitalExpenditures | exchangeRateChanges |
cashAndCashEquivalentsChanges | filing_date |
cashFlowsOtherOperating | freeCashFlow |
changeInCash | investments |
changeInWorkingCapital | issuanceOfCapitalStock |
changeReceivables | netBorrowings |
changeToAccountReceivables | netIncome |
changeToInventory | otherCashflowsFromFinancingActivities |
changeToLiabilities | otherCashflowsFromInvestingActivities |
changeToNetincome | otherNonCashItems |
changeToOperatingActivities | salePurchaseOfStock |
currency_symbol | stockBasedCompensation |
date | totalCashflowsFromInvestingActivities |
depreciation | totalCashFromFinancingActivities |
dividendsPaid | totalCashFromOperatingActivities |
Gewinn- und Verlustrechnung
Tabellen: incomeStatement.quarterly, incomeStatement.yearly
| Feld | Feld |
|---|---|
costOfRevenue | netIncomeFromContinuingOps |
currency_symbol | netInterestIncome |
date | nonOperatingIncomeNetOther |
depreciationAndAmortization | nonRecurring |
discontinuedOperations | operatingIncome |
effectOfAccountingCharges | otherItems |
ebit | otherOperatingExpenses |
ebitda | preferredStockAndOtherAdjustments |
extraordinaryItems | reconciledDepreciation |
filing_date | researchDevelopment |
grossProfit | sellingAndMarketingExpenses |
incomeBeforeTax | sellingGeneralAdministrative |
incomeTaxExpense | taxProvision |
interestExpense | totalOperatingExpenses |
interestIncome | totalOtherIncomeExpenseNet |
minorityInterest | totalRevenue |
netIncome | |
netIncomeApplicableToCommonShares |
Ergebnisse — History
Tabelle: earnings.History (gemeldetes EPS vs. Schätzungen pro Berichtsdatum)
| Feld | Beschreibung |
|---|---|
beforeAfterMarket | Wann der Bericht relativ zu den Handelszeiten veröffentlicht wurde |
currency | Berichtswährung |
date | Periodenende-Datum |
epsActual | Gemeldetes EPS |
epsEstimate | Konsens-EPS-Schätzung |
epsDifference | epsActual − epsEstimate |
reportDate | Datum, an dem die Zahlen gemeldet wurden |
surprisePercent | EPS-Überraschung in Prozent |
Ergebnisse — Trend
Tabelle: earnings.Trend (Vorwärtsschätzungen und Revisionen)
| Feld | Feld |
|---|---|
date | epsTrendCurrent |
period | epsTrend7daysAgo |
growth | epsTrend30daysAgo |
earningsEstimateAvg | epsTrend60daysAgo |
earningsEstimateLow | epsTrend90daysAgo |
earningsEstimateHigh | epsRevisionsUpLast7days |
earningsEstimateYearAgoEps | epsRevisionsUpLast30days |
earningsEstimateNumberOfAnalysts | epsRevisionsDownLast7days |
earningsEstimateGrowth | epsRevisionsDownLast30days |
revenueEstimateAvg | |
revenueEstimateLow | |
revenueEstimateHigh | |
revenueEstimateYearAgoEps | |
revenueEstimateNumberOfAnalysts | |
revenueEstimateGrowth |
Ergebnisse — Annual
Tabelle: earnings.Annual (jährliches gemeldetes EPS)
| Feld | Beschreibung |
|---|---|
date | Geschäftsjahresende-Datum |
epsActual | Gemeldetes 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,operatingMarginusw.) sind Dezimalbrüche — mit 100 multiplizieren für Prozent.debtToEquitywurde indebtToEquityRatioumbenannt.
| Feld | Feld |
|---|---|
grossMargin | currentRatio |
operatingMargin | quickRatio |
netProfitMargin | cashRatio |
returnOnAssets | debtToEquityRatio |
returnOnEquity | debtToAssetsRatio |
operatingCashFlowMargin | interestCoverageRatio |
freeCashFlowMargin | assetTurnover |
freeCashFlowToNetIncome | inventoryTurnover |
receivablesTurnover |
Working Capital
| Feld | Hinweise |
|---|---|
daysSalesOutstanding | Tage, 2 Dez. |
daysInventoryOutstanding | Tage, 2 Dez. |
daysPayablesOutstanding | Tage, 2 Dez. |
cashConversionCycle | Tage, 2 Dez. — mit Vorzeichen; negativ (einnehmen, bevor man zahlt) ist wünschenswert, kein Fehler |
operatingCycle | Tage, 2 Dez. |
payablesTurnover | Einfache Dezimalzahl |
workingCapitalTurnover | Einfache Dezimalzahl |
fixedAssetTurnover | Einfache Dezimalzahl |
netWorkingCapitalToAssets | Einfache Dezimalzahl |
defensiveIntervalRatio | Einfache Dezimalzahl |
Verschuldung und Deckung
Alle einfache Dezimalzahlen (4 Dez.).
| Feld | Feld |
|---|---|
totalDebtToEquityRatio | netDebtToFreeCashFlowRatio |
netDebtToEquityRatio | equityMultiplier |
longTermDebtToEquityRatio | ebitdaInterestCoverageRatio |
longTermDebtToCapitalRatio | cashFlowInterestCoverageRatio |
capitalizationRatio | cashFlowToDebtRatio |
debtToEbitdaRatio | debtServiceCoverageRatio |
netDebtToEbitdaRatio |
Renditen
| Feld | Hinweise |
|---|---|
effectiveTaxRate | % |
returnOnInvestedCapital | % |
returnOnCapitalEmployed | % |
returnOnTangibleEquity | % |
cashReturnOnInvestedCapital | % |
operatingReturnOnAssets | % |
returnOnEquityDupontMargin | % |
returnOnEquityDupontTurnover | Einfache Dezimalzahl |
returnOnEquityDupontLeverage | Einfache Dezimalzahl |
nopat | Geldbetrag-String, 2 Dez. — der Ausreißer in einem sonst durchweg numerischen Block |
investedCapital | Geldbetrag-String, 2 Dez. |
capitalEmployed | Geldbetrag-String, 2 Dez. |
Margen und Kapitalintensität
| Feld | Hinweise |
|---|---|
ebitMargin | % |
ebitdaMargin | % |
pretaxMargin | % |
researchAndDevelopmentToRevenue | % |
sellingGeneralAdministrativeToRevenue | % |
stockBasedCompensationToRevenue | % |
capexToRevenue | % |
capexToOperatingCashFlow | % |
accrualsRatio | % |
assetQualityRatio | % |
capexToDepreciationRatio | Einfache Dezimalzahl (4 Dez.) |
cashConversionRatio | Einfache 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.
| Feld | Feld |
|---|---|
grossProfitGrowthYoY | totalAssetsGrowthYoY |
operatingIncomeGrowthYoY | totalStockholderEquityGrowthYoY |
ebitdaGrowthYoY | totalDebtGrowthYoY |
operatingCashFlowGrowthYoY | dividendsPaidGrowthYoY |
freeCashFlowGrowthYoY | sharesDilutedGrowthYoY — negativ bedeutet Aktienrückkäufe |
capitalExpendituresGrowthYoY | bookValuePerShareGrowthYoY |
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,evToEbitdaundevToRevenuewerden 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.
| Feld | Hinweise |
|---|---|
date | Periodenende-Datum |
sharesOutstanding | String mit 2 Dezimalstellen |
sharesBasis | "dei" / "weightedAverageSharesDiluted" / "weightedAverageSharesBasic" |
bookValuePerShare, tangibleBookValuePerShare | |
revenuePerShare, ebitdaPerShare | |
operatingCashFlowPerShare, freeCashFlowPerShare | |
cashPerShare, netCashPerShare | |
netDebtPerShare, totalDebtPerShare | |
workingCapitalPerShare, retainedEarningsPerShare | |
dividendsPaidPerShare | |
netCurrentAssetValuePerShare | Graham-NCAV |
grahamNumber |
Bewertung
Tabellen: valuation.quarterly, valuation.yearly (plus das Nicht-Tabellen-Objekt valuation.latest)
Drei Regeln:
- Multiplikatoren sind
marketCap / Aggregat, nichtprice / perShare. Berechnen Sie sie nicht ausperShareneu — angepasste Vergleichswerte lassen beide bei älteren Perioden auseinanderlaufen. - Ein
None-Multiplikator neben einer Rendite mit Vorzeichen ist korrekt, kein Fehler. Die unten als null bei nicht positivem Nenner markierten Multiplikatoren werdenNone, wenn ihr Nenner nicht positiv ist, während Renditen undbookToMarketRatioihr Vorzeichen behalten. Ein Verlustunternehmen zeigtpriceToEarningsRatio: NoneundearningsYield: -5.0. - Multiplikatoren sind Trailing-Twelve-Month, auch bei Quartalsperioden — ein Quartals-KGV ist ein echtes Trailing-KGV, kein annualisiertes Quartal.
Metadaten
| Feld | Hinweise |
|---|---|
date | Periodenende-Datum |
sharePrice | String mit 4 Dezimalstellen |
priceDate | YYYY-MM-DD |
priceLagDays | Ganzzahl |
priceBasis | "as-quoted" (neuester) / "split-adjusted" / "unreconciled" — seien Sie bei "unreconciled" misstrauisch |
approximate | true bei historischen Perioden (Rest-Dividendenrückanpassung) |
sharesRebased | Die Aktienanzahl wurde auf die aktuelle Split-Basis umgestellt |
sharesOutstanding | String 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)
| Feld | Null bei nicht positivem Nenner |
|---|---|
priceToEarningsRatio | ja |
priceToBookRatio | ja |
priceToTangibleBookRatio | ja |
priceToSalesRatio | |
priceToFreeCashFlowRatio | ja |
priceToOperatingCashFlowRatio | ja |
pegRatioTrailing | ja |
enterpriseValueToEbitdaRatio | ja |
enterpriseValueToEbitRatio | ja |
enterpriseValueToSalesRatio | |
enterpriseValueToFreeCashFlowRatio | ja |
enterpriseValueToOperatingCashFlowRatio | |
enterpriseValueToInvestedCapitalRatio | |
bookToMarketRatio | behä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
| Feld | Hinweise |
|---|---|
date | Periodenende-Datum |
piotroskiFScore | Ganzzahl 0–9 |
piotroskiComponents | Objekt oder None — Schlüssel roaPositive, cfoPositive, roaImproved, accrualQuality, leverageImproved, currentRatioImproved, noShareIssuance, grossMarginImproved, assetTurnoverImproved, jeweils 1, 0 oder None |
altmanZScorePrivate | 4 Dez. — Z-Prime, Buchwert des Eigenkapitals |
beneishMScore | 4 Dez. |
beneishComponents | Objekt 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.notApplicableReasonist"financial-sector-sic". Behandeln Sie das als „nicht anwendbar“, nicht als „keine Daten“. Lesen Sie es ausqc_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, meisttrue),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
| Klasse | JSON-Typ | Dezimalstellen | Beispiel |
|---|---|---|---|
| Geldbetragsaggregate | String | 2 | "4519282704050.00" |
Werte je Aktie, sharePrice | String | 4 | "309.3500" |
| Aktienanzahlen | String | 2 | "14608963000.00" |
| Kennzahlen / Multiplikatoren / Umschlag / Deckung / Scores | Zahl | 4 | 28.0462 |
| Prozentwerte (Margen, Renditen, Ausschüttung, Wachstum, CAGR, Steuersatz) | Zahl | 2 | 42.35 bedeutet 42,35 % |
| Tage (DSO / DIO / DPO / CCC / Betriebszyklus) | Zahl | 2 | 29.2 |
Anzahlen (piotroskiFScore, priceLagDays) | Zahl | ganzzahlig | 8 |
| Daten | String | — | 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"]| Feld | Typ | Hinweise |
|---|---|---|
entityType | string | null | z. B. "operating" |
entityName | string | null | Rechtlicher Name der Entität |
cik | string | null | SEC Central Index Key |
sic | string | null | SIC-Branchencode |
sicDescription | string | null | Lesbare SIC-Kategorie |
stateOfIncorporation | string | null | Zweibuchstabiger Staatencode |
fiscalYearEnd | string | null | Format "MMDD", z. B. "0926" = 26. Sep. |
category | string | null | Einreicherkategorie |
phone | string | null | Kontakttelefonnummer |
exchanges | string[] | Börsencodes |
tickers | string[] | Tickersymbole |
businessAddress | object | null | street1, street2, city, stateOrCountry, zipCode |
Hinweise und Stolperfallen
- Sichern Sie immer gegen
Noneab. Sind Fundamentaldaten nicht konfiguriert, istfundamentalsNone. Innerhalb eines Snapshots können einzelne Abschnitte (z. B.earnings.Trend,scores) bei manchen Balken ebenfallsnullsein, 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
0ist die jüngste zulässige Periode zur Balkenzeit,1die davor usw. - Der Zeitstempel des Balkens ist die maßgebliche Quelle, welcher Bericht „aktuell“ ist — übergeben Sie
bar["t"](oderbar.t[0]) direkt; Sie müssen ihn nicht selbst parsen.

