Python para Simulação Monte Carlo em Investimentos

Investir envolve incertezas. O preço de uma ação, a taxa de câmbio ou o valor de uma carteira pode variar de formas imprevisíveis. Para lidar com isso, os analistas utilizam a Simulação de Monte Carlo, uma técnica estatística que gera milhares (ou milhões) de cenários possíveis para avaliar riscos e retornos.

Com Python, essa abordagem se torna acessível e poderosa, permitindo que investidores e gestores de risco construam modelos sofisticados para prever resultados financeiros.


1. O que é a Simulação de Monte Carlo?

Simulação de Monte Carlo é um método que utiliza números aleatórios para modelar sistemas complexos e incertos.

Na prática, significa que em vez de tentar prever exatamente o futuro, simulamos milhares de possíveis cenários para:

  • Estimar a distribuição de retornos de um ativo ou portfólio.

  • Avaliar métricas de risco, como Value at Risk (VaR).

  • Calcular probabilidades de perda ou ganho em investimentos.


2. Aplicações em Investimentos

A técnica é amplamente usada em finanças para:


3. Preparando o Ambiente

Instalando dependências:

pip install numpy pandas matplotlib yfinance

4. Coletando Dados de Ações

Usaremos a Petrobras (PETR4) como exemplo.

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Baixando dados históricos (2 anos)
dados = yf.download("PETR4.SA", period="2y", interval="1d")

# Calculando retornos diários
dados["Retorno"] = dados["Close"].pct_change()
media = dados["Retorno"].mean()
desvio = dados["Retorno"].std()

print("Retorno médio diário:", media)
print("Volatilidade diária:", desvio)

5. Simulação de Monte Carlo

Agora, vamos simular o preço futuro da ação com base no retorno médio e na volatilidade histórica.

5.1 Parâmetros da simulação

  • dias = 252 → número de pregões em um ano.

  • simulacoes = 1000 → quantidade de cenários simulados.

  • Usamos processo de passeio aleatório (random walk).

# Parâmetros
dias = 252
simulacoes = 1000
preco_inicial = dados["Close"][-1]

# Simulação
resultados = np.zeros((dias, simulacoes))

for s in range(simulacoes):
    preco = preco_inicial
    for d in range(dias):
        retorno = np.random.normal(media, desvio)
        preco = preco * (1 + retorno)
        resultados[d, s] = preco

5.2 Visualizando os Cenários

plt.figure(figsize=(12,6))
plt.plot(resultados, alpha=0.1, color="blue")
plt.title("Simulação de Monte Carlo - PETR4 (1000 cenários)")
plt.xlabel("Dias")
plt.ylabel("Preço da Ação")
plt.show()

📌 O gráfico mostra várias trajetórias possíveis para o preço da ação em 1 ano.


6. Distribuição de Preços Futuros

Ao final das simulações, podemos analisar a distribuição dos preços possíveis.

precos_finais = resultados[-1, :]

plt.figure(figsize=(10,5))
plt.hist(precos_finais, bins=50, color="skyblue", edgecolor="black")
plt.title("Distribuição de Preços Finais - PETR4")
plt.xlabel("Preço")
plt.ylabel("Frequência")
plt.show()

print("Preço médio esperado:", np.mean(precos_finais))
print("Preço mínimo:", np.min(precos_finais))
print("Preço máximo:", np.max(precos_finais))

📌 Aqui conseguimos ver cenários otimistas e pessimistas, além de um intervalo provável para o preço.


7. Calculando Risco: Value at Risk (VaR)

VaR (Value at Risk) é uma métrica de risco muito usada em bancos e fundos. Ele responde à pergunta:

Qual é a perda máxima esperada em um horizonte de tempo, com um certo nível de confiança?

Exemplo: VaR de 5% significa que existe 5% de chance de perder mais do que aquele valor.

VaR_95 = np.percentile(precos_finais, 5)
print(f"Value at Risk (95% confiança): {VaR_95}")

📌 Isso ajuda o investidor a entender cenários adversos.


8. Simulando um Portfólio

Podemos aplicar Monte Carlo também em carteiras de ativos.

Exemplo com PETR4 e VALE3:

ativos = ["PETR4.SA", "VALE3.SA"]
dados_port = yf.download(ativos, period="2y")["Close"]

# Retornos diários
retornos = dados_port.pct_change().dropna()

# Pesos do portfólio (50% cada ativo)
pesos = np.array([0.5, 0.5])
retornos_port = retornos.dot(pesos)

media = retornos_port.mean()
desvio = retornos_port.std()

# Simulação Monte Carlo para portfólio
resultados = np.zeros((dias, simulacoes))
preco_inicial = 100  # carteira começa com R$100

for s in range(simulacoes):
    preco = preco_inicial
    for d in range(dias):
        retorno = np.random.normal(media, desvio)
        preco = preco * (1 + retorno)
        resultados[d, s] = preco

# Gráfico
plt.plot(resultados, alpha=0.1, color="green")
plt.title("Simulação de Monte Carlo - Portfólio PETR4 + VALE3")
plt.xlabel("Dias")
plt.ylabel("Valor do Portfólio (R$)")
plt.show()

📌 Isso ajuda a visualizar como o valor da carteira pode evoluir sob diferentes cenários.


9. Boas Práticas

  • Use dados suficientes: quanto mais histórico, mais realista a simulação.

  • Valide o modelo: compare previsões com dados reais passados.

  • Não dependa apenas da simulação: use também análise fundamentalista e técnica.

  • Combine com otimização de portfólios (ex.: Teoria de Markowitz).

  • Monte Carlo não prevê o futuro, mas mostra possibilidades.


10. Conclusão

Simulação de Monte Carlo é uma ferramenta poderosa para investidores e gestores de risco, permitindo entender cenários de incerteza e calcular métricas como o VaR.

Com Python, implementamos a técnica de forma prática, usando bibliotecas como NumPy, Pandas, Matplotlib e yfinance.
Esse tipo de simulação ajuda a tomar decisões mais embasadas e conscientes, reduzindo riscos em investimentos.

Comentários

Postagens mais visitadas deste blog

Python para Computação Quântica: Introdução com Qiskit

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Estrutura Básica de um Programa C# com exemplos