Metodologia

Fórmulas, convenções e limitações

Todas as fórmulas vivem em dois lugares simultaneamente: o notebook Python que produz a Gold e o módulo TypeScript do frontend. Esta página documenta as escolhas feitas e as suas consequências práticas.

Fonte de dados

Preços de fechamento ajustados (splits + proventos) vêm do Yahoo Finance via yfr_py, porta Python do pacote R msperlin/yfR. A camada Bronze armazena tanto o preço bruto (price_close) quanto o ajustado (price_adjusted) para preservar auditoria sobre 26 anos de eventos corporativos.

Retorno YTD
ln(close_ult / close_primeiro_dia_util_ano)
Volatilidade anualizada
std(retornos_log_diarios) × √252
Drawdown máximo
min((P − cummax(P)) / cummax(P))
Sharpe vs CDI
(retorno_anualizado − CDI_anual) / vol_anualizada
Convenção de retornos — log vs simples

Usamos log-retornos diários r_log = ln(P_t / P_{t-1}) para estimação porque são (i) aproximadamente Gaussianos sob hipóteses leves e (ii) aditivos no tempo. Markowitz, porém, é formulado em retornos simples r_simp = P_t/P_{t-1} − 1, que são os únicos aditivos entre ativos (retorno da carteira = soma ponderada).

Para fechar essa lacuna aplicamos a correção de Jensen antes de anualizar:

μ_simples ≈ μ_log + σ²_diag / 2

Sem essa correção, com vol anualizada σ ≈ 30%, o viés é da ordem de σ²/2 ≈ 4,5% a.a. — magnitude maior que o equity premium brasileiro e maior que a intensidade de shrinkage de Σ. A correção é aplicada em lib/mvEstimators.ts dentro de jensenCorrectMu.

Markowitz analítico (Merton 1972)

A fronteira eficiente é resolvida em forma fechada via Lagrangianos com matriz A = 𝟙ᵀΣ⁻¹𝟙, B = 𝟙ᵀΣ⁻¹μ, C = μᵀΣ⁻¹μ, D = AC − B². Para retorno-alvo r:

w(r) = λ·Σ⁻¹𝟙 + γ·Σ⁻¹μ    λ = (C − rB)/D    γ = (rA − B)/D

Carteira de mínima variância: w_mv = Σ⁻¹𝟙 / A. Carteira tangência (máximo Sharpe): w_t = Σ⁻¹(μ − rf𝟙) / 𝟙ᵀΣ⁻¹(μ − rf𝟙).

CAL / Linha do Mercado de Capitais (CML)

A reta tangente à fronteira no ponto de máximo Sharpe é a Capital Allocation Line (CAL) — também chamada de linha do mercado de capitais (CML) na tradição de Tobin (1958) e Sharpe (1964):

A inclinação da reta é precisamente o índice de Sharpe da carteira de tangência (preço de mercado do risco). Geometricamente, a CAL/CML domina toda alternativa buy-and-hold em ativos isolados: qualquer ponto abaixo da reta é, por construção, mean-variance dominado.

Nota de terminologia: em ortodoxia CAPM estrita, “CML” designa especificamente a reta entre rf e a carteira de mercado(todos os ativos investíveis, pesados por capitalização). Para um subconjunto amostral como o nosso (subset de tickers B3), o nome técnico é CAL. Mantemos os dois rótulos porque, na prática brasileira, “linha do mercado de capitais” é o termo mais usado e o conceito é o mesmo: a fronteira ampliada por rf.

Shrinkage da matriz de covariância

Aplicamos Ledoit-Wolf (2004) com alvo de correlação constante:

Σ̂ = δ* · F + (1 − δ*) · S

onde S é a covariância amostral, F é o alvo estruturado de correlação constante e δ* é a intensidade ótima data-driven (não hardcoded). Implementação em lib/mvEstimators.ts → ledoitWolf(). A intensidade δ* estimada é exposta na UI.

Long-only via projeção gradiente

