Aller au contenu
Table des matières

MarkokChainMonteCarlo

MarkokChainMonteCarlo est un dépôt de recherche d’AlgoÉTS qui backteste des stratégies d’investissement à l’aide de simulations stochastiques de prix. Ses carnets estiment des trajectoires du cours d’Apple (AAPL) avec un modèle Monte Carlo et une chaîne de Markov sur des tranches de prix, puis utilisent ces simulations dans une stratégie backtesting.py comparée à l’achat-conservation. La partie Monte Carlo est expliquée pas à pas dans Prévoir des cours boursiers avec des simulations Monte Carlo.

CarnetsMonte Carlo
PythonJupyterbacktesting.pypandasNumPySciPyhttpxscikit-learn
  • Mis à jour

1. Aperçu

mcmc.ipynb et backtest.ipynb commencent de la même façon : une fonction httpx télécharge l’historique quotidien complet d’AAPL chez Financial Modeling Prep, puis les données sont coupées au 2023-01-01 en une partie d’entraînement et une partie de validation. monte_carlo_simulation estime la dérive et la volatilité à partir des rendements logarithmiques et fait évoluer le prix avec des chocs aléatoires ; mcmc.ipynb ajoute des variantes à volatilité glissante, à chocs extrêmes occasionnels et à dérive stochastique facultative, et trace des projections sur 364 jours avec 1 000 ou 10 000 trajectoires. La chaîne de Markov découpe les clôtures d’entraînement en tranches de 10 $ entre 0 et 200, compte les passages d’une tranche à l’autre avec pandas.crosstab et tire une suite d’états avec markov_chain_simulation. Le carnet se termine par une régression linéaire sur l’indice des jours.

backtest.ipynb définit MCMCStrategy : la stratégie simule trajectoires et états de Markov au début du backtest, achète quand le dernier état simulé vaut 0 et sort sur un stop de 5 % ou quand la clôture atteint un prix cible tiré d’une trajectoire simulée. BuyAndHoldStrategy sert de référence. Les deux tournent avec 10 000 en encaisse, une commission de 0,2 % et des ordres exclusifs, sur les deux périodes. proto.ipynb est le premier prototype sur des prix générés aléatoirement, et output/MCMCStrategy.html est un graphique backtesting.py enregistré.

2. Cas d’utilisation

Carnets qui simulent les prix d’AAPL par Monte Carlo et chaîne de Markov, puis backtestent une stratégie qui s’en sert.

Diagramme de cas d’utilisation de MarkokChainMonteCarlo : Séparer les prix en 2023; Simuler des trajectoires; Simuler une chaîne de Markov; Backtester MCMCStrategy; Ajuster une tendance linéaireMarkokChainMonteCarloSéparer les prix en 2023Simuler des trajectoiresSimuler une chaîne de MarkovBacktester MCMCStrategyAjuster une tendance linéaireChercheur quantitatif«système»API de marché FMP
Acteurs à gauche (personnes) et à droite (systèmes externes) ; chaque ovale est un cas d’utilisation appuyé par les fichiers cités ci-dessous.
Séparer les prix en 2023
Chercheur quantitatifAPI de marché FMP

mcmc.ipynb et backtest.ipynb téléchargent l’historique complet d’AAPL avec get_historical_price_full_stock et le coupent au 2023-01-01 en prices_before_january_2023 et prices_after_january_2023.

Simuler des trajectoires
Chercheur quantitatif

monte_carlo_simulation tire des chocs quotidiens à partir de la dérive et de la volatilité des rendements logarithmiques ; mcmc.ipynb ajoute des variantes à volatilité glissante et à chocs extrêmes, sur 364 jours et 1 000 ou 10 000 trajectoires.

Simuler une chaîne de Markov
Chercheur quantitatif

Les clôtures d’entraînement sont réparties en tranches de 10 $ de 0 à 200 ; pandas.crosstab construit la matrice de transition normalisée et markov_chain_simulation tire une suite de tranches.

Backtester MCMCStrategy
Chercheur quantitatif

backtest.ipynb exécute MCMCStrategy (stop de 5 %, prise de profit tirée d’une trajectoire simulée) et BuyAndHoldStrategy avec backtesting.py : 10 000 en encaisse, commission de 0,2 %, ordres exclusifs, sur les deux périodes.

Ajuster une tendance linéaire
Chercheur quantitatif

La section Linear Regression de mcmc.ipynb ajuste une LinearRegression scikit-learn sur l’indice des jours des deux périodes avec un train_test_split 80/20.

2.1. Scénario : Comparer MCMCStrategy et l’achat-conservation sur AAPL

  1. Installer les paquets de la commande pip du README et mettre sa propre clé dans la cellule FMP_API_KEY.
  2. Ouvrir backtest.ipynb et télécharger l’historique d’AAPL avec get_historical_price_full_stock.
  3. Couper les données au 2023-01-01 et construire la matrice de transition des tranches de prix sur la première partie.
  4. Créer les objets Backtest de MCMCStrategy et BuyAndHoldStrategy sur les deux périodes et appeler run().
  5. Tracer le résultat ; output/MCMCStrategy.html est un graphique backtesting.py enregistré pour MCMCStrategy.

