Simulação histórica e de Monte Carlo

Gerenciamento Quantitativo de Risco em Python

Jamsheed Shorish

Computational Economist

Simulação histórica

  • Sem uma classe adequada de distribuições?
  • Simulação histórica: use o passado para prever o futuro
    • Sem suposição distribucional
    • Dados de perdas anteriores viram perdas simuladas de amanhã
Gerenciamento Quantitativo de Risco em Python

Simulação histórica em Python

  • VaR: comece com os retornos em asset_returns
  • Calcule portfolio_returns usando os weights do portfólio
  • Converta portfolio_returns em losses
  • VaR: calcule np.quantile() para losses com, por exemplo, 95% de confiança
  • Supõe que a distribuição futura de perdas é exatamente a mesma do passado

 

weights = [0.25, 0.25, 0.25, 0.25]

portfolio_returns = asset_returns.dot(weights)
losses = - portfolio_returns
VaR_95 = np.quantile(losses, 0.95)
Gerenciamento Quantitativo de Risco em Python

Simulação de Monte Carlo

  • Simulação de Monte Carlo: combinação poderosa de estimação paramétrica e simulação
    • Assume distribuição(ões) para a perda do portfólio e/ou fatores de risco
    • Depende de amostras aleatórias da(s) distribuição(ões) para criar uma trajetória aleatória, chamada de execução
    • Repetir os sorteios $\Rightarrow$ cria um conjunto de execuções de simulação
  • Calcule a perda simulada do portfólio em cada execução até o tempo desejado
  • Encontre o VaR como o quantil das perdas simuladas
Gerenciamento Quantitativo de Risco em Python

Simulação de Monte Carlo em Python

  • Passo Um:
    • Importe a distribuição Normal norm de scipy.stats
    • Defina total_steps (1 dia = 1440 minutos)
    • Defina o número de execuções N
    • Calcule média mu e desvio padrão sigma dos dados portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Gerenciamento Quantitativo de Risco em Python

Simulação de Monte Carlo em Python

  • Passo Dois:
    • Inicialize o vetor daily_loss para N execuções
    • Faça um loop sobre N execuções
      • Calcule o vetor loss simulado por Monte Carlo
        • Usa norm.rvs() para sortear repetidamente da Normal padrão
        • Sorteios compatíveis com os dados usando mu e sigma escalados por 1/total_steps
daily_loss = np.zeros(N)

for n in range(N):
loss = ( mu * (1/total_steps) + norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps) )
Gerenciamento Quantitativo de Risco em Python

Simulação de Monte Carlo em Python

  • Passo Três:
    • Gere daily_loss cumulativo para cada execução n
    • Use np.quantile() para achar o VaR com, por exemplo, 95% de confiança em daily_loss

 

daily_loss = np.zeros(N)
for n in range(N):

loss = mu * (1/total_steps) + ... norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps)
daily_loss[n] = sum(loss)
VaR_95 = np.quantile(daily_loss, 0.95)
Gerenciamento Quantitativo de Risco em Python

Simulando retornos de ativos

  • Aprimoramento: gere trajetórias aleatórias de retornos de ativos no portfólio
    • Traz mais realismo: retornos podem ser simulados individualmente
    • Retornos de ativos podem ser correlacionados
      • Lembre: matriz de covariância eficiente e_cov
      • Usada no Passo 2 para calcular retornos dos ativos
  • Exercícios: simulação de Monte Carlo com simulação de retornos de ativos
Gerenciamento Quantitativo de Risco em Python

Vamos praticar!

Gerenciamento Quantitativo de Risco em Python

Preparing Video For Download...