Restrições w_i ≥ 0 resolvidas por projeção iterativa: a partir da solução analítica unconstrained (Merton), zera-se o peso mais negativo, remove-se o ativo do problema e re-resolve no sub-espaço — repete até que todos os pesos remanescentes sejam não-negativos e somem 1. Implementação em lib/markowitz.ts (funções _longOnly e _longOnlyForTarget). Não é um solver QP completo: a abordagem é uma heurística greedy (active-set sem KKT explícito) — para o tamanho do nosso problema (N ≈ 40 tickers, Σ Ledoit-Wolf bem-condicionada) ela coincide com a solução QP exata em quase todos os casos práticos. Para Σ singular ou pathologicamente mal-condicionada não há garantia teórica de optimalidade.

Erro de estimação de μ e Σ

Mean-variance é extremamente sensível a erro de estimação em μ (Merton 1980, "On Estimating the Expected Return on the Market"). Para uma janela de 1 ano de retornos diários com vol anual σ ≈ 30%, o erro-padrão da média anualizada é:

Ou seja, "retorno esperado de 10% ± 30%" é estatisticamente indistinguível de "retorno esperado de 0% ± 30%". Pior: a fronteira de Markowitz é uma estatística de máxima ordem — concentra-se sempre no ativo que teve mais sortena amostra, então o máximo de N estimativas ruidosas é viesado para cima mesmo com T grande. DeMiguel, Garlappi e Uppal (2009, "Optimal Versus Naive Diversification") mostram empiricamente que a carteira 1/N (peso igual) frequentemente bate Markowitz out-of-sample exatamente por isso. Combatemos com a stack descrita abaixo.

Stack de shrinkage em μ — Jorion + macro-prior

A μ usada na visualização e nas carteiras sugeridas passa por duas camadas de shrinkage aplicadas em sequência. Sem elas, o gráfico mostra retornos esperados em torno de 50–100% a.a. (puro ruído amplificado pelo viés do máximo). Com elas, o gráfico aterrissa na faixa realista [rf, rf + σ_mkt].

Estágio 1 · Bayes-Stein (Jorion 1986)

Encolhe cada μ̂_i em direção à média grand μ_g = (𝟙ᵀΣ⁻¹μ̂)/(𝟙ᵀΣ⁻¹𝟙) (retorno da carteira de mínima variância) com intensidade data-driven ψ*:

Para nosso universo (~60–80 tickers B3) e janelas de 1–5 anos, ψ̂ bruto satura próximo de 1 (o numerador N+2 domina T·quad com Σ Ledoit-Wolf bem-condicionado), o que colapsaria todo μ para μ_g e tornaria max-Sharpe ≡ min-variância em qualquer janela. Aplicamos um teto explícito ψ ≤ 0,50 em lib/mvEstimators.ts → jorionShrinkMu() para preservar metade do sinal cross-sectional do μ̂ bruto. Quanto menor T e maior dispersão de μ̂, mais o estimador é encolhido. Implementação em lib/mvEstimators.ts → jorionShrinkMu(). O valor de ψ* efetivamente aplicado é exposto no badge da tela de Sugestões.

Estágio 2 · Macro-anchor (rf + ERP)

Mesmo após Jorion, a própria μ_g herda o viés do máximo (se um setor rallyou no período, ele puxa μ_g junto). O estágio 2 encolhe μ̂_BS em direção a (rf + ERP)·𝟙 — um prior macro ancorado no equity risk premium de longo prazo, independente do que aconteceu na janela:

α(T) é em forma de U — dois problemas diferentes tornam μ̂ pouco confiável em extremos opostos de T:

  • Janelas curtas (T ≲ 5 a): ruído de máximo de N. SE(μ̂_anual) ∝ σ/√T é enorme, o ativo escolhido pelo max-Sharpe é simplesmente aquele com mais sorte na amostra, μ̂ pode explodir para +60–100% mesmo após Jorion.
  • Janelas longas (T ≳ 10 a): universo esparso e instável. O filtro de cobertura 100% reduz o número de tickers (de ~80 no IBOV recente para ~14 com cobertura de 26 anos). Esse subconjunto não é necessariamente uma amostra de “vencedores” — o Yahoo Finance preserva tickers que ainda negociam, vencedores E perdedores (no nosso universo com cobertura completa de 26 anos a média transversal de μ̂ está abaixo do CDI). Mas com tão poucos pontos, μ̂ depende fortemente de qual mix específico sobreviveu, não da distribuição estrutural do mercado. O prior macro rf + ERP é um estimador independente da realização amostral, e em janelas longas com universo esparso é genuinamente mais informativo do que a média da amostra.

