PáginasDados fundamentalistas · 11 / 29
Dados fundamentalistas
Trabalho em andamento: os dados fundamentalistas ainda não são totalmente funcionais. Usar este recurso no IDE ou em backtests pode retornar dados fundamentalistas inconsistentes (campos ausentes, datas de relatório divergentes ou snapshots alinhados às barras instáveis). Trate os resultados como experimentais até que uma versão futura marque os dados fundamentalistas como estáveis.
As estratégias do QuantCraft podem usar dados financeiros de empresas junto com as barras de preço OHLCV: balanços, demonstrações de fluxo de caixa, demonstrações de resultados e histórico / estimativas de resultados. Os dados são carregados uma vez por símbolo a partir do serviço de dados fundamentalistas do QuantCraft, organizados como tabelas indexadas por data e disponibilizados à sua estratégia como snapshots alinhados às barras durante um backtest. O momento dos callbacks segue o Ciclo de vida da estratégia; configure símbolos e datas no Test (Executando código).
Além das três demonstrações, você recebe índices (91 deles), valores por ação, múltiplos e rendimentos de valuation e scores de qualidade (Piotroski F, Altman Z-prime, Beneish M) — todos point-in-time, todos opcionais. Eles são liberados símbolo a símbolo, então proteja cada acesso: raw["metricsInputs"] is None significa que um pacote é anterior a eles.
Esta página cobre:
- Quais dados de demonstrações financeiras estão disponíveis
- Como as tabelas indexadas por data são organizadas
- Como as cargas alinhadas às barras chegam aos seus callbacks durante um backtest
Relacionado: os conjuntos de dados globais de retornos de fatores Fama-French (não por ticker) são um recurso separado — veja Fatores Fama-French (
fama_french.qc, sem argumento de callback). Asrowsdos fatores são indexadas por stringsYYYYMM, não por índices de lista.
O que você recebe
Cada pacote de dados fundamentalistas é um único objeto JSON de um ticker, contendo:
- Balanço — relatórios
quarterlyeyearly. - Fluxo de caixa — relatórios
quarterlyeyearly. - Demonstração de resultados — relatórios
quarterlyeyearly. - Resultados (earnings):
- History — LPA divulgado vs. estimativas e surpresas por data de relatório.
- Trend — estimativas futuras, tendência do LPA e revisões de analistas.
- Annual —
epsActualpor exercício fiscal.
- Índices (Ratios) — índices financeiros
quarterlyeyearly(margens, retornos, liquidez, alavancagem). - Financials extended — métricas estendidas
quarterlyeyearlyque não estão nas demonstrações básicas de resultados, balanço ou fluxo de caixa. - Por ação — valores por ação
quarterlyeyearlycomo arquivados (quantidade de ações na base de desdobramento daquele período). - Valuation — valor de mercado, enterprise value, múltiplos e rendimentos
quarterlyeyearly, mais um objetolatestsem data. - Scores — Piotroski F, Altman Z-prime e Beneish M
quarterlyeyearly, maisnotApplicableReason. - TTM — um único objeto dos últimos doze meses (não agrupado por período).
- Procedência das métricas — objetos planos
metricsInputs/metricsHealth.metricsInputséNoneem um pacote anterior à expansão das métricas. - Histórico de arquivamentos — metadados de arquivamento
quarterlyeyearly(tipo de formulário, data de arquivamento, indexados pelo fim do período). Também incluído nos snapshots alinhados às barrascurrent(...)quando presente no pacote; as tabelas brutas continuam disponíveis porf.tables["filingHistory.quarterly"]. - Informações da empresa — metadados planos da entidade (nome, CIK, SIC, endereço, bolsas, tickers). Não indexados por data e fora dos snapshots alinhados às barras; acesse por
f.raw["companyInfo"].
Cada relatório é uma linha de métricas em camelCase — por exemplo totalAssets, cash, freeCashFlow, totalRevenue, netIncome, epsActual, epsEstimate, surprisePercent. Os valores numéricos podem chegar como strings no JSON subjacente, e qualquer campo ausente volta como None.
Um determinado ticker pode não expor todas as seções. Veja o Explorador de cobertura de dados fundamentalistas para conferir quais campos estão disponíveis para um ticker.
Tabelas indexadas por data
Para cada seção acima, os dados fundamentalistas são organizados como uma tabela indexada por data: as linhas são indexadas pela data do relatório (YYYY-MM-DD), e as métricas são expostas como listas paralelas que você pode indexar como um histórico de preços.
Os caminhos de tabela padrão são:
| Caminho | Significado |
|---|---|
balanceSheet.quarterly / balanceSheet.yearly | Snapshots do balanço |
cashFlow.quarterly / cashFlow.yearly | Demonstrações de fluxo de caixa |
incomeStatement.quarterly / incomeStatement.yearly | Demonstrações de resultados |
earnings.History | LPA divulgado, estimativas, surpresa por relatório |
earnings.Trend | Estimativas de analistas, tendência do LPA, revisões |
earnings.Annual | epsActual anual |
ratios.quarterly / ratios.yearly | Índices financeiros (margens, retornos, liquidez, alavancagem) |
financialsExtended.quarterly / financialsExtended.yearly | Métricas financeiras estendidas |
perShare.quarterly / perShare.yearly | Valores por ação (como arquivados) |
valuation.quarterly / valuation.yearly | Múltiplos e rendimentos de valuation |
scores.quarterly / scores.yearly | Piotroski / Altman / Beneish |
filingHistory.quarterly / filingHistory.yearly | Metadados de arquivamento (tipo de formulário, data de arquivamento) |
Não são tabelas. valuation.latest, scores.notApplicableReason, ttm, metricsInputs, metricsHealth e companyInfo não são indexados por data, então não aparecem em tables, lists nem em nenhum snapshot no horário de uma barra — isso é intencional:
| Não é uma tabela | Por quê |
|---|---|
valuation.latest | Um único objeto ao lado das chaves de data, não um período |
scores.notApplicableReason | Uma string ao lado das chaves de data |
ttm | Um único objeto; os valores são escalares e não dicts de linhas |
metricsInputs / metricsHealth | Objetos planos de procedência |
companyInfo | Metadados planos da entidade |
Todos são da data do upload e não por período, então mantê-los fora de tables também os mantém fora de todo snapshot no horário de uma barra — um backtest não pode ler por acidente o preço de hoje em uma barra de 2019. Acesse-os por f.raw. Um bloco vazio ({"quarterly": {}, "yearly": {}}, que é a aparência dos scores de um declarante do setor financeiro) não registra tabela alguma.
Convenção de índices: do mais novo para o mais antigo
Dentro de qualquer uma dessas tabelas, o índice 0 é o período elegível mais recente, o índice 1 é o anterior, e assim por diante. Isso é igual ao funcionamento das séries de preços no resto do QuantCraft.
Se você quiser carregar um pacote diretamente (por exemplo, fora de um backtest), o formato básico é:
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.rawO que você pode ler de um pacote carregado:
| Atributo | O que fornece |
|---|---|
f.raw | A árvore JSON decodificada completa. |
f.symbol | Ticker resolvido (por exemplo "AAPL"). |
f.tables | Dict de objetos DateKeyedTable indexado por caminho com pontos (por exemplo "balanceSheet.quarterly"). |
f.table(path) | Acessor prático para uma única DateKeyedTable. |
f.lists | Mapa plano indexado por "<tablePath>.<fieldName>", com valores alinhados do mais novo para o mais antigo. |
Uma DateKeyedTable expõe periods (as chaves YYYY-MM-DD, do mais novo ao mais antigo), columns (campo → valores) e suporta a indexação table["fieldName"].
Descobrir campos em tempo de execução é fácil:
sorted(f.lists.keys())mostra cada série plana, esorted(t.columns.keys())mostra as colunas de uma tabela — útil quando um servidor adiciona ou remove campos.
Cargas alinhadas às barras em backtests
Em um backtest, você não lê os dados fundamentalistas como tabelas brutas — o mecanismo seleciona o relatório certo para a barra atual e o entrega aos seus callbacks como um snapshot. Isso é chamado de carga alinhada às barras.
Configurando os dados fundamentalistas para um backtest
Na aba Symbol & data do Run backtest:
- Marque Uses fundamentals (select if your strategy requires fundamental data) (exige login — o QuantCraft envia o seu token de sessão para carregar os arquivos de dados fundamentalistas do B2). As execuções forward em massa e no gráfico o chamam de Use fundamentals (optional). A caixa aparece quando os recursos de dados fundamentalistas estão disponíveis na sua versão, mas fica desativada (com uma dica de Premium) a menos que você tenha Premium ou o acesso a dados gratuitos esteja habilitado.
- Escolha um ou mais pacotes de dados fundamentalistas na seleção múltipla (caminhos como
fundamentals/AAPL.json.gz).
Com uma fonte de símbolos Screener (backtest) ou um alvo Screener (execuções em massa do AutoTrading / QuantCloud) você não precisa escolher nada: ative os dados fundamentalistas e todo símbolo que o filtro selecionar recebe o seu próprio pacote, de modo que fundamentals.current(bar["t"], symbol=symbol) funciona para cada um. Os pacotes vêm do próprio download do Screener (nada é buscado duas vezes), e um símbolo que o Screener ainda não baixou é buscado uma vez e guardado. Em uma execução ao vivo, os pacotes acompanham cada nova filtragem. Escolhas manuais continuam sendo aceitas como extras (por exemplo, um ticker de referência). Um símbolo cujos dados não podem ser carregados retorna None em vez de falhar a execução — o painel Output informa quantos foram carregados.
Os símbolos OHLCV e os símbolos de dados fundamentalistas são independentes. Você pode fazer o backtest de RNMBY pelo feed da corretora enquanto carrega os dados fundamentalistas de RHM.XETRA — passe o ticker correto a fundamentals.current(..., symbol="RHM.XETRA") (ou equivalente) no código.
Quando vários pacotes estão selecionados, use symbol= explícito em fundamentals.current / get_data_with_offset quando precisar de um pacote específico. O pacote principal usado nos snapshots alinhados às barras é, por padrão, o primeiro símbolo OHLCV da sua lista de símbolos, a menos que o mecanismo aplique outra regra.
Para acesso de baixo nível às tabelas fora dos callbacks, use qc_fundamentals de quantcraft.process.runtime quando não for None (por exemplo qc_fundamentals.raw["companyInfo"]). Ele guarda apenas o pacote principal; use o identificador fundamentals do callback com symbol= para qualquer outro ticker.
Se os dados fundamentalistas não estiverem configurados, o mecanismo simplesmente passa fundamentals=None aos seus callbacks, e você o protege com uma verificação.
Point-in-time (backtest): tanto o mecanismo de backtest quanto o Debug Test constroem BacktestFundamentals(..., backtest_mode=True), então current / get_data_with_offset usam filtragem por data de arquivamento (use_filing_date=True) — um período é excluído se o seu filing_date for posterior ao horário da barra. Quando um período não tem um filing_date utilizável, usa-se um prazo de arquivamento presumido — 45 dias após o fim do período nas tabelas trimestrais, 90 dias nas anuais (default_filing_lag_days) — em vez de tornar o relatório visível no dia em que o período fecha. As execuções forward usam elegibilidade pelo fim do período (backtest_mode=False). Prefira o identificador fundamentals do callback nos backtests do IDE; chamar qc_fundamentals.get_data_with_offset(...) diretamente sem use_filing_date=True pode antecipar em relação às datas de arquivamento.
Execuções forward: uma execução ao vivo recarrega seus dados fundamentalistas cerca de a cada hora, e em cerca de 5 minutos depois que os dados do Screener são atualizados. Uma recarga com falha mantém os dados anteriores. Como o "agora" de uma execução forward é de fato hoje, os blocos da data do upload (raw["ttm"], raw["valuation"]["latest"], …) são dados atuais ali, não antecipação.
Callbacks legados: estratégias mais antigas podem usar um argumento
qc_fundamentalsseparado ou um dict bruto em vez deBacktestFundamentals. A assinatura moderna passafundamentalscomo terceiro argumento deon_bar/on_tick. O alias de nível de módulofundamentals_as_of_barcorresponde ao mesmo formato de carga alinhada às barras.
O parâmetro de callback fundamentals
Quando os dados fundamentalistas são carregados, o mecanismo passa um identificador BacktestFundamentals como argumento fundamentals a on_bar, on_tick e (quando usado nas execuções forward) 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")| Método / membro | Finalidade |
|---|---|
fundamentals.current(bar_time, symbol=None) | Dict de snapshot no horário daquela barra (com filtragem por data de arquivamento no backtest). O symbol opcional escolhe qual pacote carregado; omita para o principal. Inclui filingHistory quando presente no pacote. |
fundamentals.get_data_with_offset(bar_time, offset, *, symbol=None, print_on_shortfall=True) | Enésimo período anterior por subtabela para o pacote escolhido (mesmo modo de data de arquivamento de current). |
fundamentals.symbols | Tupla de chaves em maiúsculas de todos os pacotes carregados. |
fundamentals.primary_symbol() | Chave principal usada quando symbol é omitido. |
fundamentals.reload_all() | Baixa todos os pacotes novamente. As execuções forward o chamam por você; raramente será necessário. |
Como é o snapshot
Um snapshot alinhado à barra é um dict aninhado com apenas os períodos válidos no horário dessa barra (com filtragem por data de arquivamento nos backtests do IDE). Cada seção não nula inclui um periodEnd mais as métricas do relatório:
{
"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 pode ser null quando nenhum período se qualifica no horário da barra ou antes. O priceToEarningsRatio: null ao lado de earningsYield: -5.0 acima é uma empresa com prejuízo, não dado ausente — veja Valuation.
Nunca no snapshot: ttm, valuation.latest, scores.notApplicableReason, metricsInputs, metricsHealth, companyInfo. Eles são da data do upload e não por período; anexá-los a uma barra vazaria informação futura para um backtest. Leia-os de qc_fundamentals.raw[...].
O mesmo dict por barra aparece no campo fundamentals de cada linha do resultado do backtest estruturado, então o que você vê na estratégia corresponde ao que aparece nos dados do resultado.
Consultando períodos mais antigos (get_data_with_offset)
Às vezes você quer não o último relatório no horário de uma barra, mas um anterior — o trimestre anterior, o exercício anterior, a linha de resultados anterior:
prior = fundamentals.get_data_with_offset(bar["t"], 1)
prev_bs_q = (prior or {}).get("balanceSheet", {}).get("quarterly")Comportamento:
- Cada subtabela é indexada de forma independente. Com
offset=1, a seçãobalanceSheet.quarterlyrecua um trimestre, enquantobalanceSheet.yearlyrecua um exercício, e assim por diante. - Se uma subtabela não tem histórico suficiente antes da barra atual, a sua seção é
nullno dict retornado (e uma nota de uma linha pode ser impressa). - O formato é o mesmo de
current(...), mais um"offset": <int>de nível superior. - Na API bruta
QcFundamentals, a assinatura preferida éf.get_data_with_offset(bar_time, offset, *, print_on_shortfall=True, use_filing_date=False). A função de nível de móduloget_data_with_offset(qc, bar_time, offset, *, print_on_shortfall=True)não tem o parâmetrouse_filing_date— ela sempre usa elegibilidade pelo fim do período, então chame o método comuse_filing_date=True(ou use o identificador do callback) para dados point-in-time. O padrãouse_filing_date=Falsesignifica apenas elegibilidade pelo fim do período (pode antecipar em relação às datas de arquivamento). Comuse_filing_date=True, um período cujofiling_dateestá ausente recorre a um prazo presumido de 45 dias (trimestral) / 90 dias (anual) após o fim do período. Prefira o identificadorfundamentalsdo callback nos backtests do IDE, que usa a filtragem por data de arquivamento automaticamente.
Dados fundamentalistas com vários símbolos
Quando você carrega vários pacotes (para estratégias transversais ou de comparação), pode escolher de qual ler com symbol="TICKER":
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")- Omitir
symbolusa o pacote principal: o único carregado; senãofundamentals.primaryse definido, senão o símbolo negociado, senão o ticker carregado primeiro em ordem alfabética. Em uma execução com vários símbolos ou Screener, esse recurso pode silenciosamente apontar a empresa errada — sempre passesymbol=symbolali. fundamentals.symbolslista cada chave de ticker em maiúsculas atualmente carregada.fundamentals.primary_symbol()retorna a chave principal.- O símbolo que você negocia no backtest pode ser diferente do(s) símbolo(s) de dados fundamentalistas que você carrega — por exemplo, negociar
SPYenquanto lê os dados fundamentalistas deAAPLeMSFT.
Horários de barra aceitos
Tanto current(...) quanto get_data_with_offset(...) aceitam vários formatos de horário, para que você possa passar bar["t"], bar.t[0] ou um valor próprio:
datetime(o ingênuo é tratado como UTC),date,- string ISO (incluindo um
Zfinal), - segundos epoch UNIX (
int/float).
Padrões práticos
Alguns formatos comuns:
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) / prevReferência de campos de dados fundamentalistas
A disponibilidade dos campos depende do símbolo — nem todo emissor reporta cada linha. Use
sorted(f.lists.keys())ousorted(t.columns.keys())em tempo de execução para ver o que um pacote específico realmente expõe. Os valores numéricos podem chegar como strings; converta comfloat(...)para fazer contas.
Balanço
Tabelas: balanceSheet.quarterly, balanceSheet.yearly
| Campo | Campo |
|---|---|
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 |
Fluxo de caixa
Tabelas: cashFlow.quarterly, cashFlow.yearly
| Campo | Campo |
|---|---|
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 |
Demonstração de resultados
Tabelas: incomeStatement.quarterly, incomeStatement.yearly
| Campo | Campo |
|---|---|
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 |
Resultados — History
Tabela: earnings.History (LPA divulgado vs. estimativas por data de relatório)
| Campo | Descrição |
|---|---|
beforeAfterMarket | Quando o relatório foi divulgado em relação ao horário de mercado |
currency | Moeda do relatório |
date | Data de fim do período |
epsActual | LPA divulgado |
epsEstimate | Estimativa de consenso do LPA |
epsDifference | epsActual − epsEstimate |
reportDate | Data em que os números foram divulgados |
surprisePercent | Surpresa do LPA em porcentagem |
Resultados — Trend
Tabela: earnings.Trend (estimativas futuras e revisões)
| Campo | Campo |
|---|---|
date | epsTrendCurrent |
period | epsTrend7daysAgo |
growth | epsTrend30daysAgo |
earningsEstimateAvg | epsTrend60daysAgo |
earningsEstimateLow | epsTrend90daysAgo |
earningsEstimateHigh | epsRevisionsUpLast7days |
earningsEstimateYearAgoEps | epsRevisionsUpLast30days |
earningsEstimateNumberOfAnalysts | epsRevisionsDownLast7days |
earningsEstimateGrowth | epsRevisionsDownLast30days |
revenueEstimateAvg | |
revenueEstimateLow | |
revenueEstimateHigh | |
revenueEstimateYearAgoEps | |
revenueEstimateNumberOfAnalysts | |
revenueEstimateGrowth |
Resultados — Annual
Tabela: earnings.Annual (LPA anual divulgado)
| Campo | Descrição |
|---|---|
date | Data de fim do exercício fiscal |
epsActual | LPA anual divulgado |
Índices (Ratios)
Tabelas: ratios.quarterly, ratios.yearly
91 métricas desde a expansão das métricas (94 chaves contando date, currency_symbol e filing_date). O conjunto original vem listado primeiro; tudo a partir de Capital de giro é novo. Um símbolo no meio da liberação pode trazer só o conjunto original, então descubra a lista real com sorted(f.table("ratios.quarterly").columns.keys()).
Conjunto original
Os campos de margem e retorno deste grupo (
grossMargin,operatingMarginetc.) são frações decimais — multiplique por 100 para obter porcentagem.debtToEquityfoi renomeado paradebtToEquityRatio.
| Campo | Campo |
|---|---|
grossMargin | currentRatio |
operatingMargin | quickRatio |
netProfitMargin | cashRatio |
returnOnAssets | debtToEquityRatio |
returnOnEquity | debtToAssetsRatio |
operatingCashFlowMargin | interestCoverageRatio |
freeCashFlowMargin | assetTurnover |
freeCashFlowToNetIncome | inventoryTurnover |
receivablesTurnover |
Capital de giro
| Campo | Observações |
|---|---|
daysSalesOutstanding | Dias, 2 dec. |
daysInventoryOutstanding | Dias, 2 dec. |
daysPayablesOutstanding | Dias, 2 dec. |
cashConversionCycle | Dias, 2 dec. — com sinal; negativo (receber antes de pagar) é desejável, não um erro |
operatingCycle | Dias, 2 dec. |
payablesTurnover | Decimal simples |
workingCapitalTurnover | Decimal simples |
fixedAssetTurnover | Decimal simples |
netWorkingCapitalToAssets | Decimal simples |
defensiveIntervalRatio | Decimal simples |
Alavancagem e cobertura
Todos são decimais simples (4 dec.).
| Campo | Campo |
|---|---|
totalDebtToEquityRatio | netDebtToFreeCashFlowRatio |
netDebtToEquityRatio | equityMultiplier |
longTermDebtToEquityRatio | ebitdaInterestCoverageRatio |
longTermDebtToCapitalRatio | cashFlowInterestCoverageRatio |
capitalizationRatio | cashFlowToDebtRatio |
debtToEbitdaRatio | debtServiceCoverageRatio |
netDebtToEbitdaRatio |
Retornos
| Campo | Observações |
|---|---|
effectiveTaxRate | % |
returnOnInvestedCapital | % |
returnOnCapitalEmployed | % |
returnOnTangibleEquity | % |
cashReturnOnInvestedCapital | % |
operatingReturnOnAssets | % |
returnOnEquityDupontMargin | % |
returnOnEquityDupontTurnover | Decimal simples |
returnOnEquityDupontLeverage | Decimal simples |
nopat | String monetária, 2 dec. — a exceção em um bloco de resto todo numérico |
investedCapital | String monetária, 2 dec. |
capitalEmployed | String monetária, 2 dec. |
Margens e intensidade de capital
| Campo | Observações |
|---|---|
ebitMargin | % |
ebitdaMargin | % |
pretaxMargin | % |
researchAndDevelopmentToRevenue | % |
sellingGeneralAdministrativeToRevenue | % |
stockBasedCompensationToRevenue | % |
capexToRevenue | % |
capexToOperatingCashFlow | % |
accrualsRatio | % |
assetQualityRatio | % |
capexToDepreciationRatio | Decimal simples (4 dec.) |
cashConversionRatio | Decimal simples (4 dec.) |
Distribuição
Todos são porcentagens (2 dec.): dividendPayoutRatio, freeCashFlowPayoutRatio, shareholderPayoutToFreeCashFlow, retentionRatio, sustainableGrowthRate.
Crescimento, ano contra ano
Todos são porcentagens (2 dec.). O crescimento de receita / lucro líquido / LPA não é duplicado aqui — está em earnings.Trend.
| Campo | Campo |
|---|---|
grossProfitGrowthYoY | totalAssetsGrowthYoY |
operatingIncomeGrowthYoY | totalStockholderEquityGrowthYoY |
ebitdaGrowthYoY | totalDebtGrowthYoY |
operatingCashFlowGrowthYoY | dividendsPaidGrowthYoY |
freeCashFlowGrowthYoY | sharesDilutedGrowthYoY — negativo significa recompras |
capitalExpendituresGrowthYoY | bookValuePerShareGrowthYoY |
CAGRs — somente yearly
Todos são porcentagens (2 dec.) e null em todo período quarterly — um filtro ou regra que peça um deles em um período trimestral reprova todos os símbolos.
revenueCagr3y / revenueCagr5y, netIncomeCagr3y / netIncomeCagr5y, epsCagr3y / epsCagr5y, freeCashFlowCagr3y / freeCashFlowCagr5y, dividendCagr3y / dividendCagr5y.
Financials extended
Tabelas: financialsExtended.quarterly, financialsExtended.yearly
Os campos variam por símbolo e não são enumerados aqui. Descubra o que um pacote carregado expõe em tempo de execução:
t = f.table("financialsExtended.quarterly")
if t:
print(sorted(t.columns.keys()))Os campos comuns incluem métricas de EBITDA estendidas, componentes do capital de giro e dados por ação que não estão na demonstração de resultados básica.
Campos aposentados:
ebitda,ebitdaMargin,enterpriseValue,priceToEarnings,priceToBook,priceToSales,evToEbitdaeevToRevenueestão sendo retirados de Financials extended em favor das versões de Valuation e de Índices (Ratios), calculadas sobre os últimos doze meses (portanto os valores diferem).
Por ação
Tabelas: perShare.quarterly, perShare.yearly
Um registro como arquivado: sharesOutstanding está na base de desdobramento reportada para aquele período, então não é comparável entre os dois lados de um desdobramento. Use Valuation para qualquer comparação. Os valores são strings de 4 casas decimais, salvo indicação em contrário.
| Campo | Observações |
|---|---|
date | Data de fim do período |
sharesOutstanding | String de 2 casas |
sharesBasis | "dei" / "weightedAverageSharesDiluted" / "weightedAverageSharesBasic" |
bookValuePerShare, tangibleBookValuePerShare | |
revenuePerShare, ebitdaPerShare | |
operatingCashFlowPerShare, freeCashFlowPerShare | |
cashPerShare, netCashPerShare | |
netDebtPerShare, totalDebtPerShare | |
workingCapitalPerShare, retainedEarningsPerShare | |
dividendsPaidPerShare | |
netCurrentAssetValuePerShare | NCAV de Graham |
grahamNumber |
Valuation
Tabelas: valuation.quarterly, valuation.yearly (mais o valuation.latest, que não é tabela)
Três regras:
- Os múltiplos são
marketCap / agregado, nãoprice / perShare. Não os recalcule a partir deperShare— comparativos reapresentados fazem os dois divergirem nos períodos mais antigos. - Um múltiplo
Noneao lado de um rendimento com sinal está correto, não é bug. Os múltiplos marcados como null com denominador não positivo abaixo viramNonequando o denominador não é positivo, enquanto os rendimentos e obookToMarketRatiomantêm o sinal. Uma empresa com prejuízo mostrapriceToEarningsRatio: NoneeearningsYield: -5.0. - Os múltiplos são dos últimos doze meses, mesmo em períodos trimestrais — um P/L trimestral é um verdadeiro P/L dos últimos doze meses, não um trimestre anualizado.
Metadados
| Campo | Observações |
|---|---|
date | Data de fim do período |
sharePrice | String de 4 casas |
priceDate | YYYY-MM-DD |
priceLagDays | Inteiro |
priceBasis | "as-quoted" (mais recente) / "split-adjusted" / "unreconciled" — desconfie de "unreconciled" |
approximate | true em períodos históricos (ajuste retroativo residual de dividendos) |
sharesRebased | A quantidade de ações foi levada para a base de desdobramento atual |
sharesOutstanding | String de 2 casas, base de desdobramento atual — difere de perShare.sharesOutstanding (como arquivado) nos períodos mais antigos |
Tamanho: marketCap, enterpriseValue — strings monetárias de 2 casas.
Múltiplos (números de 4 casas)
| Campo | Null com denominador não positivo |
|---|---|
priceToEarningsRatio | sim |
priceToBookRatio | sim |
priceToTangibleBookRatio | sim |
priceToSalesRatio | |
priceToFreeCashFlowRatio | sim |
priceToOperatingCashFlowRatio | sim |
pegRatioTrailing | sim |
enterpriseValueToEbitdaRatio | sim |
enterpriseValueToEbitRatio | sim |
enterpriseValueToSalesRatio | |
enterpriseValueToFreeCashFlowRatio | sim |
enterpriseValueToOperatingCashFlowRatio | |
enterpriseValueToInvestedCapitalRatio | |
bookToMarketRatio | mantém o sinal |
netDebtToMarketCapRatio | |
marketCapToTotalAssets | |
altmanZScore |
Rendimentos — porcentagens de 2 casas, com sinal: earningsYield, ebitToEnterpriseValueYield, freeCashFlowYield, operatingCashFlowYield, dividendYield, buybackYield, shareholderYield.
valuation.latest — não é um período. Um único objeto que carrega todos os campos acima mais priceAsOf, priceAgeDays, priceSource, fundamentalsAsOf e ttmBasis. Fica ao lado das chaves de data, então não é uma entrada de tabela e nunca aparece em um snapshot no horário de uma barra — lê-lo em um backtest seria antecipação. Acesse-o por qc_fundamentals.raw["valuation"]["latest"]; é None quando não há preço disponível.
Scores
Tabelas: scores.quarterly, scores.yearly
| Campo | Observações |
|---|---|
date | Data de fim do período |
piotroskiFScore | Inteiro de 0 a 9 |
piotroskiComponents | Objeto ou None — chaves roaPositive, cfoPositive, roaImproved, accrualQuality, leverageImproved, currentRatioImproved, noShareIssuance, grossMarginImproved, assetTurnoverImproved, cada uma 1, 0 ou None |
altmanZScorePrivate | 4 dec. — Z-prime, patrimônio contábil |
beneishMScore | 4 dec. |
beneishComponents | Objeto ou None — chaves dsri, gmi, aqi, sgi, depi, sgai, tata, lvgi (números de 4 dec.) |
Duas ausências esperadas, nenhuma delas é um erro:
- O primeiro período de um declarante não traz scores — eles precisam de um ano anterior para comparar.
- Para os SIC 6000–6799 (bancos, corretoras, seguradoras, REITs) ambos os grupos ficam vazios e
scores.notApplicableReasoné"financial-sector-sic". Trate isso como "não aplicável", não como "sem dados". Leia-o deqc_fundamentals.raw["scores"]["notApplicableReason"].
TTM
ttm é um único objeto, não uma tabela — agregados dos últimos doze meses na data do upload, não na data de qualquer barra. Ele nunca aparece em um snapshot; acesse-o por qc_fundamentals.raw["ttm"] (seguro nas execuções forward, antecipação em um backtest).
- Metadados:
basis("quarterly"/"annual"),asOf,periodsUsed(list[str]),complete(bool),synthetic(bool — o 4T fiscal foi reconstruído; normal, geralmentetrue),coverageDays(cerca de 365). - Fluxos — somados em 4 trimestres, strings de 2 casas exceto
epsBasic/epsDiluted(4 dec.):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. - Saldos pontuais — último período, nunca somados, strings de 2 casas:
totalAssets,totalLiab,totalStockholderEquity,totalCurrentAssets,totalCurrentLiabilities,totalDebt,netDebt,cashAndShortTermInvestments,goodWill,intangibleAssets,netWorkingCapital,retainedEarnings,netReceivables,inventory,accountsPayable,propertyPlantAndEquipmentNet,preferredStockTotalEquity,commonStockSharesOutstanding,minorityInterest.
Procedência das métricas (metricsInputs / metricsHealth)
Objetos planos que descrevem de onde vieram as métricas:
"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"
}Confira metricsHealth["prices"] != "absent" antes de depender de campos baseados em preço; "stale" ainda é utilizável — compare com priceAsOf. metricsInputs is None significa um pacote anterior à expansão das métricas. Os campos aparecem símbolo a símbolo conforme ele é reenviado, então a cobertura é irregular por um tempo: trate cada bloco acima como opcional.
Convenções de tipo para os blocos de métricas
| Classe | Tipo JSON | Casas decimais | Exemplo |
|---|---|---|---|
| Agregados monetários | string | 2 | "4519282704050.00" |
Valores por ação, sharePrice | string | 4 | "309.3500" |
| Quantidades de ações | string | 2 | "14608963000.00" |
| Índices / múltiplos / giro / cobertura / scores | número | 4 | 28.0462 |
| Porcentagens (margens, retornos, rendimentos, distribuição, crescimento, CAGR, alíquota) | número | 2 | 42.35 significa 42,35% |
| Dias (DSO / DIO / DPO / CCC / ciclo operacional) | número | 2 | 29.2 |
Contagens (piotroskiFScore, priceLagDays) | número | inteiro | 8 |
| Datas | string | — | YYYY-MM-DD |
Cada métrica pode ser nula de forma independente. Um objeto de período é omitido por completo quando todas as suas chaves que não são metadados são nulas. Um bloco é {"quarterly": {}, "yearly": {}} quando vazio — nunca null, nunca omitido. NaN / Infinity nunca aparecem.
Informações da empresa
companyInfo é um objeto plano — não é indexado por data e não aparece nos snapshots current(...) / get_data_with_offset(...). Acesse-o diretamente:
info = f.raw["companyInfo"]| Campo | Tipo | Observações |
|---|---|---|
entityType | string | null | por exemplo "operating" |
entityName | string | null | Razão social da entidade |
cik | string | null | Chave de índice central da SEC |
sic | string | null | Código de indústria SIC |
sicDescription | string | null | Categoria SIC legível |
stateOfIncorporation | string | null | Código de estado de duas letras |
fiscalYearEnd | string | null | Formato "MMDD", por exemplo "0926" = 26 set. |
category | string | null | Categoria do declarante |
phone | string | null | Telefone de contato |
exchanges | string[] | Códigos de bolsas |
tickers | string[] | Símbolos de negociação |
businessAddress | object | null | street1, street2, city, stateOrCountry, zipCode |
Observações e armadilhas
- Sempre proteja contra
None. Se os dados fundamentalistas não estiverem configurados,fundamentalséNone. Dentro de um snapshot, seções individuais (por exemploearnings.Trend,scores) também podem sernullem algumas barras, e os blocos da expansão das métricas podem faltar por completo em pacotes mais antigos. - Sempre passe
symbol=em execuções com vários símbolos e Screener — o recurso do pacote principal pode não ser o ticker em que você está. - Números podem ser strings. O JSON subjacente costuma enviar as métricas numéricas como strings; converta com
float(...)ao fazer contas. - A indexação do mais novo para o mais antigo vale para as tabelas indexadas por data e para as consultas por deslocamento — o índice
0é o período elegível mais recente no horário da barra,1é o anterior, etc. - O carimbo de tempo da barra é a fonte da verdade para saber qual relatório é o "atual" — passe
bar["t"](oubar.t[0]) diretamente; você não precisa analisá-lo você mesmo.