Fichiers consultésREADME.mdrequirements.txtmcmc.ipynbbacktest.ipynbproto.ipynboutput/MCMCStrategy.html

3. Fonctionnement des algorithmes

Monte-Carlo vers l’avant. monte_carlo_simulation traite le prix comme un mouvement brownien géométrique estimé sur l’historique :

rᵢ = ln(Pᵢ / Pᵢ₋₁)                      rendements logarithmiques quotidiens des clôtures d’entraînement
drift = moyenne(r) − ½ · var(r)
σ = écart-type(r)
Pₜ₊₁ = Pₜ · exp(drift + σ · Z),  Z ~ N(0, 1)   (Z tiré par norm.ppf(uniforme))

La boucle répète ce pas days fois sur iterations trajectoires, chacune partant de la dernière clôture d’entraînement. Par exemple, avec un rendement logarithmique moyen de 0,0010 et σ = 0,02 (variance 0,0004), la dérive vaut 0,0008, et un tirage Z = 1 fait passer 100 à 100 · e^0,0208 ≈ 102,10. Ces valeurs sont illustratives ; le carnet estime les siennes sur AAPL.

Une subtilité : pour un mouvement brownien géométrique, la moyenne des rendements logarithmiques vaut déjà μ − σ²/2 ; retrancher encore ½ var compte la correction deux fois. Avec σ = 0,02, cela fait 0,0002 par jour, et sur l’horizon de 364 jours du carnet la trajectoire médiane baisse d’un facteur e^(−364 · 0,0002) ≈ 0,93, soit environ 7 %. monte_carlo_simulation_with_roulette ajoute, avec une probabilité de 5 % par jour, un choc supplémentaire de ±3σ à toutes les trajectoires à la fois.

Chaîne de Markov sur des tranches de prix. Les clôtures d’entraînement sont découpées en tranches de 10 $ avec pd.cut (0–10, 10–20, …, 190–200, et une tranche au-delà de 200). pd.crosstab(courant, suivant, normalize='index') compte combien de fois une clôture de la tranche i est suivie d’une clôture de la tranche j et divise par le total de la ligne : on obtient la probabilité de transition P(i → j). markov_chain_simulation parcourt ensuite la chaîne : depuis l’état courant, elle tire le suivant avec np.random.choice(états, p=ligne).

Un exemple jouet montre le décompte. Six clôtures de 148, 152, 155, 149, 151 et 158 tombent dans les tranches (140, 150], (150, 160], (150, 160], (140, 150], (150, 160], (150, 160]. Les cinq passages sont : 140→150 deux fois, 150→150 deux fois, 150→140 une fois. La ligne de (140, 150] va donc à 100 % vers (150, 160], et celle de (150, 160] reste sur place aux 2/3 et descend au 1/3.

La stratégie. MCMCStrategy.init lance les deux simulations une seule fois sur toute la durée du backtest ; next achète quand le dernier état simulé de la chaîne vaut 0 et, une fois en position, sort sur un stop 5 % sous l’entrée ou quand la clôture atteint un objectif tiré du dernier prix simulé d’une trajectoire au hasard.

flowchart TD
  H["Clôtures quotidiennes d’AAPL (FMP)"] --> S["Coupure au 2023-01-01"]
  S --> T["Clôtures d’entraînement"]
  T --> LR["Rendements logarithmiques → dérive, σ"]
  LR --> MC["1 000 trajectoires MBG sur la durée du backtest"]
  T --> B["Tranches de 10 $ → matrice de transition"]
  B --> MK["Suite d’états simulée depuis l’état 0"]
  MC & MK --> ST["MCMCStrategy.init"]
  ST --> N{"next() : sans position et dernier état == 0 ?"}
  N -->|oui| BUY["Achat, exécuté à l’ouverture suivante"]
  BUY --> EX{"clôture ≤ entrée × 0,95 ou clôture ≥ dernier prix d’une trajectoire ?"}
  EX -->|oui| SELL["Vente"]

Tel qu’écrit, les états sont des intervalles comme (0, 10], alors que la stratégie démarre la chaîne à l’entier 0 et compare le dernier état à 0. La recherche de l’état de départ et le test d’achat mélangent un entier et des étiquettes d’intervalles : la condition d’entrée ne se comporte pas comme le disent les commentaires.

4. Démarrage

Le README installe les bibliothèques avec :

pip install panda lxml bs4 httpx backtesting yfinance pandas_ta scipy rich TA-Lib

requirements.txt fige un ensemble plus restreint (backtesting, httpx, numpy, pandas, pandas-ta). Les carnets utilisent aussi Matplotlib et scikit-learn. Mettez votre propre clé Financial Modeling Prep dans la cellule FMP_API_KEY, puis ouvrez les carnets :

jupyter notebook backtest.ipynb

