Mestrado Profissional em Administração
IFMG - Campus Formiga
26 de junho de 2025
O que vimos até aqui?
Aula 1 ✅
Aula 2 ✅
Aula 3 ✅
Aula 4 ✅
Conceitos de Variáveis e Observações em Estatística ✅
Conceito de Dados Organizados (Tidy Data) ✅
Tipos atômicos e classes principais de dados da linguagem R ✅
Tipos de Dados Tradicionais em Finanças: ✅
Importação e Preparação de Dados Típicos de Finanças com exemplos práticos ✅
Aula 5 ✅
Aula 6 ✅
Aula 7 ✅
Aula 8 ✅
Modelos
Conceitos Fundamentais de Probabilidade
Distribuições de Probabilidade de VA Discretas
Distribuição de Bernoulli
Características de uma Distribuição de Probabilidade
Distribuição Binomial
Distribuições de Probabilidade de VA Contínuas
Tópicos - Fundamentos de Probabilidade e Simulação
Modelos
Conceitos Fundamentais de Probabilidade
Distribuições de Probabilidade de VA Discretas
Distribuição de Bernoulli
Características de uma Distribuição de Probabilidade
Distribuição Binomial
Distribuições de Probabilidade de VA Contínuas
Tópicos - Fundamentos de Probabilidade e Simulação
Simulação de Monte Carlo - Aplicações
Aplicação - Valor-em-Risco (VaR)
Aplicação - CVaR (Conditional Value at Risk, Expected Shortfall)
Diretrizes para Aulas Mais Produtivas
⌨️ Código com método:
95% dos erros são evitáveis com:
🤝 Inteligência colaborativa:
💪 Capacidade de Resolver Problemas
Cada erro resolvido é uma evolução da sua habilidade analítica
Fundamentos Teóricos
Transformamos o valor esperado teórico em um estimador empírico via amostragem aleatória:
\[ \theta = E[g(X)] \;\;\approx\;\; \hat\theta_N = \frac{1}{N} \sum_{i=1}^N g(X_i), \quad \text{com } X_i \overset{\text{i.i.d.}}{\sim} f_X \]
Simular = gerar amostras pseudo-aleatórias e calcular a média.
Conceito | Enunciado (intuitivo) | Implicação prática |
---|---|---|
Lei dos Grandes Números (LLN) | \(\hat\theta_N \to \theta\) quando \(N \to \infty\) | O estimador é consistente |
Teorema Central do Limite (TCL) | \(\hat\theta_N \overset{d}{\longrightarrow} N(\theta, \sigma^2 / N)\) | Podemos quantificar o erro da estimativa |
Erro-Padrão (EP) | \(V\text{ar}(\hat\theta_N) = \sigma^2/N \;\Rightarrow\; \text{EP} = \sigma / \sqrt{N}\) | Estimamos incerteza e construímos intervalos de confiança |
Erro de MC | \(\text{EP} \propto 1/\sqrt{N}\) | Dobrar \(N\) ↓ erro ≈ 29%; quadruplicar ↓ erro 50% |
\[ \underbrace{ \hat\theta_N = \frac{1}{N} \sum_{i=1}^{N} g(X_i) }_{\text{média amostral}} \quad \overset{d}{\longrightarrow} \quad N \left( \theta, \frac{\sigma^2}{N} \right) \quad \text{com } \sigma^2 = V\text{ar}[g(X)] \]
Critérios de Aplicação
✅ Use Monte Carlo quando:
❌ Evite Monte Carlo quando:
Exemplos Práticos:
Situação | Método Recomendado | Justificativa |
---|---|---|
VPL com taxa fixa e fluxos certos | Determinístico | Sem incerteza significativa |
Projeto com 5+ parâmetros incertos | Monte Carlo | Múltiplas fontes de risco |
Análise rápida de sensibilidade | Cenários | Simplicidade e velocidade |
💡 Regra prática: Se você tem múltiplas incertezas OU precisa quantificar probabilidades de risco, use Monte Carlo.
Comparando Abordagens
Análise de Sensibilidade (3 cenários):
Pessimista: VPL = -R$ 15.000
Base: VPL = +R$ 2.600
Otimista: VPL = +R$ 22.000
✅ Vantagens: Simples, rápida
❌ Limitações: Apenas 3 pontos, sem probabilidades
Simulação de Monte Carlo (100.000 cenários):
P(VPL > 0) = 73% → probabilidade de sucesso
P(VPL < -10.000) = 8% → risco de perda severa
VPL médio = R$ 3.200 → retorno esperado
Percentil 5% = -R$ 12.500 → pior caso provável
✅ Vantagens: Informação completa sobre risco
❌ Limitações: Mais complexa
Qual informação é mais útil para decidir?
Pergunta do Gestor | Sensibilidade | Monte Carlo |
---|---|---|
“Qual a chance de sucesso?” | ❌ “Depende do cenário” | ✅ “73% de probabilidade” |
“Quanto posso perder?” | ❌ “Até R$ 15.000” | ✅ “95% chance: perda < R$ 12.500” |
“Vale o risco?” | ❌ Subjetivo | ✅ Quantificado |
💡 Monte Carlo fornece exatamente as informações que gestores precisam para decisões sob risco.
Onde é Padrão da Indústria
💼 Análise de Viabilidade de Projetos de Investimento
📊 Gestão de Risco
🏛️ Setores que Utilizam Métodos de Monte Carlo no Brasil
Setor | Aplicações Típicas | Vantagens e Necessidade | Casos Brasileiros |
---|---|---|---|
Bancos & Finanças | - Cálculo de capital regulatório (Basileia III) - Stress testing de carteiras - Avaliação de derivativos |
- Exigência do BCB - Modelagem de riscos correlacionados - Precificação de instrumentos complexos |
Itaú, Bradesco, Banco Central do Brasil |
Seguradoras & Resseguradoras | - Cálculo de reservas técnicas - Modelagem de catástrofes naturais - Solvência (SUSEP) |
- Normas CNSP - Eventos de baixa probabilidade/alto impacto - Agregação de riscos múltiplos |
IRB Brasil RE, Porto Seguro |
Óleo & Gás | - Avaliação de reservas (P50/P90) - Análise de viabilidade econômica - Gestão de projetos offshore |
- Incerteza geológica - Volatilidade de preços - Otimização E&P |
Petrobras, Pré-Sal, ANP |
Mineração | - Avaliação de jazidas - Análise de viabilidade - Gestão de commodities |
- Variabilidade de teores minerais - Exposição a preços internacionais - Longo ciclo de investimento |
Vale, CBMM (Nióbio) |
Energia | - Previsão de geração eólica/solar - Precificação de energia - Planejamento de expansão |
- Intermitência de fontes renováveis - Modelagem hidrológica - Contratos de longo prazo |
EPE, Operadores do SIN |
Agronegócio | - Cálculo de seguros rurais - Previsão de safras - Gestão de riscos climáticos |
- Exposição a intempéries - Volatilidade de commodities - Modelagem espaço-temporal |
MAPA, Embrapa, Seguradoras |
🎯 Por que esses setores usam?
Resultado: Simulação de Monte Carlo não é uma técnica acadêmica, é ferramenta de trabalho em finanças corporativas.
Cenário Típico: Avaliação de Projeto
Análise Tradicional (Determinística):
Investimento: R$ 75.000 | Receita anual: R$ 15.000 (8 anos) | Taxa: 12%
VPL = R$ 2.600 → Projeto viável ✅
Realidade: Múltiplas Incertezas
Pergunta crítica: Qual a probabilidade real de sucesso?
Limitações da análise determinística:
💡 Solução: Simulação de Monte Carlo quantifica a incerteza/risco.
Distribuição Triangular
A distribuição triangular é amplamente utilizada em simulações de Monte Carlo, especialmente em estudos de viabilidade econômica e financeira, devido às suas características únicas e aplicabilidade prática.
Função Densidade de Probabilidade
\[ f(x) = \begin{cases} \frac{2(x-a)}{(b-a)(c-a)} & \text{para } a \leq x < c, \\ \frac{2(b-x)}{(b-a)(b-c)} & \text{para } c \leq x \leq b, \\ 0 & \text{caso contrário}. \end{cases} \]
\[ E(X) = \frac{a + b + c}{3} \]
\[ V(X) = \frac{a^2 + b^2 + c^2 - ab - ac - bc}{18} \]
Função Densidade de Probabilidade
Condições Adequadas para Uso da Distribuição Triangular
A distribuição triangular é particularmente útil quando os dados são escassos ou quando há uma grande incerteza sobre as estimativas das variáveis. Ela é ideal para modelar variáveis com estimativas baseadas em opiniões de especialistas ou quando se tem apenas uma ideia geral sobre os limites superior e inferior e uma estimativa razoável do valor mais provável.
Em projetos de investimento onde o escopo é conhecido (por exemplo, desenvolvimento de um novo produto, construção civil), mas os parâmetros individuais são incertos, a distribuição triangular ajuda a modelar os riscos associados a esses parâmetros de forma eficaz.
A distribuição triangular é ideal para análises preliminares, onde a rapidez e a facilidade de implementação são importantes, e a precisão absoluta dos resultados da simulação pode não ser crítica.
Quando Usar Cada Distribuição?
Distribuição | Quando Usar | Parâmetros | Exemplo Prático |
---|---|---|---|
Uniforme | Incerteza total; todos os valores igualmente prováveis | min, max | Receitas anuais entre R$ 12-16 mil |
Triangular | Opinião de especialistas; valor mais provável conhecido | min, max, moda | Tempo de projeto: 9-11 anos (mais provável: 10) |
Normal | Fenômenos naturais; erros de medição; agregações | média, desvio | Retornos de ativos; inflação |
Diretrizes Práticas:
Use Uniforme quando:
Use Triangular quando: - Especialistas podem estimar min, max e “mais provável” - Parâmetros de projetos com base em experiência - Dados históricos limitados, mas há conhecimento do setor
Use Normal quando:
⚠️ Cuidado: Nunca use Normal para variáveis que não podem ser negativas (preços, quantidades) sem truncamento adequado.
Fator de Insolvência de Kanitz
Origem: Desenvolvido por Stephen Kanitz (Kanitz, 1978) para empresas brasileiras.
Fórmula:
\[ FI = 0,05A + 1,65B + 3,55C – 1,06D – 0,33E \]
Indicadores:
Interpretação:
Por que simular? Os indicadores financeiros têm incerteza. A simulação quantifica o risco de classificação incorreta.
Simulação em R
# ==================================================
# Fator de Insolvência de Kanitz - Simulação em R
# ==================================================
# Fixa a semente para reprodutibilidade
set.seed(2024)
# Número de simulações
n_simulacoes <- 100000
# ==================================================
# 1. CÁLCULO DETERMINÍSTICO (VALOR PONTUAL)
# ==================================================
# Calcular FI usando os valores modais (determinístico)
fi_deterministico <- 0.05*0.15 + 1.65*1.60 + 3.55*0.90 - 1.06*4.50 - 0.33*5.00
# ==================================================
# 2. SIMULAÇÃO DE MONTE CARLO
# ==================================================
# Simular os indicadores financeiros com parâmetros dentro das funções rtri
A <- rtri(n_simulacoes, 0.12, 0.20, 0.15) # Rentabilidade do PL
B <- rtri(n_simulacoes, 0.80, 2.80, 1.60) # Liquidez Geral
C <- rtri(n_simulacoes, 0.80, 1.00, 0.90) # Liquidez Seca
D <- rtri(n_simulacoes, 4.00, 5.30, 4.50) # Liquidez Corrente
E <- rtri(n_simulacoes, 3.50, 8.00, 5.00) # Grau de Endividamento
# Calcular o Fator de Insolvência para cada simulação
FI <- 0.05*A + 1.65*B + 3.55*C - 1.06*D - 0.33*E
# ==================================================
# 3. RESULTADOS
# ==================================================
# Resultado determinístico
cat("FI Determinístico:", fi_deterministico, "\n")
FI Determinístico: -0.5775
FI Médio (simulação): -0.62959
Probabilidade de Solvência: 22.573 %
Probabilidade de Penumbra: 77.379 %
Probabilidade de Insolvência: 0.048 %
Método Determinístico vs. Simulação de Monte Carlo
Resultados Comparativos:
Métrica | Determinístico | Monte Carlo |
---|---|---|
FI | -0.578 | Mediana: -0.634 |
Incerteza | Valor único | P5: -2.2 | P95: 0.9 |
Classificação | “Penumbra” | Distribuição de Probabilidade do FI |
Distribuição de Risco Simulada:
Nota: P5 e P95 representam os percentis 5% e 95% da distribuição empírica (90% dos cenários ficam neste intervalo)
Vantagens da Simulação de Monte Carlo:
✅ Quantifica incerteza: 22.4% de chance de classificação como solvente vs. valor pontual
✅ Revela amplitude de cenários: 90% dos resultados entre FI = -2.2 e 0.9
Relevância para Análises Complexas:
A simulação torna-se ainda mais útil ao considerar:
💡 Conclusão:
Monte Carlo transforma uma análise determinística em uma avaliação probabilística de risco.
Simulação do VPL
Vamos simular o VPL de um projeto de investimento usando:
\[ \text{VPL} = \sum_{t=1}^{\text{tempo}} \frac{\text{receita}_t}{(1 + \text{taxa})^t} + \frac{\text{valor residual}}{(1 + \text{taxa})^{\text{t}}} - \text{investimento inicial} \]
O código R para simular o VPL de um projeto de investimento é exibido nos próximos slides.
sapply()
— Simulação de ProjetosPor que usamos sapply()
?
Imagine que temos 100 mil projetos diferentes para simular, e cada projeto:
Tem duração própria (ex: 9, 10, ou 11 anos)
Receitas e taxas diferentes a cada simulação
Logo, não é possível vetorizar os cálculos como em um Excel
Precisamos de um jeito elegante e eficiente de aplicar uma função a cada simulação individualmente.
Função sapply()
:
vpl_sim <- sapply(1:n_sim, function(i) {
receitas <- runif(tempo[i], 12000, 16000)
vpl_fluxos <- sum(receitas / (1 + taxa[i])^(1:tempo[i]))
vpl_fluxos + residual[i]/(1 + taxa[i])^tempo[i] - invest_rec[i]
})
Etapa | O que faz | Analogia |
---|---|---|
1:n_sim |
Vetor [1, 2, …, 100000] | “Fila de projetos a serem analisados” |
function(i) {...} |
Função para calcular VPL do projeto i
|
“Receita de como calcular o VPL de um projeto” |
sapply(...) |
Aplica a função a cada i e devolve vetor de resultados |
“Esteira automática de cálculo de VPL” |
Imagine uma linha de montagem com 100.000 kits de projeto.
sapply()
é como uma máquina que pega cada kit, aplica a mesma receita de cálculo, e devolve o resultado final.
for
?
for loop tradicional |
sapply() |
---|---|
Verboso | Mais compacto |
Exige criar vetor vazio | Retorna vetor pronto |
Propenso a erros de índice | Mais seguro |
Resumo: sapply()
é como um “for melhorado” que aplica uma função a cada item de uma sequência, devolvendo um vetor com os resultados.
Cálculo Determinístico com Parâmetros Modais
Parâmetros do Projeto (Valores Mais Prováveis):
Cálculo do VPL Determinístico:
# Parâmetros determinísticos (valores modais)
investimento_det <- 75000
receita_anual_det <- 14000
duracao_det <- 10
taxa_desconto_det <- 0.13
valor_residual_det <- 5000
# Cálculo do VPL usando a fórmula padrão
# VPL = ∑[Receitas/(1+r)^t] + Valor_Residual/(1+r)^n - Investimento_Inicial
# Fluxos de receitas descontados
vpl_receitas_det <- sum(receita_anual_det / (1 + taxa_desconto_det)^(1:duracao_det))
# Valor residual descontado
vpl_residual_det <- valor_residual_det / (1 + taxa_desconto_det)^duracao_det
# VPL final
vpl_deterministico <- vpl_receitas_det + vpl_residual_det - investimento_det
# Resultados com formatação brasileira
cat("VPL das receitas:", format(round(vpl_receitas_det, 0), big.mark = ".", decimal.mark = ","), "reais\n")
VPL das receitas: 75.967 reais
cat("VPL do valor residual:", format(round(vpl_residual_det, 0), big.mark = ".", decimal.mark = ","), "reais\n")
VPL do valor residual: 1.473 reais
cat("VPL total (determinístico):", format(round(vpl_deterministico, 0), big.mark = ".", decimal.mark = ","), "reais\n")
VPL total (determinístico): 2.440 reais
# Decisão baseada no VPL determinístico
if (vpl_deterministico > 0) {
cat("Decisão: Projeto VIÁVEL (VPL > 0)\n")
} else {
cat("Decisão: Projeto INVIÁVEL (VPL ≤ 0)\n")
}
Decisão: Projeto VIÁVEL (VPL > 0)
Limitações da Análise Determinística:
⚠️ Ignora incerteza: Usa apenas valores pontuais, sem considerar variabilidade
⚠️ Decisão binária: Resultado único não quantifica probabilidade de erro
⚠️ Subestima risco: Não mostra amplitude de cenários possíveis
⚠️ Informação limitada: Não informa sobre distribuição de resultados
💡 Próximo Passo:
A Simulação de Monte Carlo captura toda essa incerteza, fornecendo uma avaliação probabilística completa do risco do projeto.
Simulação de VPL - Código Comentado Detalhadamente
# Configuração inicial para reprodutibilidade
set.seed(567)
n_sim <- 100000 # 100 mil simulações
# PASSO 1: Simula as variáveis/inputs do VPL
invest_rec <- runif(n_sim, 65000, 85000) # Investimento inicial (uniforme)
residual <- rtri(n_sim, 4000, 6000, 5000) # Valor residual (triangular)
tempo <- round(rtri(n_sim, 9, 11, 10)) # Duração em anos (triangular)
taxa <- rtri(n_sim, 0.10, 0.15, 0.13) # Taxa de desconto (triangular)
# PASSO 2: simula as receitas e calcula VPL
vpl_sim <- sapply(seq_len(n_sim), function(i) {
# Gera receitas aleatórias para o projeto i
receitas <- runif(tempo[i], 12000, 16000)
# Calcula VPL dos fluxos de receitas descontados
vpl_fluxos <- sum(receitas / (1 + taxa[i])^(1:tempo[i]))
# VPL total = fluxos + valor residual - investimento inicial
vpl_total <- vpl_fluxos + residual[i]/(1 + taxa[i])^tempo[i] - invest_rec[i]
return(vpl_total) # retorna VPL do projeto i
})
# VPL simulado mediano
vpl_mediano <- median(vpl_sim) # Mediana dos VPLs simulados
vpl_mediano
[1] 3524.3
# Estimativa da Probabilidade de Viabilidade
prob_viavel <- mean(vpl_sim > 0) * 100 # % de projetos com VPL > 0
prob_viavel
[1] 66.995
# Estimativa da Probabilidade de Inviabilidade
prob_inviavel <- mean(vpl_sim <= 0) * 100 # % de projetos com VPL ≤ 0
prob_inviavel
[1] 33.005
Por que esse código é assim?
Linha 5-9: Cada projeto tem características fixas (duração, taxa, etc.)
Linha 12: sapply()
processa cada projeto individualmente
Linha 15: Receitas são diferentes para cada projeto (tamanho varia com tempo[i]
)
Linha 18: Fórmula padrão do VPL aplicada ao projeto i
Resultado: Vetor vpl_sim
com 100.000 VPLs simulados prontos para análise!
Análose Determinística vs. Simulação de MC
Resultados Comparativos:
Métrica | Determinístico | Monte Carlo |
---|---|---|
VPL | R$ 2.440 | Mediana: R$ 3.524 |
Incerteza | Valor único | P5: R$ -8.226 | P95: R$ 15.401 |
Decisão | Viável (binária) | Distribuição probabilística |
Distribuição de Risco Simulada:
P(Viável, VPL > 0): 67% → Probabilidade de sucesso do projeto
P(Inviável, VPL ≤ 0): 33% → Risco de prejuízo financeiro
Nota: P5 e P95 representam os percentis 5% e 95% da distribuição empírica (90% dos cenários ficam neste intervalo)
Vantagens da Simulação de Monte Carlo:
✅ Quantifica risco de insucesso: 33% de chance de VPL negativo vs. decisão binária
✅ Revela amplitude de cenários: 90% dos resultados entre R$ -8.226 e R$ 15.401
✅ Informa decisões: Quantifica a incerteza / risco do projeto
Relevância para Análises Complexas:
A simulação torna-se ainda mais valiosa ao considerar:
💡 Conclusão:
Monte Carlo transforma uma análise determinística em uma avaliação probabilística de viabilidade
Contexto
Importância Econômica:
Agronegócio representa parcela significativa do PIB brasileiro
Soja: uma das principais commodities de exportação
Produção com características sazonais: descasamento temporal entre custos e receitas
Características do Ciclo Financeiro:
Principais Incertezas:
Problema Gerencial:
Qual o capital de giro necessário para atravessar o ciclo produtivo sem comprometer a operação?
Relevância da Simulação:
Nota: Os parâmetros utilizados neste exemplo são ilustrativos para fins didáticos apenas.
Estrutura do Exemplo
Fazenda Hipotética:
Cronograma de Desembolsos (% do custo total - exemplo típico):
Mês | Jan | Fev | Mar | Abr | Mai | Jun | Jul | Ago | Set | Out |
---|---|---|---|---|---|---|---|---|---|---|
% Custo | 10% | 25% | 20% | 10% | 5% | 5% | 5% | 5% | 5% | 10% |
Nota: Os 10% em outubro representam custos de colheita, transporte e comercialização.
Receitas:
Parâmetros Incertos (para fins didáticos):
Variável | Mínimo | Moda | Máximo | Unidade |
---|---|---|---|---|
Produtividade | 45 | 60 | 75 | sacas/ha |
Preço spot | 70 | 85 | 100 | R$/saca |
Custo/hectare | 3.500 | 4.000 | 4.500 | R$/ha |
Correlação Assumida:
Objetivo da Simulação:
Estimar a distribuição do Déficit Máximo (Necessidade de Capital de Giro)
\[ \text{Déficit máximo} = -\min_t\bigl(\mathrm{SA}_t\bigr) \]
➜ Simulação de Monte Carlo (MC)
• 20 000 cenários de produtividade, preço (correlação –0,30) e custo
• Resultado: curva de probabilidade da necessidade de caixa ao longo do ciclo
Metodologia:
⚠️ Importante: Todos os parâmetros são ilustrativos. Em aplicações reais, devem ser calibrados com dados históricos específicos da região e cultura.
Entendendo o “Déficit Máximo” e sua Importância
O que é o Fluxo de Caixa Acumulado?
Por que o Déficit Máximo é Importante?
✅ Déficit máximo = MAIOR necessidade de caixa durante o ciclo
✅ Representa quanto de capital de giro a fazenda precisa ter disponível
✅ Exemplo prático: Se déficit máximo = R$ 2 milhões, a fazenda precisa de R$ 2 milhões de capital de giro
Interpretação Gerencial:
Déficit Máximo | Significado | Ação Necessária |
---|---|---|
R$ 500 mil | Necessidade máxima de R$ 500 mil | Linha de crédito de R$ 500 mil |
R$ 2 milhões | Necessidade máxima de R$ 2 milhões | Capital de giro de R$ 2 milhões |
R$ 0 | Sempre positivo | Não precisa de financiamento |
💡 Insight Principal:
O déficit máximo identifica o pior momento financeiro do ciclo produtivo - exatamente quando mais precisamos de capital de giro!
Por que Simulamos?
Esse valor varia conforme produtividade, preços e custos. A simulação mostra toda a distribuição de necessidades possíveis, não apenas um valor pontual.
Definição
Chamamos de Necessidade de Capital de Giro (NCG) o montante máximo de recursos financeiros que a empresa precisa ter disponível para atravessar todo o ciclo produtivo sem interromper suas operações.
Seja
\[ \text{SA}_t = \sum_{k=1}^{t} (\text{Receitas}_k - \text{Custos}_k) \]
o Saldo de Caixa Acumulado até o mês \(t\), obtido somando‐se todos os fluxos líquidos mensais desde o início do ciclo.
A NCG é então definida por
\[ \begin{aligned} \text{NCG} &= -\min_{t}\bigl(\text{SA}_t\bigr) \\[6pt] &= \text{Déficit máximo} \end{aligned} \]
isto é, o valor absoluto do menor (mais negativo) saldo acumulado ao longo de todo o período analisado. \(\text{NCG} = \text{Déficit máximo}\)
Quando \(\text{SA}_t\) atinge seu ponto mais baixo, temos o déficit máximo.
Financiar exatamente esse déficit garante que a empresa consiga pagar todas as contas até que as receitas da colheita (ou das vendas) entrem no caixa.
Intuição: pense no saldo acumulado como o nível de água de uma caixa d’água — ele desce conforme você paga insumos e sobe quando recebe pelas vendas. A NCG é a profundidade máxima. Disponibilizar esse volume de recursos (via reservas ou linha de crédito) evita que o nível fique “abaixo de zero” e a operação “seque”.
lapply()
+ do.call()
Por que usaR lapply()
+ do.call(rbind, ...)
?
Precisamos simular 20 mil safras e obter um data frame único com os resultados
Cada simulação (simula_safra()
) retorna um data frame de 1 linha com:
Déficit máximo
Lucro final
Produtividade
Preço final
Passo 1: Usamos lapply()
para repetir a função
Função | O que faz | Analogia |
---|---|---|
1:n_sim |
Vetor de números 1 a 20000 | Lista de IDs das safras |
function(x) simula_safra() |
Aplica a simulação a cada ID | Receita para simular uma safra |
lapply(...) |
Executa para cada safra e guarda numa lista | Caixa com 20.000 recibos (um por safra) |
do.call(rbind, ...)
para juntar tudo
Função | O que faz | Analogia |
---|---|---|
do.call() |
Executa uma função (rbind ) em todos os elementos da lista
|
Um robô que empilha os 20.000 recibos numa planilha única |
rbind(df1, df2, ..., df20000) |
Junta todos os data frames | Linhas de uma planilha final |
Você tem 20.000 envelopes (cada um com um relatório de safra).
lapply()
preenche os envelopes.do.call(rbind, ...)
abre todos e cola numa única planilha com os 20.000 resultados.
Por que não usar sapply()
?
sapply()
tenta devolver vetores — bom para números
Aqui cada item é um data frame → melhor usar lapply()
, que devolve lista
Por que não usar for
?
for
exige criar um data frame vazio e juntar resultados um a um (ineficiente e suscetível a erros)
Resumo: lapply()
+ do.call(rbind, ...)
é a forma mais elegante de simular milhares de cenários complexos e consolidar os resultados.
Implementação da Simulação
# Parâmetros da fazenda hipotética
set.seed(123)
area_ha <- 2000
n_sim <- 20000
# Cronograma de desembolsos (% do custo total por mês)
cronograma_custos <- c(0.10, 0.25, 0.20, 0.10, 0.05, 0.05, 0.05, 0.05, 0.05, 0.10)
# Parâmetros de comercialização
venda_antecipada <- 0.30 # 30% vendido antecipadamente
desconto_forward <- 0.95 # preço forward = 95% do spot
# Função para simular um cenário
simula_safra <- function() {
# Simula parâmetros incertos (distribuições triangulares)
produtividade <- rtri(1, 45, 75, 60) # sacas/ha
custo_ha <- rtri(1, 3500, 4500, 4000) # R$/ha
# Gerar preço base
preco_base <- rtri(1, 70, 100, 85) # R$/saca
# Aplicar correlação negativa de -0.30 entre produtividade e preço
# Normalizar produtividade em torno da média
prod_media <- 60
prod_desvio <- 15 # (75-45)/2
prod_padronizada <- (produtividade - prod_media) / prod_desvio
# Ajustar preço baseado na correlação
preco_desvio <- 15 # (100-70)/2
ajuste_correlacao <- -0.30 * prod_padronizada * preco_desvio
preco_spot <- preco_base + ajuste_correlacao
# Garantir que o preço permaneça dentro dos limites
preco_spot <- pmax(70, pmin(100, preco_spot))
# Calcula fluxos mensais
custos_mensais <- cronograma_custos * custo_ha * area_ha
# Receitas (concentradas em janeiro e outubro)
receitas <- rep(0, 10)
receitas[1] <- venda_antecipada * produtividade * area_ha * preco_spot * desconto_forward
receitas[10] <- (1 - venda_antecipada) * produtividade * area_ha * preco_spot
# Fluxo de caixa acumulado
fluxo_liquido <- receitas - custos_mensais
saldo_acumulado <- cumsum(fluxo_liquido)
# Retorna métricas de interesse
data.frame(
deficit_maximo = -min(saldo_acumulado), # maior déficit no período (sempre positivo)
lucro_final = saldo_acumulado[10], # resultado final
produtividade = produtividade,
preco_final = preco_spot
)
}
# Executa simulação Monte Carlo
resultados <- do.call(rbind, lapply(1:n_sim, function(x) simula_safra()))
# Verificar correlação obtida
correlacao_simulada <- cor(resultados$produtividade, resultados$preco_final)
cat("Correlação obtida:", round(correlacao_simulada, 3), "(alvo: -0.30)\n")
Correlação obtida: -0.279 (alvo: -0.30)
# Exibe resumo básico como data frame
resumo_basico <- data.frame(
Métrica = c("Déficit máximo médio", "Maior déficit simulado", "Lucro médio esperado"),
Valor_Mil_Reais = c(
round(mean(resultados$deficit_maximo) / 1000),
round(max(resultados$deficit_maximo) / 1000),
round(mean(resultados$lucro_final) / 1000)
)
)
print(resumo_basico)
Métrica Valor_Mil_Reais
1 Déficit máximo médio 4301
2 Maior déficit simulado 6070
3 Lucro médio esperado 2017
Solução Aproximada
Atenção: O método usado para introduzir correlação entre produtividade e preço é uma aproximação simplificada adequada para fins didáticos.
Por que usamos esta aproximação?
Em aplicações profissionais, usaríamos métodos mais rigorosos como:
Verificação: Nossa aproximação gerou correlação de -0.297 (alvo: -0.30), o que é adequado para este exemplo didático.
💡 Lembre-se: Em ciência de dados/estatística, frequentemente começamos com soluções simples e evoluímos para métodos mais sofisticados conforme necessário.
Análise dos Resultados
# A variável deficit_maximo já está em valores positivos (em reais)
# Converte para milhões para facilitar a leitura
necessidade_capital <- resultados$deficit_maximo / 1000000 # em milhões
# ========================================
# VALIDAÇÃO DO MODELO
# ========================================
correlacao_simulada <- cor(resultados$produtividade, resultados$preco_final)
cat("Correlação obtida entre produtividade e preço:",
round(correlacao_simulada, 3), "\n")
Correlação obtida entre produtividade e preço: -0.279
# ========================================
# ESTATÍSTICAS DESCRITIVAS
# ========================================
estatisticas_basicas <- data.frame(
Métrica = c("Necessidade média", "Necessidade máxima", "Desvio-padrão"),
Valor_Milhoes_R = c(
round(mean(necessidade_capital), 1),
round(max(necessidade_capital), 1),
round(sd(necessidade_capital), 1)
)
)
# Exibe as estatísticas básicas
estatisticas_basicas
Métrica Valor_Milhoes_R
1 Necessidade média 4.3
2 Necessidade máxima 6.1
3 Desvio-padrão 0.5
# ========================================
# PERCENTIS PARA PLANEJAMENTO
# ========================================
percentis <- quantile(necessidade_capital, probs = c(0.50, 0.75, 0.90, 0.95))
tabela_percentis <- data.frame(
Percentil = c("50%", "75%", "90%", "95%"),
Cenarios_Cobertos = c("50% dos cenários", "75% dos cenários",
"90% dos cenários", "95% dos cenários"),
Necessidade_Milhoes_R = round(percentis, 1)
)
# Exibe a tabela de percentis
tabela_percentis
Percentil Cenarios_Cobertos Necessidade_Milhoes_R
50% 50% 50% dos cenários 4.3
75% 75% 75% dos cenários 4.6
90% 90% 90% dos cenários 4.9
95% 95% 95% dos cenários 5.1
# ========================================
# PROBABILIDADES
# ========================================
probabilidades_risco <- data.frame(
Limite_Milhoes_R = c(1, 2, 3),
Probabilidade_Exceder_Pct = c(
round(mean(necessidade_capital > 1) * 100, 1),
round(mean(necessidade_capital > 2) * 100, 1),
round(mean(necessidade_capital > 3) * 100, 1)
)
)
# Exibe as probabilidades de exceder limites
probabilidades_risco
Limite_Milhoes_R Probabilidade_Exceder_Pct
1 1 100.0
2 2 100.0
3 3 99.7
Visualização da Distribuição:
💡 Interpretação para Administradores:
Planejamento Conservador: Use o percentil 95% para garantir cobertura na maioria dos cenários
Gestão de Risco: Monitore as probabilidades de necessidades extremas (> R$ 2-3 milhões)
Estratégias Financeiras: Combine linha de crédito + reservas para otimizar custo de capital
Aplicações Práticas dos Resultados
Cenario Descrição Necessidade_Milhoes_R
1 Cenário Base Necessidade média 4.3
2 Cenário Conservador Percentil 95% 5.1
3 Cenário Stress Pior caso simulado 6.1
Uso_Recomendado
1 Orçamento inicial
2 Linha de crédito
3 Reserva de contingência
Vantagem da Simulação sobre Análise Determinística:
Monte Carlo revela a distribuição completa de necessidades de capital, permitindo:
Possíveis Refinamentos do Modelo
🌱 Aprimoramentos Realísticos:
Risco Climático:
Dinâmica de Preços:
Aspectos Financeiros:
📊 Análises Complementares:
Análise de Sensibilidade:
Otimização de Estratégias:
Validação do Modelo:
🎯 Valor para a Tomada de Decisão:
Resultado: Transforma a gestão financeira agrícola de decisões intuitivas para escolhas baseadas em análise quantitativa de risco.
Precisão da Estimativa
\[ \text{EP} \approx \frac{\sigma}{\sqrt{n}}. \]
\[ SE(p) = \sqrt{\frac{p(1-p)}{n}}. \]
Exemplo Prático:
Se \(P(VPL > 0) = 0.75\) com \(n = 10.000\) simulações:
p_estimado <- 0.75
n_simulacoes <- 10000
erro_padrao <- sqrt(p_estimado * (1 - p_estimado) / n_simulacoes)
erro_padrao # ≈ 0.0043
[1] 0.0043301
Interpretação: A probabilidade verdadeira está entre 74.1% e 75.9% com 95% de confiança.
Regras Práticas:
Duplicar \(n\) reduz o erro em \(\approx 1/\sqrt{2} \approx 0.71\) (melhora de 29%)
Quadruplicar \(n\) reduz o erro pela metade
Para erro < 1% em probabilidades: use \(n \geq 10.000\)
Para erro < 0.1% em probabilidades: use \(n \geq 1.000.000\)
Importância: Garanta \(n\) suficientemente grande para decisões confiáveis, especialmente em contextos financeiros críticos.
Quando Monte Carlo Pode Falhar
⚠️ Principais Limitações:
1. Garbage In, Garbage Out
2. Correlações Ignoradas
3. Excesso de Confiança
4. Complexidade Desnecessária
🎯 Boas Práticas:
✅ Valide as distribuições escolhidas com dados ou especialistas
✅ Teste a sensibilidade dos resultados aos parâmetros
✅ Compare com métodos mais simples quando possível
✅ Documente todas as suposições claramente
✅ Comunique a incerteza inerente às estimativas
Lembre-se: Monte Carlo é uma ferramenta poderosa, mas não substitui o julgamento crítico sobre as suposições do modelo.
Relevância para o Mestrado
Na pesquisa
Na carreira
🚀 Competências-chave
Resultado: capacidade de apoiar decisões estratégicas sob incerteza – habilidade altamente valorizada no mercado.
Simulação do Índice de Liquidez Rápida
O Índice de Liquidez Rápida (ILR) mede a capacidade de uma empresa pagar suas obrigações de curto prazo sem depender da venda de estoques:
\[ \text{ILR} = \frac{\text{Ativo Circulante} - \text{Estoques}}{\text{Passivo Circulante}} \]
Cenário: Você é analista financeiro de uma empresa do setor de varejo e precisa avaliar o risco de liquidez sob incerteza.
Informações dos especialistas (baseadas em dados setoriais):
Suas tarefas:
Simule 20.000 cenários do ILR usando Monte Carlo com distribuições triangulares
Calcule \(P(\text{ILR} < 1)\) e interprete o resultado
Compare o ILR médio simulado com o modelo determinístico (valores mais prováveis)
Recomende ações se a probabilidade de ILR < 1 for maior que 40%
Código estrutura (complete o código):
# fixa a semente para reprodutibilidade
set.seed(2024)
# Define o número de simulações
n_sim <- 20000
# Complete os parâmetros (min, max, moda)
ativo_circ <- rtri(n_sim, ___, ___, ___)
estoques <- rtri(n_sim, ___, ___, ___)
passivo_circ <- rtri(n_sim, ___, ___, ___)
# Calcule o ILR
ilr_sim <- (ativo_circ - estoques) / passivo_circ
# Complete as análises
prob_ilr_baixo <- mean(ilr_sim < 1) * 100
ilr_medio <- mean(ilr_sim)
# Modelo determinístico para comparação
ilr_deterministico <- (950 - 280) / 720
# Exiba os resultados
cat("Probabilidade ILR < 1:", round(prob_ilr_baixo, 1), "%\n")
cat("ILR médio simulado:", round(ilr_medio, 2), "\n")
cat("ILR determinístico:", round(ilr_deterministico, 2), "\n")
Perguntas:
Soluções
Código R completo:
# define os parâmetros necessários
set.seed(2024)
n_sim <- 20000
# Parâmetros das distribuições triangulares (min, max, moda) - em milhares de R$
ativo_circ <- rtri(n_sim, 800, 1200, 950) # Ativo Circulante
estoques <- rtri(n_sim, 200, 400, 280) # Estoques
passivo_circ <- rtri(n_sim, 600, 900, 720) # Passivo Circulante
# Cálculo do ILR para cada cenário
ilr_sim <- (ativo_circ - estoques) / passivo_circ
# Probabilidade de ILR < 1 (em %)
prob_risco <- mean(ilr_sim < 1) * 100
# ILR médio simulado
ilr_medio <- mean(ilr_sim)
# Desvio-padrão (opcional)
ilr_desvio <- sd(ilr_sim)
# Modelo determinístico (valores mais prováveis)
ilr_det <- (950 - 280) / 720 # Resultado: 0.930
# Exibição dos resultados
cat("=== RESULTADOS DA SIMULAÇÃO ===\n")
=== RESULTADOS DA SIMULAÇÃO ===
Probabilidade de ILR < 1: 67.4 %
ILR médio simulado: 0.938
ILR determinístico: 0.931
Desvio-padrão do ILR: 0.149
# Visualização opcional
hist(ilr_sim, breaks = 50, col = "lightblue",
main = "Distribuição do ILR Simulado",
xlab = "Índice de Liquidez Rápida", ylab = "Frequência")
abline(v = 1, col = "red", lwd = 2, lty = 2) # Linha crítica
abline(v = ilr_medio, col = "steelblue", lwd = 2) # Média
legend("topright", c("ILR = 1.0", "Média"), col = c("red", "blue"), lwd = 2)
Resposta: A probabilidade é de aproximadamente 49%.
Interpretação: Em cerca de metade dos cenários simulados, a empresa pode ter dificuldades para cobrir suas obrigações de curto prazo sem vender estoques. Isso indica um risco moderado de liquidez que requer monitoramento, mas não caracteriza uma situação de crise.
Resposta: Pela Lei dos Grandes Números, a média de muitas simulações (20.000) converge para o valor esperado teórico. Por isso, o ILR médio simulado (0.939) fica muito próximo do cálculo determinístico (0.930).
Diferença fundamental: A simulação revela a variabilidade do ILR (desvio-padrão = 0.134), enquanto o cálculo determinístico mostra apenas um ponto. A simulação quantifica a incerteza.
Resposta: Como a probabilidade (49%) é maior que 40%, recomendo:
Monitoramento:
Gestão de Capital de Giro:
Flexibilidade Financeira:
Conclusão: Essas são medidas preventivas, não de emergência. Para empresas de varejo, ILR próximo a 1.0 é comum, pois os estoques fazem parte do modelo de negócio.
Monte Carlo quantifica incerteza que análises determinísticas não capturam
Distribuições triangulares são úteis quando há estimativas de min/max/moda
Interpretação contextual é essencial - mesmos números podem ter significados diferentes por setor
Simulação informa decisões de gestão com base probabilística, não apenas cenários pontuais
tidyquant
Descrição
Com utilizaremos dados reais de séries de preços de ações do para ilustrar o VaR e ES (CVaR), precisamos entender como importar essas séries de preços de ações usando o tidyquant
.
O pacote tidyquant
integra os melhores pacotes da linguagem R para coletar, manipular e analisar dados financeiros com o tidyverse
.
Como o tidyquant é possível realizar análises financeiras completas usando a sintaxe do tidyverse
.
A função tq_get()
do pacote tidyquant
é uma muito útil para coletar dados financeiros de diversas fontes, como Yahoo Finance, FRED, entre outras.
tq_get()
Função tq_get()
tq_get()
é:Onde:
x
: é um vetor de tickers das ações ou o nome do índice que você deseja obter os dados.
from
: é a data de início para a coleta dos dados (formato “YYYY-MM-DD”).
to
: é a data de término para a coleta dos dados (formato “YYYY-MM-DD”).
A função retorna um data frame com as colunas:
symbol
: é o ticker da ação ou do índice.date
: é a data da observação.open
: é o preço de abertura da ação no dia.high
: é o preço mais alto da ação no dia.low
: é o preço mais baixo da ação no dia.close
: é o preço de fechamento da ação no dia.volume
: é o volume de ações negociadas no dia.tq_get()
Importação de Séries de Preços Diários de 2 Ações
# salva as séries importadas no objeto serie_bivariada
serie_bivariada <- c("AAPL", "META") %>%
# obtem os dados de fechamento das ações a partir de 01/01/2024
tq_get(from = "2024-01-01") %>%
# seleciona as colunas relevantes
select(symbol, date, close) %>%
# renomeia as colunas para facilitar a leitura
rename(
compania = symbol,
dia = date,
preco_fechamento = close
)
# Exibe as 6 primeiras linhas da data frame
head(serie_bivariada)
# A tibble: 6 × 3
compania dia preco_fechamento
<chr> <date> <dbl>
1 AAPL 2024-01-02 186.
2 AAPL 2024-01-03 184.
3 AAPL 2024-01-04 182.
4 AAPL 2024-01-05 181.
5 AAPL 2024-01-08 186.
6 AAPL 2024-01-09 185.
# A tibble: 6 × 3
compania dia preco_fechamento
<chr> <date> <dbl>
1 META 2025-06-17 697.
2 META 2025-06-18 696.
3 META 2025-06-20 682.
4 META 2025-06-23 699.
5 META 2025-06-24 712.
6 META 2025-06-25 709.
Função pivot_wider() do tidyr - Exercício 3
A função pivot_wider()
transforma dados do formato longo para o formato largo (wide),.
Por que precisamos transformar?
Para estimar a correlação entre as séries de preços de duas ações, precisamos que cada série de preços seja uma coluna separada, com as datas alinhadas, entretanto, a função tq_get() retorna os dados no formato longo, onde cada linha representa um preço de uma ação em uma data específica, ou seja, as séries de preços estão empilhadas verticalmente.
Formato Longo (estrutura retornada pela função tq_get()
):
dados_longo <-
tibble(
empresa = c("PETR4.SA", "PETR4.SA", "ITUB4.SA", "ITUB4.SA"),
data = as.Date(c("2024-01-02", "2024-01-03", "2024-01-02", "2024-01-03")),
preco = c(35.50, 36.20, 28.30, 28.75)
)
dados_longo
# A tibble: 4 × 3
empresa data preco
<chr> <date> <dbl>
1 PETR4.SA 2024-01-02 35.5
2 PETR4.SA 2024-01-03 36.2
3 ITUB4.SA 2024-01-02 28.3
4 ITUB4.SA 2024-01-03 28.8
Formato Largo:
dados_wide <-
tibble(
data = as.Date(c("2024-01-02", "2024-01-03")),
PETR4.SA = c(35.50, 36.20),
ITUB4.SA = c(28.30, 28.75)
)
dados_wide
# A tibble: 2 × 3
data PETR4.SA ITUB4.SA
<date> <dbl> <dbl>
1 2024-01-02 35.5 28.3
2 2024-01-03 36.2 28.8
Sintaxe:
tq_get()
Importação de 3 Séries de Preços Diários de Ações
serie_precos <- c("PETR4.SA", "MGLU3.SA", "ITUB4.SA") %>%
# importa as séries de preços as ações: PETR4, MGLU3 e ITUB4
tq_get(from = "2024-01-01") %>%
# seleciona as variáveis relevantes
select(symbol, date, close) %>%
# converte o formato longo para o formato largo
pivot_wider(names_from = symbol, values_from = close) %>%
# renomeia as variáveis
rename(dia = date,
petr4 = PETR4.SA,
mglu3 = MGLU3.SA,
itub4 = ITUB4.SA)
# exibe as primeiras linhas
head(serie_precos)
# A tibble: 6 × 4
dia petr4 mglu3 itub4
<date> <dbl> <dbl> <dbl>
1 2024-01-02 37.8 19.2 30.5
2 2024-01-03 39.0 18.7 30.1
3 2024-01-04 38.6 18.1 29.9
4 2024-01-05 38.7 18.4 30.6
5 2024-01-08 38.4 19.5 30.3
6 2024-01-09 38.1 20.0 30.3
Vantagens
Propriedades estatísticas mais convenientes:
Tipos de retornos:
Retorno simples: \(R_t = \frac{P_t - P_{t-1}}{P_{t-1}}\) (interpretação: percentual de ganho)
Retorno logarítmico: \(r_t = \ln\left(\frac{P_t}{P_{t-1}}\right)\) (vantagem matemática: aditividade)
Aplicação prática: Análise de carteiras de investimento e avaliação de desempenho.
Origem do VaR
VaR (Value-at-Risk) foi introduzido pelo banco JP Morgan em 1994, com a metodologia RiskMetrics.
Objetivo: sintetizar o risco de uma carteira em um único número.
Motivado pela necessidade de apresentar diariamente, às 16:15, uma medida consolidada de risco.
Tornou-se uma ferramenta essencial na gestão de riscos e exigência regulatória.
Linha do Tempo
Basileia I (1988): foco em risco de crédito, exigência de capital mínimo = 8% dos ativos ponderados pelo risco (RWA).
Emenda de 1996: introduz uso do VaR para risco de mercado.
Basileia II (2004): três pilares; VaR incluído no Pilar 1 (exigências de capital).
-Basileia III (2010-2017): amplia exigências, inclui LCR, NSFR, alavancagem, output floor.
Glossário
Sigla | Significado |
---|---|
CET1 | Common Equity Tier 1 (capital de alta qualidade) |
LCR | Liquidity Coverage Ratio |
NSFR | Net Stable Funding Ratio |
RWA | Ativos Ponderados pelo Risco |
FRTB | Nova abordagem para risco de mercado |
Output Floor | Capital mínimo ≥ 72,5% do padrão |
Nota
“Qual é a pior perda esperada, com uma pequena probabilidade de ser excedida (\(p\))?”
O VaR depende de:
Por exemplo, com \(p = 0,01\), o VaR indica a perda que será excedida em 1% dos dias, em média.
Definição Formal
Seja \(L/P\) a variável aleatória de perdas e ganhos de uma carteira.
O Valor-em-Risco com nível de probabilidade \(p\) é o quantil de ordem \(1 - p\) da distribuição de \(L/P\):
\[ VaR_{(p)} = \inf \left\{ q \in R \mid P(L \leq q) \geq 1 - p \right\} \] > O VaR com probabilidade \(p\) é o menor valor \(q\) tal que a probabilidade de a perda ser menor ou igual a \(q\) é pelo menos \(1 - p\).
\[ P(L > VaR_{(p)}) = p \]
Interpretação
Há 1% de probabilidade da perda ser maior que o VaR, em um único dia.
Exemplo:
O restante do tempo (99% dos dias), estima-se que a perda será menor ou igual a R$ 45.
VaR como um Quantil
O VaR é o quantil de ordem \(1 - p\) da distribuição de L/P (retornos).
Ele separa os \(100 \cdot p\%\) piores dos demais.
\[ P(L \leq VaR_{(p)}) = 1 - p \quad \Rightarrow \quad P(L > VaR_{(p)}) = p \]
Nota
Seja \(P_t\) o preço atual da ação, \(P_{t-1}\) o preço anterior.
O retorno simples é:
\[ R = \frac{P_t - P_{t-1}}{P_{t-1}} \]
\[ Q = \vartheta \cdot R \]
\[ P(Q \leq -VaR_{(p)}) = p \]
Ou seja, há probabilidade \(p\) de que a perda supere \(VaR_{(p)}\).
Métodos Básicos
Métodos Paramétricos
Um método paramétrico assume que os retornos seguem uma distribuição de probabilidade específica (por exemplo, a distribuição normal).
Nesse caso, é necessário estimar os parâmetros da distribuição de normal, que no caso da normal são a média (\(\mu\)) e o desvio-padrão (\(\sigma\)).
Daí o termo “método paramétrico”: os parâmetros da distribuição devem ser estimados a partir dos dados observados.
Método Histórico
O método histórico é um método não-paramétrico, pois utiliza diretamente os retornos históricos observados, sem assumir qualquer distribuição de probabilidade para os retornos.
Como consequência, não há parâmetros a serem estimados, daí o termo “método não-paramétrico”.
Método por Simulação de Monte Carlo
O método de simulação de Monte Carlo pode ser:
Paramétrico: se os retornos são simulados a partir de uma distribuição teórica (por exemplo, normal ou t-Student);
Não-paramétrico: se os retornos são simulados por reamostragem com reposição dos retornos históricos (distribuição empírica).
A escolha do método depende da qualidade dos dados, das hipóteses que se está disposto a fazer e do objetivo da análise de risco.
Suposição de Normalidade
\[ R \sim N(\mu, \sigma^2) \]
\[ L = -R \cdot \vartheta \]
onde \(\vartheta\) é o valor da carteira.
Cálculo do \(VaR_{(p)}\) com nível de significância \(p\)
Por definição, o \(VaR_{(p)}\) satisfaz:
\[ P(L > VaR_{(p)}) = p \]
\[ P\left(-R \cdot \vartheta > VaR_{(p)}\right) = p \quad \Rightarrow \quad P\left(R < -\frac{VaR_{(p)}}{\vartheta}\right) = p \]
A probabilidade de a perda monetária exceder \(VaR_{(p)}\) é a mesma que a probabilidade de o retorno cair abaixo de \(-VaR_{(p)} / \vartheta\).
Como \(R \sim N(\mu, \sigma^2)\), temos:
\[ VaR_{(p)} = - (\mu + \Phi^{-1}(1 - p) \cdot \sigma) \cdot \vartheta \]
Exemplo 1:
\[ VaR = - (0 + 2.326 \cdot 0.02) \cdot 100000 = -R\$ 4.652,00 \]
Interpretação: há 1% de chance da perda exceder R$ 4.652 em um dia.
Exemplo 2:
Se foram investidos R$ 100.000,00 em ações da XYZ SA, cuja volatilidade diária (\(\sigma\) = desvio-padão) é de 2% e o retorno médio de 0%. Assumindo que os retornos da ação possam ser modelados por uma distribuição normal. então, o VaR no nível de 5% é:
\[ \begin{align*} VaR(p) &= \Phi^{-1}(1 - p) \cdot \sigma \cdot \vartheta \\ &= \sigma Z_{0.95} \vartheta \\ &= 0.02 (1.6449)(100.000) \\ &= 3289.7 \end{align*} \]
Em R:
[1] 3289.7
Isto é, o \(VaR_{1, 0.95}\) de 1-dia = R$ 3.289,71 implica que temos 95% de confiança de que a perda da carteira não será superior a R$ 3.289,80 em um dia, ou que temos 5% de chance de que a perda será superior a R$ 3.289,80.
Estimativa do VaR Paramétrico Normal - 1 Ação
# pipeline para importar os preços da ação da Petrobras
# calcular os retornos e remover valores ausentes
serie_precos_petr4 <- tq_get("PETR4.SA", from = "2024-01-01") %>%
mutate(ret = log(close / lag(close))) %>%
drop_na()
# Define parâmetros
retornos <- serie_precos_petr4$ret
valor_carteira <- 1000
p <- 0.01
# calcula o retorno médio
ret_medio <- mean(retornos)
ret_medio
[1] -0.00051773
[1] 0.016873
[1] -0.038734
[1] -3.8734
[1] -38.734
Leitura do Gráfico e Considerações
A curva azul representa o modelo paramétrico assumido, que, nesse caso, é a distribuição normal.
A curva preta tracejada mostra a distribuição empírica dos retornos observados da ação PETR4.
O VaR é uma medida de perda potencial: representa o menor retorno (negativo) que será superado com uma pequena probabilidade, como 1%.
No gráfico, essa perda está localizada à esquerda da média da distribuição normal.
A área vermelha sob a curva normal corresponde à cauda esquerda com probabilidade \(p = 1\%\), ou seja, há 1% de chance de obter um retorno ainda pior que o VaR.
A linha vermelha tracejada marca o ponto de corte: o valor do retorno associado ao quantil de 1%, segundo a distribuição normal.
Em geral, distribuições empíricas de retornos financeiros apresentam caudas mais pesadas (leptocurtose) e assimetria.
Por isso, a suposição de normalidade pode subestimar o risco de perdas extremas, tornando o VaR paramétrico normal menos conservador que métodos baseados na distribuição empírica.
Método Histórico (ou Simulação Histórica)
O método histórico é uma técnica simples de estimação do risco de perda.
Baseia-se na hipótese de que o comportamento dos retornos passados se repetirá no futuro próximo.
O método consiste em ordenar os retornos históricos do pior para o melhor, e identificar o retorno correspondente ao percentil escolhido (por exemplo, 1%).
O VaR com probabilidade \(p\) é o retorno na posição \(T \times p\) da distribuição empírica, multiplicado pelo valor da carteira:
\[ VaR_t = - y_{(i)} \cdot \vartheta_t, \quad \text{com } i = \lceil T \cdot p \rceil \]
\[ \vartheta_t = \text{número de ações} \times P_t \]
Simulação Histórica - Algoritmo
Escolha uma probabilidade \(p\) (por exemplo, 1%).
Obtenha uma amostra de retornos históricos \(y\) com tamanho \(T\).
Ordene os retornos \(y\) do menor para o maior.
Encontre o índice \(i = T \times p\) (arredondado para cima).
O VaR é dado por:
\[ VaR_t = - y_{(i)} \cdot \vartheta_t, \quad \text{onde } i = \lceil T \cdot p \rceil \]
Pegamos o \(i\)-ésimo pior retorno (de menor valor), que representa uma estimativa conservadora do quantil de nível \(p\) da distribuição empírica.
Se a carteira vale R$ 1.000 e o retorno na posição \(i\) for -3%, então o VaR será de R$ 30 para o horizonte de tempo considerado.
Carteira com 1 Ativo - PETR4
Importar os preços da ação PETR4 desde 2024-01-01 com tq_get()
.
Calcular os retornos logarítmicos diários da ação:
\[ \text{retorno}_t = \log(P_t) - \log(P_{t-1}) \]
Definir o valor da carteira \(\vartheta_t\) e a probabilidade \(p\);
Calcular o VaR utilizando a distribuição empírica dos retornos históricos.
Estimativa do VaR Histórico - 1 Ação
# pipeline para importar os preços da ação da Petrobras
# calcular os retornos e remover valores ausentes
precos_petrobras <- "PETR4.SA" %>%
tq_get(from = "2024-01-01") %>%
select(date, close) %>%
mutate(ret_petrobras = log(close / lag(close))) %>%
drop_na()
# Extrai vetor de retornos
ret_petrobras <- precos_petrobras %>%
pull(ret_petrobras)
# Parâmetros
valor_carteira <- 1000
p <- 0.01
# Estimação do VaR
# 1. Ordena os retornos crescentemente
ret_petr_ord <- sort(ret_petrobras)
# 2. Encontra o índice correspondente ao quantil de nível p
# Isto é, o retorno que define a cauda esquerda com p% de probabilidade
# ceiling() é usada para garantir que pegamos um valor suficientemente extremo
op <- ceiling(length(ret_petr_ord) * p)
op
[1] 4
# 3. VaR histórico monetário: valor correspondente ao retorno mais severo
var_petr_hs <- -ret_petr_ord[op] * valor_carteira
var_petr_hs
[1] 57.028
# 4. VaR histórico percentual
var_percentual_petr_hs <- -ret_petr_ord[op] * 100
var_percentual_petr_hs
[1] 5.7028
Usamos ceiling()
para garantir que selecionamos um retorno que está entre os p% piores casos. Por exemplo, com \(T = 252\) e \(p = 0{,}01\), temos \(T \cdot p = 2{,}52\), e o índice \(i = 3\).
Assim, usamos o terceiro pior retorno da amostra. Isso garante que estamos sendo conservadores, pois não usamos interpolação — pegamos o pior valor inteiro que garante cobertura de pelo menos \(p\) da densidade empírica.
Considerações sobre o Método Histórico
A Simulação Histórica é simples e não exige suposições sobre a distribuição dos retornos.
Retornos extremos podem variar bastante: quanto maior a amostra histórica, mais confiável a estimativa do VaR.
Uma desvantagem é que eventos passados podem não refletir bem as condições futuras, especialmente em períodos de quebra estrutural (como em 2008).
Regra prática para tamanho mínimo da amostra:
\[ T_{\text{mínimo}} \geq \frac{3}{p} \]
Visão Geral
A Simulação de Monte Carlo pode ser aplicada de forma:
Neste exemplo, utilizamos a versão não-paramétrica, que realiza uma reamostragem com reposição (bootstrap) dos retornos históricos da ação, sem supor nenhuma forma funcional específica para a distribuição.
O método consiste em gerar cenários simulados de retornos e estimar o VaR como o quantil empírico correspondente ao nível de probabilidade \(p\).
Algoritmo - Simulação Não-Paramétrica
Escolha um nível de probabilidade \(p\) (ex: 1%).
Obtenha uma amostra histórica de retornos \(y = (y\_1, \dots, y\_T)\).
Gere \(N\) simulações de retornos por reamostragem com reposição de \(y\).
Ordene os retornos simulados do menor para o maior: \(y^{(s)}*{(1)} \leq \dots \leq y^{(s)}*{(N)}\).
Encontre o índice \(i = \lceil N \cdot p \rceil\).
O VaR é dado por:
\[ VaR_t = - y^{(s)}_{(i)} \times \vartheta_t \]
onde \(\vartheta\_t\) é o valor da carteira no tempo \(t\).
Exemplo
Importar os preços da ação PETR4 a partir de 2024-01-01 usando tq_get()
.
Calcular os retornos logarítmicos diários:
\[ \text{retorno}_t = \log(P_t) - \log(P_{t-1}) \]
Definir o valor da carteira e o nível de significância $p$.
Estimar o VaR via reamostragem empírica com reposição dos retornos históricos.
Código - Estimativa do VaR Não-Paramétrico
# pipeline para importar os preços da ação da Petrobras
# calcular os retornos e remover valores ausentes
precos_petrobras <- "PETR4.SA" %>%
tq_get(from = "2024-01-01") %>%
select(date, close) %>%
mutate(ret_petrobras = log(close / lag(close))) %>%
drop_na()
# Extrai os retornos
ret_petrobras <- precos_petrobras$ret_petrobras
# Define parâmetros
valor_carteira <- 1000 # valor investido em reais
p <- 0.01 # nível de significância (1%)
n <- 1000 # número de simulações
# Simulação de Monte Carlo (não-paramétrica)
set.seed(123)
ret_simulados <- sample(ret_petrobras, size = n, replace = TRUE)
# Ordena os retornos simulados
ret_simulados_ord <- sort(ret_simulados)
# Encontra o índice do quantil
# Usamos ceiling() para garantir uma estimativa conservadora (valor mais extremo)
indice_var <- ceiling(n * p)
# Estima o VaR monetário
var_petr_mc <- -ret_simulados_ord[indice_var] * valor_carteira
var_petr_mc
[1] 55.821
# Estima o VaR percentual
var_percentual_petr_mc <- -ret_simulados_ord[indice_var] * 100
var_percentual_petr_mc
[1] 5.5821
Considerações
A curva preta representa a densidade empírica dos retornos simulados obtidos por reamostragem com reposição (bootstrap).
A área vermelha representa os 1% piores retornos simulados, ou seja, a cauda esquerda da distribuição com probabilidade \(p = 1%\).
A linha vermelha tracejada marca o valor do VaR estimado, ou seja, o menor retorno tal que apenas 1% dos retornos sejam ainda piores.
A linha azul marca a média dos retornos simulados.
Essa visualização é análoga à do método histórico, pois ambos são não-paramétricos e não impõem suposições de normalidade.
Resumo do VaR
O VaR com nível de probabilidade \(p\) representa a **pior perda esperada com probabilidade \(1 - p\) de não ser superada.
Ele é um limite inferior para os piores \(100 \cdot p\%\) retornos negativos (perdas).
Exemplo: Com \(p = 0.01 = 1\%\), o VaR quantifica a perda que será excedida em média 1 vez a cada 100 dias.
Limitações:
O que é o Expected Shortfall (ES)?
O Expected Shortfall (ES), também chamado de Conditional Value-at-Risk (CVaR), é uma medida de risco que estima a perda média esperada, condicionalmente ao evento de que a perda exceda o VaR.
Ele responde à pergunta: “Qual é perda esperada quando as perdas excedem o VaR?”
Enquanto o VaR é baseado em um quantil da distribuição de perdas, o ES é definido como o valor esperado condicional das perdas, dado que elas excedem esse quantil:
\[ ES = - E[L \mid L \leq VaR_{(p)}] \]
Como estimamos o ES empiricamente?
Dado um nível de probabilidade \(p\) (ex: 1%), estimamos o Expected Shortfall como a média condicional dos piores \(p \cdot T\) retornos, onde \(T\) é o tamanho da amostra.
Ordena-se os retornos em ordem crescente: \(r_{(1)} \leq r_{(2)} \leq \dots \leq r_{(T)}\)
Define-se o índice do VaR: \(k = \lceil \alpha \cdot T \rceil\)
O VaR empírico é dado por: \(VaR\_\alpha = -r\_{(k)}\)
O Expected Shortfall empírico é:
\[ ES_\alpha = -\frac{1}{k} \sum_{i=1}^{k} r_{(i)} \]
PETR4 — Estimativa Empírica do ES
# 1. Parâmetros
p <- 0.01
valor_carteira <- 1000
# 2. Ordena os retornos da PETR4
retornos_ordenados <- sort(ret_petrobras)
# 3. Índice do quantil
k <- ceiling(length(retornos_ordenados) * p)
# 4. VaR e ES empíricos (percentuais)
var_percentual <- -retornos_ordenados[k] * 100
es_percentual <- -mean(retornos_ordenados[1:k]) * 100
# 5. Valores monetários
var_monetario <- var_percentual / 100 * valor_carteira
es_monetario <- es_percentual / 100 * valor_carteira
# Resultados
var_monetario
[1] 57.028
[1] 69.838
VaR vs. ES
No gráfico de densidade dos retornos, o VaR é representado por uma linha vertical tracejada vermelha que separa os 1% piores retornos (quantil de 1%).
O Expected Shortfall aparece como uma linha pontilhada mais à esquerda — representando a média dos piores retornos.
Visualmente, o ES aparece mais à esquerda do que o VaR e é sempre maior em magnitude (ou seja, mais negativo).
O ES é sempre mais conservador que o VaR.
Por que o ES é mais informativo que o VaR?
O ES leva em conta a severidade das perdas extremas, não apenas sua ocorrência.
Ele é mais robusto, pois:
O FRTB (Basileia III) adotou o ES no lugar do VaR como medida oficial de risco de mercado para cálculo de capital regulatório.
O ES complementa e enriquece a análise de risco em cenários de perda severa.
Retorno de uma Carteira
Ação | Ticker | Peso na Carteira (\(w_i\)) |
---|---|---|
Petrobrás | PETR4.SA | \(w_1\) |
Magazine Luiza | MGLU3.SA | \(w_2\) |
Itaú Unibanco | ITUB4.SA | \(w_3\) |
Os retornos diários dos ativos no tempo \(t\) são \((r_{1,t}, r_{2,t}, r_{3,t})\).
O retorno da carteira no tempo \(t\)** é a média ponderada dos retornos:
\[ r_{c,t} = w_1 \cdot r_{1,t} + w_2 \cdot r_{2,t} + w_3 \cdot r_{3,t} \]
\[ r_{c,t} = \mathbf{w}^\top \mathbf{r}_t \quad \text{onde } \mathbf{w} = \begin{bmatrix} w_1 \\ w_2 \\ w_3 \end{bmatrix}, \quad \mathbf{r}_t = \begin{bmatrix} r_{1,t} \\ r_{2,t} \\ r_{3,t} \end{bmatrix} \]
Variância da Carteira
\[ \text{Var}(r_c) = \mathbf{w}^\top \boldsymbol{\Sigma} \mathbf{w} \]
Onde:
\[ \boldsymbol{\Sigma} = \begin{bmatrix} \sigma_1^2 & \sigma_{12} & \sigma_{13} \\ \sigma_{21} & \sigma_2^2 & \sigma_{23} \\ \sigma_{31} & \sigma_{32} & \sigma_3^2 \end{bmatrix} \]
\[ \sigma_c = \sqrt{\text{Var}(r_c)} \]
Implementação em R
# Importa as séries de preços das ações
serie_precos <- c("PETR4.SA", "MGLU3.SA", "ITUB4.SA") %>%
tq_get(from = "2024-01-01") %>%
select(symbol, date, close) %>%
pivot_wider(names_from = symbol, values_from = close) %>%
rename(dia = date,
petr4 = PETR4.SA,
mglu3 = MGLU3.SA,
itub4 = ITUB4.SA)
# Calcula retornos logarítmicos
retornos <- serie_precos %>%
mutate(
ret_petr4 = log(petr4 / lag(petr4)),
ret_mglu3 = log(mglu3 / lag(mglu3)),
ret_itub4 = log(itub4 / lag(itub4))
) %>%
drop_na()
# Define os pesos
pesos <- c(0.4, 0.3, 0.3) # exemplo: 40% PETR4, 30% MGLU3, 30% ITUB4
# Calcula o retorno da carteira
retornos <- retornos %>%
mutate(
ret_carteira = pesos[1] * ret_petr4 +
pesos[2] * ret_mglu3 +
pesos[3] * ret_itub4
)
# dimensão do retorno da carteira
dim(retornos$ret_carteira)
NULL
[1] 0.0015646 -0.0160882 0.0140190 0.0115100 0.0034628 0.0015940
Estimativa do VaR — Método Histórico
# Parâmetros
p <- 0.01
valor_carteira <- 1000
# Ordena retornos da carteira
ret_ordenado <- sort(retornos$ret_carteira)
# Índice do quantil
k <- ceiling(length(ret_ordenado) * p)
# VaR percentual e monetário
var_percentual <- -ret_ordenado[k] * 100
var_monetario <- -ret_ordenado[k] * valor_carteira
var_percentual
[1] 5.007
[1] 50.07
O VaR histórico é a perda mínima entre as 1% piores perdas históricas.
Conservador por natureza — não depende de suposições paramétricas.
Estimativa do ES — Média Condicional
# Expected Shortfall (ES)
es_percentual <- -mean(ret_ordenado[1:k]) * 100
es_monetario <- -mean(ret_ordenado[1:k]) * valor_carteira
es_percentual
[1] 5.432
[1] 54.32
\[ ES = - \frac{1}{k} \sum_{i=1}^{k} r^{(i)} \]
Enunciado
Você é o analisata responsável por estimar o risco de uma carteira de investimentos formada exclusivamente pelas ações da empresa Vale S.A. (VALE3.SA), usando dados reais do mercado de capitais.
Usando o pacote tidyquant
, importe os preços de fechamento diários da ação VALE3.SA, a partir de 01/01/2024.
Calcule os retornos logarítmicos diários da ação.
Suponha que o valor da carteira seja de R$ 5.000.
Estime o Value-at-Risk (VaR) e o Expected Shortfall (ES) para a carteira, no nível de probabilidade de 5%, utilizando o método histórico.
Interprete os valores obtidos: o que eles indicam sobre o risco da carteira?
Instruções
Prof. Washington Silva - Introdução à Ciência de Dados