Volatility Targeting : Contrôler le Risque par le Sizing Dynamique

Le volatility targeting ajuste la taille de position à la volatilité du marché. Implémentation Python et backtest comparatif sur Bitcoin.

Volatility Targeting : Contrôler le Risque par le Sizing Dynamique

Une allocation fixe de 50 % en Bitcoin n'expose pas au même risque selon les conditions de marché. En période calme, quand la volatilité quotidienne tourne autour de 2 %, cette position génère des mouvements d'environ 1 % par jour sur le portefeuille. Quand la volatilité monte à 8 %, la même allocation produit des variations de 4 % quotidiennement. L'allocation n'a pas changé, mais le risque a quadruplé.

Avec une allocation fixe, la taille de position reste identique quelle que soit la volatilité du marché. Le pourcentage investi ne bouge pas, mais le risque qu'il représente varie : modéré en période calme, élevé en période agitée. C'est en période de forte volatilité, quand les mouvements sont les plus amples, que l'écart entre capital alloué et risque réel est le plus marqué.

Le volatility targeting (ciblage de volatilité) propose une approche différente. Au lieu de fixer l'exposition en capital, on fixe l'exposition en risque : combien on accepte que le portefeuille bouge par jour. La taille de position (le sizing) s'ajuste automatiquement pour maintenir ce niveau de risque constant. La formule tient en une ligne, l'implémentation en quelques lignes de Python, et l'effet sur le profil de risque du portefeuille est immédiatement mesurable.

Pourquoi le sizing fixe crée un risque variable

Au-delà de l'écart journalier, un second effet amplifie le phénomène : le clustering de volatilité (tendance des épisodes de forte volatilité à se regrouper dans le temps). Les journées de grands mouvements ne viennent pas seules ; elles se succèdent en séquences de plusieurs jours. Avec un sizing fixe, la taille de position reste la même pendant toute la séquence, indépendamment de l'amplitude des mouvements.

C'est dans ces épisodes que se concentrent les drawdowns (pertes maximales depuis un pic de performance) les plus sévères, et dans les cas extrêmes, les liquidations sur les comptes à levier. Une position dimensionnée pour un marché calme qui rencontre plusieurs jours consécutifs de forte volatilité peut voir ses pertes s'accumuler bien au-delà de ce qu'une seule journée aurait produit. La question n'est pas de savoir si ces épisodes se produiront, mais combien on y sera exposé quand ils arriveront.

Volatilité réalisée et volatilité cible : le sizing dynamique

Le volatility targeting repose sur deux grandeurs :

  • Volatilité réalisée (realized volatility) — ce qui s'est passé. On la calcule comme l'écart-type pondéré des rendements quotidiens récents, en donnant plus de poids aux observations les plus proches. Une fenêtre de 20 jours est un choix classique. C'est une mesure rétrospective : elle décrit le passé, pas le futur.
  • Volatilité cible (target volatility) — ce qu'on choisit. Ce n'est pas une mesure mais une décision. Fixer une volatilité cible de 2 % par jour signifie qu'on accepte que le portefeuille varie d'environ 2 % quotidiennement, quelle que soit l'agitation du marché.

La taille de position découle du rapport entre les deux :

$$ \text{position} = \frac{\text{volatilité cible}}{\text{volatilité réalisée}} $$

Si la volatilité réalisée du BTC est de 4 % et la cible de 2 %, la position sera de 50 % du capital (2 % ÷ 4 %). Si la volatilité baisse à 1 %, la position monte à 200 % (le plafond défini dans le code). Le mécanisme est inversement proportionnel : plus le marché s'agite, plus la position se réduit, et inversement.

Implémenter le volatility targeting en Python

Le calcul se fait en quelques lignes avec pandas (bibliothèque de manipulation de données tabulaires) et yfinance (bibliothèque qui télécharge les données de marché depuis Yahoo Finance). Le code ci-dessous récupère les prix du Bitcoin, calcule la volatilité réalisée via une moyenne mobile exponentielle, et construit deux equity curves (courbes de performance) comparatives.

import pandas as pd
import yfinance as yf

# Télécharger les prix quotidiens du Bitcoin
btc = yf.Ticker('BTC-USD').history(start='2020-01-01')
returns = btc['Close'].pct_change().dropna()

# Volatilité réalisée (moyenne mobile exponentielle, 20 jours)
realized_vol = returns.ewm(span=20).std()

# Volatilité cible : 2% par jour
target_vol = 0.02

# Taille de position dynamique, plafonnée à 200%
position_size = (target_vol / realized_vol).clip(upper=2.0)

# Equity curves comparatives
fixed_equity = (1 + returns).cumprod()
targeted_equity = (1 + returns * position_size.shift(1)).cumprod()