NB: esta justificativa é deliberadamente diferente da intuição clássica de “survivorship bias = só sobrevivem vencedores” típica de bases tipo CRSP. Em B3 via Yahoo, o universo de cobertura completa contém perdedores também — o problema é a esparsidade e instabilidade do universo, não viés direcional de sobreviventes. A correção (puxar para o prior macro) é a mesma; o motivo é diferente.

Operacionalmente, tomamos o máximo de duas pernas lineares (ruído + esparsidade), com piso 0,30 e teto 0,60. Intervalo deliberadamente baixo após o fix dimensional de Jorion (Estágio 1 agora encolhe ~50% do sinal); α(T) acima de ~0,60 faria max-Sharpe colapsar para min-variância em toda janela.

Comportamento indicativo: α(6m) ≈ 0,60, α(1y) ≈ 0,58, α(5y) ≈ 0,42, α(10y) ≈ 0,30 (piso), α(15y) ≈ 0,40, α(20y) ≈ 0,50, α(MAX) = 0,60 (teto).

ERP fixo em — estimativa de Damodaran 2026 para Brasil emergente (ver Damodaran “Country Risk Premium”). Para a taxa CDI atual (rf ≈ 12–15%), o âncora fica em 18–21% — o teto natural das expectativas de retorno realistas para uma carteira de ações brasileiras.

Estágio 3 · Teto por ativo (sanity bound estilo Black-Litterman)

Após os dois estágios anteriores, ainda capamos cada μ_i individualmente em rf + 3·ERP — nenhum ativo isolado pode esperar mais que três equity-risk-premia de excesso. Com rf = 13% e ERP = 6%, o teto fica em 31% — estritamente acima do CAGR de longo prazo do Ibovespa em BRL nominal e estritamente abaixo da cauda direita de janelas rolantes de 5 anos. Impede que um único sobrevivente outlier domine a esquina max-Sharpe.

Calibração dos constantes K=3, ERP=6% e da curva α(T) é justificada em Calibração empírica abaixo, com as fontes que ancoram cada decisão.

Por que duas camadas?

Jorion sozinho lida com a dispersão entre ativos (todos encolhidos toward o mesmo ponto). O macro-anchor lida com a localização absoluta desse ponto (que o Brasil dos últimos 5–10 anos não dita o equity premium estrutural). Aplicadas juntas, extraem informação relativa entre tickers dos dados (Jorion preserva ranking) mas ancoram o nível em teoria (macro prior). O resultado é uma fronteira que se parece muito mais com o que livros-texto de CAPM emergente esperam (σ ≈ 25%, E[r] ≈ rf + 5–8%) e muito menos com uma anedota de momentum recente.

Outras defesas contra ruído (já em produção)
  • Σ: Ledoit-Wolf 2004 com alvo de correlação constante (seção acima).
  • Bootstrap das alocações no advisor: só recomenda vender/comprar/reduzir se |Δw| > 2·σ_bootstrap; caso contrário usa “considerar”.
  • Backtest walk-forward contra 1/N e B3 no construtor — sanidade out-of-sample.
  • Outlier guards em retornos diários (ver seção abaixo) eliminam ticks corrompidos antes da estimação.
Calibração empírica — benchmarks e decisões

Toda a stack de shrinkage acima introduz três constantes (α(T), ERP=6%,K=3). Esta seção documenta as fontes empíricas consultadas e a decisão de calibração derivada de cada uma. O objetivo: produzir um intervalo defensável para o retorno esperado de uma carteira max-Sharpe long-only de ações brasileiras, ancorado em dados públicos, e demonstrar que a stack rejeita números fora desse intervalo independentemente do tamanho da janela T.

