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.
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.
- 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
- Installer les paquets de la commande pip du README et mettre sa propre clé dans la cellule FMP_API_KEY.
- Ouvrir backtest.ipynb et télécharger l’historique d’AAPL avec get_historical_price_full_stock.
- Couper les données au 2023-01-01 et construire la matrice de transition des tranches de prix sur la première partie.
- Créer les objets Backtest de MCMCStrategy et BuyAndHoldStrategy sur les deux périodes et appeler run().
- 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.ipynbcouvre la séparation des données, les variantes Monte Carlo, la chaîne de Markov, les graphiques et la régression linéaire.backtest.ipynbreprend les simulations et exécuteMCMCStrategyetBuyAndHoldStrategy.proto.ipynbest le prototype sur des prix synthétiques.output/MCMCStrategy.htmlest un graphique de backtest enregistré.images/contient les illustrations du README.Algo Markov Chain Monte Carlo (MCMC)_.pdfest 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.
MCMCStrategysimule 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
pandaau lieu depandas, etrequirements.txtne 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
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
- AlgoETS. (2026, 5 novembre). MarkokChainMonteCarlo. [Software repository] github.com.
- AlgoETS. (2026, 5 novembre). README. [Source file or documentation] github.com.
- AlgoETS. (2026, 5 novembre). mcmc.ipynb. [Source file or documentation] github.com.
- AlgoETS. (2026, 5 novembre). backtest.ipynb. [Source file or documentation] github.com.
- 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.