# Résultat :
# Sizing fixe   — Vol annualisée: 50.6%, MaxDD: -76.6%
# Vol targeting  — Vol annualisée: 36.2%, MaxDD: -60.9%

Dans ce code le .clip(upper=2.0) plafonne la position à 200 % du capital. Sans ce garde-fou, une volatilité très basse produirait une taille de position disproportionnée. Le .shift(1) décale la taille de position d'un jour : on utilise la volatilité mesurée hier pour dimensionner la position d'aujourd'hui, car on ne peut pas connaître la volatilité du jour avant qu'il soit terminé.

Impact sur le rendement et le drawdown

Prenons un cas simple : un buy & hold (achat et conservation) de Bitcoin entre 2020 et 2026. On compare deux versions du même portefeuille, l'une avec une allocation fixe à 100 % (courbe rouge), l'autre avec un sizing ajusté par le vol targeting (courbe bleue). La courbe rouge termine plus haut, mais la courbe bleue est nettement plus régulière, avec des drawdowns compressés pendant les épisodes de forte volatilité (2022, fin 2024).

Métrique Sizing fixe Vol targeting
Rendement annualisé 28,5 % 24,0 %
Volatilité annualisée 50,6 % 36,2 %
Drawdown maximum -76,6 % -60,9 %

La courbe rouge (sizing fixe) termine plus haut, ce qui est attendu : avec une exposition moyenne de 80 %, le portefeuille vol-targeté capte moins de rendement brut. Mais la courbe bleue est nettement plus régulière : la volatilité annualisée passe de 50,6 % à 36,2 %, et le drawdown maximal de -76,6 % à -60,9 %, soit 16 points de pourcentage de moins dans le pire scénario.

C'est d'ailleurs là que la logique se prolonge : un portefeuille dont le risque est mieux contrôlé supporte un levier de manière plus robuste. Les 20 % de capital non exposé en moyenne peuvent aussi être alloués ailleurs. Autrement dit, maîtriser le risque n'est pas renoncer au rendement, c'est se donner les moyens de l'amplifier plus sereinement. Ces résultats sont spécifiques à cette période et à cet actif ; les performances passées ne présagent en rien des résultats futurs.

Les limites du volatility targeting

Le volatility targeting n'est pas une stratégie de trading. C'est une couche de gestion du risque qui s'applique par-dessus n'importe quelle stratégie existante. Il ne génère pas de signaux d'achat ou de vente ; il ajuste la quantité de capital exposée.

Sa principale limite est le lag (retard) inhérent à la volatilité réalisée. Puisqu'on mesure la volatilité passée, la position est calibrée sur ce qui s'est déjà produit. En tout début de crise, quand la volatilité vient de bondir, la position est encore dimensionnée pour un marché calme. Le mécanisme se corrige en quelques jours, mais les premières heures d'un choc restent mal couvertes.

Le choix de la fenêtre de calcul implique un compromis. Une fenêtre courte (10-15 jours) réagit vite mais provoque des ajustements fréquents, ce qui peut générer des frais de transaction. Une fenêtre longue (40-60 jours) lisse le signal mais met plus de temps à refléter un changement de régime. La fenêtre de 20 jours est un point de départ raisonnable, pas une constante universelle. Notre numéro sur la détection de régimes explore comment identifier les changements de dynamique du marché, une information complémentaire pour ajuster la cible de volatilité au contexte.

En production, comparer les métriques de risque avant et après un ajustement de sizing est indispensable. Mais quand on fait tourner plusieurs bots, plusieurs stratégies, plusieurs configurations en parallèle, le suivi devient vite ingérable. C'est pour répondre à ce problème que nous avons développé EdgeTrack, un journal de trading automatisé (code open source, version premium web disponible) qui centralise le reporting et l'analyse de performance.

EdgeTrack — Suivez et analysez enfin votre PnL précisément
Pour les traders crypto futures : trades reconstruits, frais et funding inclus, sans tableur.

Tout au long de cet article, le niveau de risque qu'on s'autorise (la volatilité cible) est un chiffre fixe : 2 % par jour. C'est un point de départ, mais rien n'oblige à le garder constant. Une évolution naturelle consiste à remplacer cette cible fixe par une moyenne mobile longue de la volatilité réalisée (100 ou 200 jours, par exemple). La formule devient :

$$ \text{position} = \frac{\text{vol réalisée long terme}}{\text{vol réalisée court terme}} $$

Quand la volatilité court terme dépasse sa moyenne long terme, la position se réduit. Quand elle revient en dessous, la position grandit. La cible s'adapte automatiquement aux conditions structurelles du marché au lieu de dépendre d'un choix arbitraire. Le vol targeting devient alors entièrement piloté par les données.

Bonne calibration !