5. Guide du dépôt

  • mcmc.ipynb couvre la séparation des données, les variantes Monte Carlo, la chaîne de Markov, les graphiques et la régression linéaire.
  • backtest.ipynb reprend les simulations et exécute MCMCStrategy et BuyAndHoldStrategy.
  • proto.ipynb est le prototype sur des prix synthétiques.
  • output/MCMCStrategy.html est un graphique de backtest enregistré.
  • images/ contient les illustrations du README.
  • Algo Markov Chain Monte Carlo (MCMC)_.pdf est un document PDF conservé avec le code.

6. Fonctionnalités

  • historique quotidien d’AAPL depuis Financial Modeling Prep, coupé au 2023-01-01 ;
  • trajectoires de prix Monte Carlo, avec variantes à volatilité glissante et à chocs extrêmes ;
  • chaîne de Markov sur des tranches de 10 $ avec matrice de transition empirique ;
  • stratégie backtesting.py fondée sur les états simulés et des prix cibles simulés ;
  • référence d’achat-conservation sur les mêmes périodes ;
  • tendance linéaire ajustée sur l’indice des jours.

7. Limites

  • Malgré le nom, le code ne contient aucun échantillonneur de Monte Carlo par chaînes de Markov (comme Metropolis–Hastings) : les carnets combinent une simulation Monte Carlo directe et une chaîne de Markov distincte.
  • MCMCStrategy simule une seule fois, au début du backtest, sur toute la série et lit le dernier élément d’une liste d’états fixe : sa condition d’entrée ne change donc pas d’une barre à l’autre. La chaîne part en outre d’un état 0 codé en dur.
  • La matrice de transition ne couvre que les clôtures de 0 à 200, avec une seule tranche ouverte au-dessus.
  • Une clé d’API FMP est écrite dans les carnets ; remplacez-la par la vôtre.
  • La commande d’installation du README contient panda au lieu de pandas, et requirements.txt ne liste pas tous les imports.
  • Les carnets ne conservent pas les résultats des backtests, et ces résultats dépendent de tirages aléatoires sans graine fixe (sauf dans proto.ipynb).

8. Sources

9. Pipeline CI/CD

Aucun pipeline CI/CD dans le dépôt. Le code se construit et se lance à la main, comme décrit plus haut.

Généré à partir du code au commit 96c96e2.

10. Schéma de déploiement

Mermaid Schéma de déploiement
flowchart LR
  repo[("Dépôt GitHub")]
  local["Poste local<br/>Python"]
  repo -->|"cloner et lancer"| local

Le dépôt ne contient ni Dockerfile, ni fichier Compose, ni configuration d’hébergement : le code s’exécute sur le poste qui le clone.

11. Dépendances externes

5 paquets déclarés (5 à l’exécution, 0 pour le développement) dans requirements.txt.

Tableau des paquets 5
Dépendances externes
PaquetVersionUsageRôleRegistre
backtesting==0.3.3exécutionTestspypi.org
concurrent-futures==1.3.0exécution—pypi.org
numpy==1.26.0exécutionAnalyse de donnéespypi.org
pandas==1.3.5exécutionAnalyse de donnéespypi.org
pandas-ta==0.3.15exécutionAnalyse de donnéespypi.org

12. Glossaire

Dépôt

Les fichiers source, la configuration et l’historique versionné d’un projet.

README

Le document d’entrée du dépôt, qui présente généralement son rôle et son installation.

Dépendance

Une bibliothèque, un outil ou un service nécessaire à la compilation ou à l’exécution d’un composant.

API

Une interface par laquelle des composants logiciels échangent des requêtes et des résultats. Une API n’utilise pas nécessairement HTTP.

HTTP

Un protocole de requête et réponse utilisé par les navigateurs et services web. Une requête comprend une méthode, un chemin, des en-têtes et parfois un corps.

Port publié

Un port de l’hôte associé au port d’un service dans un conteneur. Sa publication peut rendre le service accessible hors du réseau des conteneurs.

Interface en ligne de commande

Une interface textuelle où les commandes et arguments choisissent les opérations. Les codes de retour permettent aux scripts de détecter un succès ou un échec.

Mermaid

Un langage de diagrammes textuel. Les nœuds et liens décrivent un modèle ; le diagramme n’exécute pas le projet.

Maillage

Une surface représentée par des sommets et des éléments reliés, souvent des triangles. Sa géométrie est distincte de son matériau ou de sa texture.

13. Références

  1. AlgoETS. (2026, 5 novembre). MarkokChainMonteCarlo. [Software repository] github.com.
  2. AlgoETS. (2026, 5 novembre). README. [Source file or documentation] github.com.
  3. AlgoETS. (2026, 5 novembre). mcmc.ipynb. [Source file or documentation] github.com.
  4. AlgoETS. (2026, 5 novembre). backtest.ipynb. [Source file or documentation] github.com.
  5. AlgoETS. (2026, 5 novembre). proto.ipynb. [Source file or documentation] github.com.

Les sources sans date de publication indiquent la date de leur dernière vérification, le 5 novembre 2026. Les liens des fichiers conservent la révision inspectée lorsqu’elle est disponible.