1 · Retornos históricos do Ibovespa (BRL nominal)
  • 50 anos (1968–2019): ≈ 11,7%/a nominal em USD; ≈ 6,9%/a real em BRL após IGPDI. (Economatica — 50 anos do Ibovespa)
  • 20 anos (1999–2009): CAGR ≈ 10,0%/a nominal e ≈ 3,6%/a real.
  • 25 anos (2000–2024): CAGR ≈ 8,1%/a nominal vs CDI ≈ 13%/a — equity premium realizado negativo no Brasil pós-Plano Real, pelo regime de juros altos. (Clube dos Poupadores — CDI, Bolsa e Dólar 2000–2024)
  • 5 anos rolante: melhor ≈ 40%/a, pior ≈ −9%/a — caudas do índice em janelas curtas, realizadas, não esperadas ex ante.
  • Média aritmética 1968–2019: 21,3%/a com σ ≈ 67%/a — inflada pela hiperinflação dos anos 80–90 e por ser aritmética (não geométrica). Não usada como referência. (BCB WP 525 — Long-term stock returns in Brazil)
2 · Equity Risk Premium forward
  • Damodaran 2026 — ERP Brasil: ≈ 6%/a acima da rf (composição: ERP maduro + spread de risco-país). (Damodaran — Country Risk Premiums, ERP 2026 Edition)
  • Buffett-indicator forward Brasil: ≈ 12,3%/a nominal esperado (decomposição: crescimento PIB local 6,0% + dividend yield 4,5% + reversão do múltiplo 1,8%). Concordância de ordem com Damodaran em rf ≈ 6,3% + ERP ≈ 6%.
  • Fundos de ações brasileiros: a maioria sub-performa o CDI no longo prazo; somente ~1% é consistente. Reforça que o forward realista de uma carteira curada de ações dificilmente excede rf + ERP. (NeoFeed — fundos de ações)
3 · Banda defensável de E[r] para max-Sharpe long-only B3

Sintetizando: para uma carteira curada long-only de ações brasileiras com shrinkage adequado, o retorno esperado deve cair em

  • ≤ 17%: stack super-encolheu (provável quando T curto e dispersão amostral baixa).
  • 17–23%: zona alvo — coerente com Damodaran ERP forward e com a banda CAPM emergente padrão.
  • 23–27%: aceitável se o regime de juros estiver elevado e a carteira inclinada a low-vol.
  • 27–31%: começa a cheirar a overfit ao período in-sample. ≥ 31%: cortado por construção (Estágio 3, teto K=3).
4 · Decisões de calibração (e por quê)
ConstanteValorFonte / racional
ERP6%/aDamodaran 2026 para Brasil emergente. Compatível com a decomposição Buffett-indicator forward. Mantido fixo (não estimado em-amostra) para impedir que regimes de juros recentes capturem o prior estrutural.
α(T)U-shape, piso 0,30, teto 0,60Forma em U porque dois problemas opostos tornam μ̂ pouco confiável em extremos de T: ruído de máximo (T curto, SE(μ̂) ∝ σ/√T enorme) e universo esparso/instável (T longo, cobertura completa filtra a maioria dos tickers — o prior macro é genuinamente mais informativo que a média de uma amostra de ~14 sobreviventes mistos vencedores/perdedores). Curva calibrada para que nenhuma janela entregue μ_g fora da banda [17%, 27%] nas séries Yahoo Finance 1999–presente do IBOV.
K3Teto por ativo em rf + K·ERP. K=3 ⇒ 31% no regime atual — estritamente acima do CAGR de longo prazo do Ibov (11,7%) e abaixoda cauda direita 5y rolante (40%). Inspirado em Black-Litterman: views “razoáveis” ficam dentro de 3 desvios do prior estrutural. K=2 cortaria sinais legítimos de momentum em janelas médias; K=4 deixa passar artefatos de sobrevivência.
Filtro de tickerscobertura 100% na janelaDecisão consciente: introduz viés de sobrevivência em janelas longas. Mantido porque o alternativo (imputar preços faltantes) é pior — corromperia Σ. O Estágio 2 com α(T) crescente para T grande é exatamente a compensação principled.
5 · Caso forense — como o bug se manifestava

Antes da U-shape de α(T) e do teto K=3 (commit anterior), janelas longas produziam:

Janelaα antigoE[r] antigoα novoE[r] esperado
6M0,90+27,1%0,95~25–27%
1Y0,88+24,1%0,93~22–23%
5Y0,71+22,2%0,77~21–22%
10Y0,50+26,7%0,57~25%
15Y0,30 (piso)+23,3%0,73~21%
20Y0,30 (piso)+73,6% ⚠0,90~26–28%
MAX0,30 (piso)+109,6% ⚠0,95 (teto)~25–27%

