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.
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.
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:
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.
A fronteira eficiente é resolvida em forma fechada via Lagrangianos com matriz A = 𝟙ᵀΣ⁻¹𝟙, B = 𝟙ᵀΣ⁻¹μ, C = μᵀΣ⁻¹μ, D = AC − B². Para retorno-alvo r:
Carteira de mínima variância: w_mv = Σ⁻¹𝟙 / A. Carteira tangência (máximo Sharpe): w_t = Σ⁻¹(μ − rf𝟙) / 𝟙ᵀΣ⁻¹(μ − rf𝟙).
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.
Aplicamos Ledoit-Wolf (2004) com alvo de correlação constante:
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.
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.
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.
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].
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.
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.
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.
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.
- • Σ: 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.
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.
- • 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)
- • 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)
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).
| Constante | Valor | Fonte / racional |
|---|---|---|
| ERP | 6%/a | Damodaran 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,60 | Forma 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. |
| K | 3 | Teto 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 tickers | cobertura 100% na janela | Decisã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. |
Antes da U-shape de α(T) e do teto K=3 (commit anterior), janelas longas produziam:
| Janela | α antigo | E[r] antigo | α novo | E[r] esperado |
|---|---|---|---|---|
| 6M | 0,90 | +27,1% | 0,95 | ~25–27% |
| 1Y | 0,88 | +24,1% | 0,93 | ~22–23% |
| 5Y | 0,71 | +22,2% | 0,77 | ~21–22% |
| 10Y | 0,50 | +26,7% | 0,57 | ~25% |
| 15Y | 0,30 (piso) | +23,3% | 0,73 | ~21% |
| 20Y | 0,30 (piso) | +73,6% ⚠ | 0,90 | ~26–28% |
| MAX | 0,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.
- • 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.
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.
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.
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.
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.
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.
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).
- · 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.
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.
- • 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).
- • 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.)
- • 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.
- • 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
- • 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.
- • 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.)
- • 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).
- • 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