Un modèle de séquences où l'état qui compte n'est jamais observé : régime de marché, phonème prononcé, usure d'une machine. On ne voit que ses effets, des rendements ou des sons. Le HMM estime les états cachés, leurs probabilités de transition et ce que chacun produit, puis indique l'état le plus probable à chaque instant.
Enfermé dans une pièce sans fenêtre, vous voyez les gens arriver avec ou sans parapluie. Vous ne voyez pas la météo, mais vous la devinez, en sachant qu'un jour de pluie est souvent suivi d'un autre.
Ici, deux régimes de marché. Chacun produit des rendements selon sa propre loi normale : resserrés en régime calme, dispersés en régime agité.
Cet algorithme de type EM ajuste en même temps les probabilités de passer d'un régime à l'autre et la loi des rendements de chaque régime, en maximisant la vraisemblance de la série observée.
On calcule pour chaque jour la probabilité d'être dans chaque régime, et l'algorithme de Viterbi donne la séquence de régimes la plus probable.
On calcule les rendements quotidiens en pourcentage. Aucune étiquette « calme » ou « agité » n'est fournie : c'est au modèle de les trouver.
Le modèle isole un régime calme et un régime agité, nettement plus volatil. Les deux sont très persistants : on reste en général des semaines, voire des mois, dans le même régime. La probabilité du dernier jour sert au pilotage du risque.
Il n'existe pas de vérité terrain. On vérifie que les régimes sont stables, qu'ils correspondent à des périodes connues, et qu'adapter l'exposition au régime améliore le couple rendement-risque sur une période de test.
Noms donnés pour depmixS4 en R et hmmlearn en Python.
Nombre d'états cachés. On commence par 2 ou 3 et on compare le critère BIC ; au-delà, les états deviennent difficiles à interpréter.
Gaussienne pour des rendements (family = gaussian() en R, GaussianHMM en Python), catégorielle pour des symboles (CategoricalHMM en Python).
L'estimation peut s'arrêter sur un optimum local. On relance avec plusieurs graines et on garde le modèle de plus forte vraisemblance.
Des rendements de l'ordre de 0,01 posent des problèmes numériques. Les exprimer en pourcentage, comme dans l'exemple, stabilise l'estimation.
# Régimes de marché : modèle de Markov caché (HMM) en R
library(depmixS4)
cours <- read.csv("cours_bourse.csv")
donnees <- data.frame(rendement = 100 * diff(log(cours$cloture))) # rendements quotidiens en %
set.seed(42)
# 2 états cachés : on observe les rendements, jamais le régime lui-même
modele <- depmix(rendement ~ 1, data = donnees, nstates = 2, family = gaussian())
ajuste <- fit(modele, verbose = FALSE)
summary(ajuste) # matrice de transition, moyenne et écart-type de chaque régime
# Séquence d'états la plus probable (algorithme de Viterbi)
etats <- posterior(ajuste, type = "viterbi")
print(table(etats$state)) # jours passés dans chaque régime
# Probabilité d'être dans chaque régime le dernier jour : l'information utile au pilotage du risque
print(tail(posterior(ajuste, type = "smoothing"), 1))
# Régimes de marché : modèle de Markov caché (HMM) en Python
import numpy as np
import pandas as pd
from hmmlearn.hmm import GaussianHMM
cours = pd.read_csv("cours_bourse.csv")
rendements = 100 * np.diff(np.log(cours.cloture.values)) # rendements quotidiens en %
X = rendements.reshape(-1, 1)
# 2 états cachés : on observe les rendements, jamais le régime lui-même
modele = GaussianHMM(n_components=2, covariance_type="diag", n_iter=200, random_state=42)
modele.fit(X)
etats = modele.predict(X) # séquence d'états la plus probable (algorithme de Viterbi)
print("Rendement moyen par régime (%/jour) :", modele.means_.ravel().round(3))
print("Volatilité par régime (%/jour) :", np.sqrt(modele.covars_.ravel()).round(2))
print("Matrice de transition :\n", modele.transmat_.round(3))
print("Jours passés dans chaque régime :", np.bincount(etats))
# Probabilité d'être dans chaque régime le dernier jour : l'information utile au pilotage du risque
print("Régime du dernier jour (probabilités) :", modele.predict_proba(X)[-1].round(3))
Dans une chaîne de Markov, on observe directement l'état, par exemple la page visitée. Dans un HMM, l'état est caché : on observe seulement les signaux qu'il produit, et le modèle en déduit l'état le plus probable.
Il trouve la séquence d'états cachés la plus probable compte tenu de toute la série observée. Il procède par programmation dynamique, ce qui évite d'énumérer toutes les séquences possibles.
On estime des modèles à 2, 3 ou 4 états et on compare un critère comme le BIC, qui pénalise la complexité. Le choix final doit aussi avoir un sens métier : des états que l'on sait nommer et utiliser.
Même mécanique, avec des états directement observés, comme les pages d'un site.
Voir la fiche → prévoir la volatilitéFait varier la volatilité en continu plutôt que par bascules entre quelques régimes.
Voir la fiche → dater le changementSitue les dates où une série change de comportement, sans supposer d'allers-retours entre régimes.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus