Gestão de risco com redes neurais

Gerenciamento Quantitativo de Risco em Python

Jamsheed Shorish

Computational Economist

Atualização de portfólio em tempo real

  • Gestão de risco
    • Medidas de risco definidas (VaR, CVaR)
    • Medidas de risco estimadas (paramétrica, histórica, Monte Carlo)
    • Portfólio otimizado (ex.: Teoria Moderna do Portfólio)
  • Nova informação de mercado => atualizar pesos do portfólio
    • Problema: otimização do portfólio é cara
    • Solução: $\text{weights} = f(\text{prices})$
    • Avaliar $f$ em tempo real
    • Atualizar $f$ só ocasionalmente
Gerenciamento Quantitativo de Risco em Python

Redes neurais

  • Rede neural: $\text{saída} = f(\text{entrada})$
    • Neurônio: nó de processamento interconectado na função
  • Desenvolvidas inicialmente nas décadas de 1940-1950
  • Início dos anos 2000: aplicação a "big data"
    • Reconhecimento e processamento de imagens
    • Dados financeiros
    • Dados de mecanismos de busca
  • Deep Learning: redes neurais dentro de Machine Learning
    • 2015: Google lança o TensorFlow, biblioteca open-source de deep learning para Python
Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Camadas: neurônios conectados
    • Camada de entrada

camada de entrada de rede neural

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta

camada oculta de rede neural

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta
    • Camada de saída
  • Treinamento: aprender a relação entre entrada e saída

imagem das camadas de entrada, oculta e saída

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta
    • Camada de saída
  • Treinamento: aprender a relação entre entrada e saída
    • Preços de ativos => Camada de entrada

imagem com preços de ativos alimentando a rede neural

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta
    • Camada de saída
  • Treinamento: aprender a relação entre entrada e saída
    • Preços de ativos => Camada de entrada
    • Processamento da camada de entrada + oculta

imagem com arestas/pesos na rede neural

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta
    • Camada de saída
  • Treinamento: aprender a relação entre entrada e saída
    • Preços de ativos => Camada de entrada
    • Processamento da camada de entrada + oculta
    • Processamento da camada oculta + saída

imagem dos pesos da camada oculta para a de saída

Gerenciamento Quantitativo de Risco em Python

Estrutura de rede neural

  • Estrutura de rede neural
    • Camada de entrada
    • Camada oculta
    • Camada de saída
  • Treinamento: aprender a relação entre entrada e saída
    • Preços de ativos => Camada de entrada
    • Processamento da camada de entrada + oculta
    • Processamento da camada oculta + saída
    • Saída => pesos do portfólio

imagem da camada de saída apresentada como pesos do portfólio

Gerenciamento Quantitativo de Risco em Python

Usando redes neurais na otimização de portfólio

  • Treinamento
    • Comparar a saída com pesos "ideais" pré-existentes
    • Objetivo: minimizar o "erro" entre saída e pesos
    • Erro pequeno => rede treinada
  • Uso
    • Entrada: novos preços de ativos ainda não vistos
    • Saída: pesos "ideais" previstos para esses preços
    • Melhores pesos = gestão de risco
Gerenciamento Quantitativo de Risco em Python

Criando redes neurais em Python

 

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense
model = Sequential() model.add(Dense(10, input_dim=4, activation='sigmoid')) model.add(Dense(4))
Gerenciamento Quantitativo de Risco em Python

Treinando a rede em Python

  • Preços históricos de ativos: matriz training_input
  • Pesos históricos do portfólio: vetor training_output
  • Compilar o modelo com:
    • minimização de erro dada (loss)
    • algoritmo de otimização dado (optimizer)
  • Ajustar o modelo aos dados de treino
    • epochs: número de loops de treino para atualizar parâmetros internos
model.compile(loss='mean_squared_error', optimizer='rmsprop')

model.fit(training_input, training_output, epochs=100)
Gerenciamento Quantitativo de Risco em Python

Gestão de risco em Python

  • Uso: fornecer novos dados de preços (ex.: em tempo real)
    • Novo vetor new_asset_prices enviado à camada de entrada
  • Avaliar a rede com model.predict() nos novos preços
    • Resultado: pesos de portfólio predicted
  • Acumule dados ao longo do tempo => re-treinar a rede
    • Teste a rede com dados anteriores => backtesting
# new asset prices are in the vector new_asset_prices
predicted = model.predict(new_asset_prices)
Gerenciamento Quantitativo de Risco em Python

Vamos praticar!

Gerenciamento Quantitativo de Risco em Python

Preparing Video For Download...