A álgebra do bug: em 20Y com α piso=0,30, o universo de sobreviventes entregava μ_BS ≈ 97%(Jorion não consegue ajustar porque todos os sobreviventes estão na cauda direita). Então μ_final = 0,70·97 + 0,30·19 = 73,6% — exatamente o número observado. O novo α(20Y) ≈ 0,90 produz 0,10·97 + 0,90·19 ≈ 27%, e o teto K=3 em 31% garante que qualquer ativo individual viesado também é cortado.

6 · O que esta calibração não faz
  • • Não substitui dados ajustados por inflação — todas as séries são nominais em BRL. Para análise real, usar IGPDI ou IPCA por fora.
  • • Não corrige o viés de sobrevivência do universo (apenas seu impacto no μ). Tickers que faliram ou foram descontinuados nunca entram no IBOV histórico via Yahoo Finance.
  • • Não é uma previsão. O âncora rf + ERP é um prior estrutural, não um forecast — a fronteira sempre vai variar com a janela mesmo após shrinkage.
Visualização — eixos dinâmicos

Os eixos da fronteira eficiente são totalmente data-driven: não há piso nem teto fixo. Cada eixo é ajustado ao envelope dos pontos efetivamente desenhados (curva da fronteira, mín. variância, máx. Sharpe, marcadores de carteira, P2–P98 da nuvem, rf e poupança) com margem uniforme (10% no Y, 8% no X). O resultado é um canvas que se re-enquadra de forma estética sob qualquer janela temporal. Ativos individuais cujas coordenadas caem fora desse enquadramento são visualmente omitidos (não removidos do cálculo) para manter o foco onde a fronteira efetivamente vive.

Reprodutibilidade — PRNG seeded

A nuvem Monte Carlo da fronteira e os reamostradores do bootstrap usam mulberry32 com semente fixa 0xCAFEFEED (ver lib/prng.ts). Isso garante que dois carregamentos da mesma página com os mesmos parâmetros produzem exatamente a mesma nuvem e o mesmo intervalo de confiança do bootstrap — um screenshot é reproduzível, e a gating do advisor em |Δw| > 2·σ_bootstrap não pode mudar entre reloads sem dados novos. Para forçar reamostragem estocástica (testes A/B de robustez), passe rng: mulberry32(Date.now()) nas funções buildFrontier e bootstrapMaxSharpe.

Bootstrap — cobertura efetiva (Beff)

O bootstrap em bootstrapMaxSharpe executa B resamples e pula iterações em que a optimização não converge (sem substituir por 1/N, que enviesaria a σ_bootstrap para baixo e relaxaria a gate de significância do advisor). O retorno expõe B = Beff (contagem efetiva); o advisor detecta o caso degenerado Beff = 0(todos os σ exatamente zero) e suprime verbos fortes (vender / comprar / reduzir) com um aviso dedicado de “Bootstrap sem cobertura”. Isso impede recomendações fortes em ruído quando o bootstrap não consegue calibrar.

Fallback de pesos iguais — sinal visível

Se o solver long-only greedy esgota todos os ativos sem produzir uma carteira não-negativa válida (caso típico: todos os μ acabam abaixo do rf após a stack de shrinkage em uma janela degenerada),buildFrontier retorna isEqualWeightFallback: truee a UI exibe um banner vermelho em cima do gráfico avisando que a “máx. Sharpe” mostrada é equal-weight, não o ponto analítico de tangência. Esse fallback substitui o antigo comportamento silencioso de retornar um vetor zero.

Janelas de covariância

A Gold publica matrizes de covariância anualizadas para 1Y, 5Y, 10Y, 15Y, 20Y e janela completa. Tickers sem cobertura total na janela são excluídos e listados em valid_tickers_<janela>.json.

Outlier guards

Log-retornos diários com |r| > 0,5 (≈ 65% de variação em um dia) e log-retornos de janela com |r| > 3 são descartados como corrupção upstream (caso real: UGPA3 com close de R$ 3.302.500 em 2007-05-07 no Yahoo).

