Gestion des risques avec réseaux de neurones

Gestion quantitative des risques en Python

Jamsheed Shorish

Computational Economist

Mise à jour du portefeuille en temps réel

  • Gestion des risques
    • Mesures de risque définies (VaR, CVaR)
    • Mesures de risque estimées (paramétrique, historique, Monte Carlo)
    • Portefeuille optimisé (ex. théorie moderne du portefeuille)
  • Nouvelles infos de marché => mettre à jour les pondérations du portefeuille
    • Problème : optimisation du portefeuille coûteuse
    • Solution : $\text{weights} = f(\text{prices})$
    • Évaluer $f$ en temps réel
    • Mettre à jour $f$ à l'occasion seulement
Gestion quantitative des risques en Python

Réseaux de neurones

  • Réseau de neurones : $\text{output} = f(\text{input})$
    • Neurone : nœud de traitement interconnecté dans la fonction
  • Développés au départ dans les années 1940-1950
  • Début des années 2000 : application aux « big data »
    • Reconnaissance et traitement d'images
    • Données financières
    • Données des moteurs de recherche
  • Deep Learning : réseaux de neurones au sein du Machine Learning
    • 2015 : Google publie TensorFlow, une bibliothèque libre de deep learning pour Python
Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Couches : neurones de traitement connectés
    • Couche d'entrée

couche d'entrée d'un réseau de neurones

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée

couche cachée d'un réseau de neurones

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée
    • Couche de sortie
  • Entraînement : apprendre le lien entre entrée et sortie

image des couches d'entrée, cachée et de sortie

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée
    • Couche de sortie
  • Entraînement : apprendre le lien entre entrée et sortie
    • Prix des actifs => couche d'entrée

image où les prix d'actifs alimentent le réseau de neurones

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée
    • Couche de sortie
  • Entraînement : apprendre le lien entre entrée et sortie
    • Prix des actifs => couche d'entrée
    • Traitement par les couches d'entrée + cachée

image avec arêtes pondérées dans le réseau de neurones

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée
    • Couche de sortie
  • Entraînement : apprendre le lien entre entrée et sortie
    • Prix des actifs => couche d'entrée
    • Traitement par les couches d'entrée + cachée
    • Traitement par les couches cachée + sortie

image des poids de la couche cachée vers la couche de sortie

Gestion quantitative des risques en Python

Structure d'un réseau de neurones

  • Structure d'un réseau de neurones
    • Couche d'entrée
    • Couche cachée
    • Couche de sortie
  • Entraînement : apprendre le lien entre entrée et sortie
    • Prix des actifs => couche d'entrée
    • Traitement par les couches d'entrée + cachée
    • Traitement par les couches cachée + sortie
    • Sortie => pondérations du portefeuille

image de la couche de sortie présentée comme pondérations du portefeuille

Gestion quantitative des risques en Python

Utiliser les réseaux de neurones pour l'optimisation de portefeuille

  • Entraînement
    • Comparer la sortie aux pondérations « optimales » existantes
    • But : minimiser l'« erreur » entre sortie et pondérations
    • Petite erreur => réseau entraîné
  • Utilisation
    • Entrée : nouveaux prix d'actifs jamais vus
    • Sortie : pondérations « optimales » prévues pour ces nouveaux prix
    • Meilleures pondérations = gestion des risques
Gestion quantitative des risques en Python

Créer des réseaux de neurones en 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))
Gestion quantitative des risques en Python

Entraîner le réseau en Python

  • Prix d'actifs historiques : matrice training_input
  • Pondérations historiques du portefeuille : vecteur training_output
  • Compiler le modèle avec :
    • la minimisation d'erreur (« loss »)
    • l'algorithme d'optimisation (« optimizer »)
  • Ajuster le modèle aux données d'entraînement
    • epochs : nombre de boucles d'entraînement pour mettre à jour les paramètres internes
model.compile(loss='mean_squared_error', optimizer='rmsprop')

model.fit(training_input, training_output, epochs=100)
Gestion quantitative des risques en Python

Gestion des risques en Python

  • Utilisation : fournir de nouvelles données de prix d'actifs (p. ex. en temps réel)
    • Nouveau vecteur new_asset_prices envoyé à la couche d'entrée
  • Évaluer le réseau avec model.predict() sur les nouveaux prix
    • Résultat : pondérations de portefeuille predicted
  • Accumuler assez de données au fil du temps => réentraîner le réseau
    • Tester le réseau sur des données passées => rétrospécification (backtesting)
# new asset prices are in the vector new_asset_prices
predicted = model.predict(new_asset_prices)
Gestion quantitative des risques en Python

Passons à la pratique !

Gestion quantitative des risques en Python

Preparing Video For Download...