Limitações declaradas
  • · Cobertura limitada a IBOV + tickers complementares B3 (~120 ativos), não cobre Small Caps.
  • · Sem custos de transação, IR, ou turnover. Os pesos sugeridos são alocações teóricas single-period.
  • · Sem ajuste por regimes — B3 tem quebras estruturais (2016, 2020, 2024) que violam IID. Janelas mais longas atenuam mas não eliminam.
  • · CDI em BRL nominal, consistente com retornos em BRL nominal. Para leitor que pensa em USD, considerar inflação BRL/USD.
  • ·"Análise da carteira" é determinística (sem LLM) e baseada em comparação ponto-a-ponto com o tangency portfolio do snapshot. Não constitui recomendação de investimento.
Referências

Cada decisão metodológica acima é ancorada em uma fonte primária (paper, livro, base pública ou regulação). Links externos abrem em nova aba.

A · Otimização média-variância (Markowitz, Tobin, Merton, CAPM)
  • • Markowitz, H. (1952). “Portfolio Selection”. Journal of Finance, 7(1), 77–91. doi:10.2307/2975974
  • • Tobin, J. (1958). “Liquidity Preference as Behavior Towards Risk”. Review of Economic Studies, 25(2), 65–86. doi:10.2307/2296205
  • • Sharpe, W. F. (1964). “Capital Asset Prices: A Theory of Market Equilibrium under Conditions of Risk”. Journal of Finance, 19(3), 425–442. doi:10.2307/2977928
  • • Merton, R. C. (1972). “An Analytic Derivation of the Efficient Portfolio Frontier”. Journal of Financial and Quantitative Analysis, 7(4), 1851–1872. doi:10.2307/2329621 — fórmulas fechadas A/B/C/D usadas em lib/markowitz.ts::buildFrontier.
  • • Merton, R. C. (1980). “On Estimating the Expected Return on the Market”. Journal of Financial Economics, 8(4), 323–361. doi:10.1016/0304-405X(80)90007-0 — justifica usar Σ̂ (alta SNR) e desconfiar de μ̂ (baixa SNR).
B · Shrinkage de Σ e μ (Stein, James-Stein, Jorion, Ledoit-Wolf, Black-Litterman)
  • • Stein, C. (1956). “Inadmissibility of the Usual Estimator for the Mean of a Multivariate Normal Distribution”. Proc. Berkeley Symp. Math. Stat. Probab., 197–206. projecteuclid.org
  • • James, W. & Stein, C. (1961). “Estimation with Quadratic Loss”. Proc. Berkeley Symp., 361–379. projecteuclid.org
  • • Jorion, P. (1986). “Bayes-Stein Estimation for Portfolio Analysis”. JFQA, 21(3), 279–292. doi:10.2307/2331042 — fórmula de ψ em lib/mvEstimators.ts::jorionShrinkMu.
  • • Black, F. & Litterman, R. (1992). “Global Portfolio Optimization”. Financial Analysts Journal, 48(5), 28–43. doi:10.2469/faj.v48.n5.28 — inspiração do prior macro μ̂_anchor = rf + ERP e do teto por ativo.
  • • Ledoit, O. & Wolf, M. (2003). “Improved Estimation of the Covariance Matrix of Stock Returns with an Application to Portfolio Selection”. Journal of Empirical Finance, 10(5), 603–621. doi:10.1016/S0927-5398(03)00007-0
  • • Ledoit, O. & Wolf, M. (2004). “Honey, I Shrunk the Sample Covariance Matrix”. Journal of Portfolio Management, 30(4), 110–119. doi:10.3905/jpm.2004.110 — δ* fechado em lib/mvEstimators.ts::ledoitWolf.
  • • Michaud, R. O. (1998). Efficient Asset Management: A Practical Guide to Stock Portfolio Optimization and Asset Allocation. Boston: HBR Press. (Resampled efficiency e bootstrap das alocações.)
C · Bootstrap, validação out-of-sample, 1/N
  • • Efron, B. (1979). “Bootstrap Methods: Another Look at the Jackknife”. Annals of Statistics, 7(1), 1–26. doi:10.1214/aos/1176344552
  • • DeMiguel, V., Garlappi, L., & Uppal, R. (2009). “Optimal Versus Naive Diversification: How Inefficient Is the 1/N Portfolio Strategy?”. Review of Financial Studies, 22(5), 1915–1953. doi:10.1093/rfs/hhm075 — motivação para o backtest walk-forward 1/N em lib/backtest.ts.
D · Equity risk premium & mercado brasileiro
  • • Damodaran, A. (2026). Equity Risk Premiums (ERP): Determinants, Estimates and Implications — The 2026 Edition. SSRN. SSRN 6361419 — fonte do ERP_PRIOR = 6% para Brasil.
  • • Damodaran, A. Country Default Spreads and Risk Premiums (atualizado anualmente). stern.nyu.edu
  • • Banco Central do Brasil. Long-term stock returns in Brazil: volatile equity returns for U.S.-like investors. Working Paper Series 525, 2010. bcb.gov.br/wps525 — σ ≈ 67%/a, premium realizado.
  • • Economatica. Desempenho do Ibovespa: 50 anos de história (Jan 2019). economatica.com — CAGR nominal 11,74%/a (1968–2018, USD).
  • • Clube dos Poupadores. CDI, Bolsa e Dólar no Brasil (2000–2024). clubedospoupadores.com — Ibov 25y CAGR ≈ 8,1%/a vs CDI ≈ 13%/a.
  • • Saraiva, J. (2024). “A dura vida dos fundos de ações: só 1% tem resultado consistente no longo prazo”. NeoFeed. neofeed.com.br
E · McLean (2011) — replicação Brasil (Chalhoub, Kirch & Terra 2015)
  • • McLean, R. D. (2011). “Share Issuance and Cash Savings”. Journal of Financial Economics, 99(3), 693–715. doi:10.1016/j.jfineco.2010.10.006 — modelo original (firmas dos EUA, 1971–2008).
  • • Almeida, H., Campello, M. & Weisbach, M. S. (2004). “The Cash Flow Sensitivity of Cash”. Journal of Finance, 59(4), 1777–1804. doi:10.1111/j.1540-6261.2004.00679.x
  • • Riddick, L. A. & Whited, T. M. (2009). “The Corporate Propensity to Save”. Journal of Finance, 64(4), 1729–1766. doi:10.1111/j.1540-6261.2009.01478.x
  • • Bates, T. W., Kahle, K. M. & Stulz, R. M. (2009). “Why Do U.S. Firms Hold So Much More Cash than They Used To?”. Journal of Finance, 64(5), 1985–2021. doi:10.1111/j.1540-6261.2009.01492.x
  • • Chalhoub, L., Kirch, G. & Terra, P. R. S. (2015). “De onde vem o caixa retido pelas firmas brasileiras?”. Revista Brasileira de Finanças, 13(4), 595–635. SciELO — a replicação brasileira que este app reproduz.
F · Implementação numérica
  • • Marsaglia, G. & Tsang, W. W. (2000). “A Simple Method for Generating Gamma Variables”. ACM Trans. Math. Software, 26(3), 363–372. doi:10.1145/358407.358414 — amostragem da nuvem em lib/markowitz.ts::_gamma.
  • • Mulberry32 PRNG, Tommy Ettinger (2017). Constante mágica 0x6d2b79f5, período 2³². gist.github.com — em lib/prng.ts.
  • • Higham, N. J. (2002). Accuracy and Stability of Numerical Algorithms (2nd ed.). SIAM. (Eliminação de Gauss-Jordan com pivoteamento parcial em lib/matrix.ts.)
G · Dados & pacotes
  • Yahoo Finance — preços ajustados (splits e proventos). Acesso via yfr_py (porta Python do pacote R msperlin/yfR). github.com/msperlin/yfR
  • CVM Dados Abertos — Demonstrações Financeiras Padronizadas (DFP) de companhias listadas, 2010–2025. dados.cvm.gov.br
  • BCB SGS — série 12 (CDI Over) — taxa diária anualizada do CDI desde 1986. Endpoint público da API SGS do BCB. api.bcb.gov.br/sgs/12
  • Recharts (visualização da fronteira) e Next.js 16 (frontend estático servido em GitHub Pages).
H · Regulação brasileira citada
  • • Lei 12.703/2012 — remuneração da caderneta de poupança (regra do piso de 0,5%/mês se SELIC > 8,5%; 70% da SELIC + TR caso contrário). Citada no rótulo de “poupança” no chart. planalto.gov.br