From 05f4a1e1cb87cb291b247f30e9e7dbe26f541b13 Mon Sep 17 00:00:00 2001 From: Laurent VOLFF Date: Mon, 12 Oct 2026 21:08:11 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20plan=20de=20migration=20vers=20la=20m?= =?UTF-8?q?=C3=A9thode=20d'achat=20sur=20pullback=20(d=C3=A9cision=20utili?= =?UTF-8?q?sateur=20du=202026-10-12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migration complète décidée par l'utilisateur : méthode de Martin Luk traduite en règles mécaniques journalières sur les actions US disponibles sur Trading 212 (6 898 `_US_EQ` relevées le 2026-10-12). LLM et TimesFM deviennent classement et veto des candidats. - docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md : règles, banc portefeuille, portes de passage, rôle de l'IA (journal A/B), exécution T212, phases et PR. - memory-bank : nouveau contrat (29 critères, remplace celui du 2026-08-19), features F-42 → F-51, progress et log (y compris les entrées d'audit du 2026-10-12 restées locales). - AGENTS.md : bandeau de migration ; ancien plan du 2026-09-29 marqué remplacé. Aucun code modifié. Le scheduler démo continue de tourner sur l'ancien pipeline. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 2 + ...AN_AMELIORATION_PASSAGE_REEL_2026-09-29.md | 4 + docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md | 222 ++++++++++++++++++ memory-bank/contract.md | 87 ++++--- memory-bank/feature_list.json | 91 ++++++- memory-bank/log.md | 51 ++++ memory-bank/progress.md | 53 ++++- 7 files changed, 454 insertions(+), 56 deletions(-) create mode 100644 docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md diff --git a/AGENTS.md b/AGENTS.md index 92842d3..a0c7c8e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,8 @@ This file gives future AI agents (Kilo, Codex, Copilot, etc.) the minimum contex **Project in one paragraph** — Python 3.12 trading-decision pipeline. Multi-model ensemble (Scikit-Learn, TimesFM 3.0, TensorTrade PPO, NexusAI-Client unified cloud LLMs for text + vision + oil fundamentals + web research, sentiment, Vincent Ganne model) orchestrated by `main.py`. Outputs to `trading_journal.csv`, with optional Trading 212 demo/live execution via `--t212`. Virtualenv managed by `uv`. See `README.md` for the full feature list. +> **⚠️ Migration in progress (user decision, 2026-10-12)** — the project is being migrated, in full, to a mechanical daily version of Martin Luk's **pullback-buying method** on US stocks tradable on Trading 212 (momentum screen → tightening consolidation → support/AVWAP → buy-stop over the setup day's high, ≤ 3 % stop, 0.5 % risk per trade, partial exits at 3R/5R, EMA 9 trail). LLMs and TimesFM become rankers/vetoes of the screener's candidates and never create a trade. Plan: `docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md`; contract: `memory-bank/contract.md`. It **supersedes** the 2026-09-29 core/sleeve plan (do not extend PR #106, the ETF ensemble, or the uncommitted "swing" mode). **No execution code before the portfolio backtest gate (plan §2.1) passes**, and the current demo scheduler keeps running the old ETF pipeline until phase 5. + --- ## 1. Deterministic Memory: The Four-File Discipline diff --git a/docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md b/docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md index a8d951b..79ff9c4 100644 --- a/docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md +++ b/docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md @@ -1,5 +1,9 @@ # Plan d'amélioration : passage en réel (30 k€, horizon moyen/long terme) +> **Remplacé le 2026-10-12** par `docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md` (décision de l'utilisateur : migration +> complète vers la méthode d'achat sur pullback). Ce document reste comme historique ; ses constats (§1) et le +> banc de la phase 1 restent valables. + **Date :** 2026-09-29. **Statut :** proposition, aucun code modifié. **Base factuelle :** run démo T212 n° 2 (03/09 → 29/09/2026). Sources : `trading_journal.csv` (477 lignes), `trading.log`, `scheduler.log`, `trading_history.db`, `model_performance.db`, `performance_monitor.db`, `t212_portfolio_state.json`, caches parquet et code source. **Objectif utilisateur :** gagner réellement de l'argent sur le moyen/long terme avec **30 k€ de capital réel de départ**. diff --git a/docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md b/docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md new file mode 100644 index 0000000..4beb35b --- /dev/null +++ b/docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md @@ -0,0 +1,222 @@ +# Plan de migration : méthode « achat sur pullback » (2026-10-12) + +> **Décision de l'utilisateur du 2026-10-12 : migration complète du projet** vers la méthode d'achat sur pullback +> décrite par Martin Luk (fil @OtherSideBJ du 2026-10-12). Univers : tout ce qui est facilement disponible sur +> Trading 212, avec une grosse partie sélection, suivi et choix. Déclencheur d'entrée : **journalier**. LLM et +> TimesFM : placés là où ils servent le mieux la nouvelle méthode. +> +> Ce plan **remplace** `docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md` (cœur Nasdaq-100 à 90 % sans stop, +> poche active de 10 %, cadence hebdomadaire, satellite pétrole). Il ne touche pas au scheduler démo en cours : +> l'ancien pipeline tourne jusqu'à la bascule (phase 5). + +--- + +## 0. Ce que l'on sait de la méthode, et ce que l'on ne sait pas + +- **La source n'est pas une preuve.** Le rendement de 969,8 % est celui du gagnant d'un concours (US Investing + Championship 2025, catégorie actions) sur un an : sur des milliers de participants, le meilleur résultat dit peu + de l'espérance d'une règle. C'est l'effet survivant signalé par la réponse du fil : un test sur plus de 70 000 + pullbacks en actions chinoises donne environ 45 % de trades gagnants, et le gain vient surtout de la coupe + rapide des pertes. +- **La méthode est discrétionnaire** (lecture de graphiques, thèmes « populaires », déclencheur sur bougie de + 1 à 15 min). Ce plan la traduit en **règles mécaniques journalières**. Le banc mesure cette traduction, pas + Martin Luk. +- **Comme toute règle de ce projet, elle doit battre le buy & hold du Nasdaq-100**, nette de frais et + d'impôt, hors échantillon. C'est le coût d'opportunité réel : l'alternative passive reste disponible + à tout moment. Si elle échoue au banc (phase 3), on ne la passe pas en réel. + +## 1. Les quatre étapes traduites en règles + +Paramètres par défaut, puis **variantes pré-enregistrées** (les seules autorisées au calibrage, pour limiter le +surapprentissage ; le nombre total de variantes alimente le Sharpe déflaté du banc). + +### 1.1 Univers (« tout ce qui est facilement disponible sur T212 ») + +- Source : `GET /equity/metadata/instruments` (relevé du 2026-10-12, compte démo) : 18 473 instruments, dont + **12 168 actions** : 6 898 en USD (`XXX_US_EQ`), 3 140 en EUR, 1 401 en GBX, 542 en CAD, 134 en CHF. +- **U1 (phases 1 à 6) : actions US `_US_EQ`.** La correspondance avec Yahoo est directe (`AAPL_US_EQ` → `AAPL`, + avec les cas `BRK.B` → `BRK-B` à traiter). C'est le vivier de la méthode (momentum, thèmes, liquidité). +- U2 (après la démo, optionnel) : actions européennes via correspondance ISIN → symbole Yahoo (pas de frais de + change en EUR). Hors périmètre de ce sprint. +- Filtre de liquidité, recalculé chaque jour : cours ≥ 5 $ (variante 3 $), volume en dollars moyen sur 20 jours + ≥ 20 M$ (variante 10 M$), au moins 252 séances d'historique. Instruments non `STOCK` exclus. + +### 1.2 Étape 1 : sélection des actions fortes (screener) + +- Rendements à 21, 63 et 126 séances (1, 3 et 6 mois). +- Retenue si **au moins un horizon ≥ +30 %** et rang centile ≥ 75 sur cet horizon dans l'univers liquide du jour + (top 25 % ; variantes 70 et 80). +- **Thèmes** : nombre d'actions fortes par industrie (champ industrie Yahoo, mis en cache). Dans la version de + base, ce compte sert de bonus de classement. Variante : une industrie doit compter au moins 3 actions fortes. + +### 1.3 Étape 1 (suite) : consolidation qui se renforce + +Calculée sur les 10 à 30 dernières séances après le plus haut récent : + +- **Plus bas ascendants** : les deux derniers creux pivots (fractal à 2 barres) montent. +- **Volatilité qui se resserre** : ATR(5) / ATR(20) < 0,8 (variante 0,7). +- **Moyennes** : EMA 9 et EMA 21 plates ou montantes (pente sur 5 séances ≥ 0), EMA 21 > EMA 50, clôture + ≥ EMA 21 × 0,98. +- **Exclusion** : plus hauts et plus bas descendants avec clôture sous des moyennes descendantes (le cas « hors + critère » de la source). + +### 1.4 Étape 2 : zone de support et signal + +- Niveaux : EMA 9, 21 et 50 ; **AVWAP ancré au plus haut de la consolidation** ; anciens plus hauts pivots ; + gaps non comblés. +- Le jour D est un **jour de setup** si son plus bas touche un niveau à 1,5 % près et si la clôture repart au-dessus + (rebond). Score de confluence = nombre de niveaux dans la zone (≥ 2 = zone forte). +- **Déclencheur journalier** : ordre d'achat stop au **plus haut de D** (+ 1 tick), valable la séance D+1 + (variante : 3 séances, ré-ancré chaque jour). Si D+1 ouvre au-dessus du déclencheur, l'achat se fait à + l'ouverture. Si D+1 casse le plus bas de D avant le déclenchement, le setup est annulé (« le prix traverse le + support sans rebond, on attend »). + +### 1.5 Étape 3 : stop et taille, avant l'ordre + +- **Stop** = plus bas de D. Distance d = (entrée − stop) / entrée. **Trade ignoré si d > 3 %** (variante 4 %). En + journalier, cette règle sélectionne naturellement les jours à faible amplitude, ce qui rejoint la contraction + de volatilité. +- **Taille** = (0,5 % de l'équité) / (entrée − stop) actions, avec plafond de 25 % de l'équité par ligne, pas de + levier (exposition totale ≤ 100 %), **risque ouvert total ≤ 3 %** de l'équité (environ 6 lignes). Avec un stop + à 3 %, une ligne pèse environ 17 % du compte. +- Pas d'entrée dans les 5 séances avant une publication de résultats, si la date est connue (un gap de résultats + traverse le stop et fait perdre bien plus que 1R). + +### 1.6 Étape 4 : sorties + +- **1/3 vendu à 3R, 1/3 à 5R** (R = entrée − stop initial). +- Reste : **clôture sous l'EMA 9 → vente à l'ouverture suivante**. +- Variantes : stop remonté au prix d'entrée après 3R ; allègement sur extension (clôture > EMA 9 + 2 × ATR) ; + filtre de marché (« si le marché est fort ») : entrées autorisées seulement si le Nasdaq-100 clôture au-dessus + de son EMA 21. +- Le stop initial reste en place chez le broker jusqu'à la sortie (GO-gate 2 redevient la règle pour **toutes** + les positions). + +## 2. Le banc (phase 3) : la porte avant tout code d'exécution + +Le banc actuel (`src/backtest`) rejoue une exposition 0..1 sur un seul actif. La méthode demande un **moteur de +portefeuille multi-actions** : + +- **Événementiel journalier, sans regard vers le futur** : les décisions de D utilisent les données ≤ clôture D. + Exécution de D+1 sur OHLC : entrée à max(ouverture, déclencheur) si le plus haut ≥ déclencheur ; stop exécuté à + min(ouverture, stop) si le plus bas ≤ stop (le gap baissier est payé en entier). **Si l'entrée et le stop + tombent le même jour, on suppose le pire** (entrée puis stop). Les objectifs 3R/5R sont exécutés au niveau + exact, ou à l'ouverture si elle les dépasse. +- **Frais** : change T212 de 0,15 % par sens sur les actions en USD, plus 10 points de base de spread et de + glissement par sens (variantes 5 et 25). Équité tenue en EUR (EURUSD quotidien). **PFU de 30 %** sur les + plus-values nettes de l'année. +- **Références** : buy & hold Nasdaq-100 en EUR (SXRV.DE), buy & hold S&P 500 en EUR, règle MA200 sur le + Nasdaq-100. +- **Contrôles** : (a) entrées au hasard dans le même univers momentum, avec les mêmes stops et sorties. Ce + contrôle teste si les étapes 1.3 et 1.4 ajoutent quelque chose. (b) « momentum seul » : étape 1.2 et sorties, + sans setup. +- **Biais du survivant** : la liste T212 et Yahoo ne contiennent que les actions cotées aujourd'hui (les faillites + et rachats ont disparu). Le résultat sur U1 est donc **optimiste**. Pour le mesurer, le même banc est rejoué sur + un **univers à la date** (composition historique du S&P 500 et du Nasdaq-100, source publique à choisir avec + l'utilisateur). Les résultats sont aussi publiés année par année. +- **Walk-forward** : calibrage des variantes sur 2015-2020, **test sur 2021 → 2026-10** (2022 baissier inclus), + sans aucun réglage sur la fenêtre de test. Le Sharpe déflaté et le bootstrap apparié sont déjà dans + `src/backtest/metrics.py`. +- **Sortie** : `docs/BACKTEST_PULLBACK_.md` avec espérance en R par trade, taux de réussite, gain et perte + moyens en R, trades par an, exposition moyenne, CAGR, Sharpe, drawdown maximal, frais et impôt payés. + +### 2.1 Portes de passage proposées (à valider par l'utilisateur avec ce plan) + +| Porte | Condition | +|---|---| +| **Banc → construction de l'exécution** | Sur la fenêtre de test, nette de frais et d'impôt : CAGR **et** Sharpe > buy & hold Nasdaq-100 EUR ; drawdown maximal ≤ 35 % (seuil d'alerte décidé le 2026-09-29) ; espérance ≥ +0,25 R par trade sur au moins 150 trades ; contrôle « entrées au hasard » battu (bootstrap, p < 0,05) ; résultat encore positif sur l'univers à la date. | +| Échec au banc | **Pas de passage en réel.** On peut seulement explorer les variantes pré-enregistrées (une seule fois, comptées dans le Sharpe déflaté), sinon retour à l'option passive. | +| **Démo → réel** | Au moins 8 semaines **et** 40 trades en démo, avec un glissement et un taux d'exécution des ordres stop compatibles avec les hypothèses du banc (R moyen réalisé dans l'intervalle de confiance du banc). | +| **Montée en charge** | Réel à 0,25 % de risque par trade pendant 4 semaines, puis 0,5 %. | + +## 3. Rôle des LLM et de TimesFM dans la nouvelle méthode + +La règle mécanique **propose** ; l'IA **classe et met son veto**, elle ne crée jamais un trade. + +| Brique | Nouveau rôle | Mesure | +|---|---|---| +| **LLM vision** (`get_visual_llm_decision`) | Le « chartiste » de l'étape 1 (« ouvrir les graphiques un par un ») : pour les 15 meilleurs setups du jour, graphique hebdo + journalier (EMA 9/21/50, AVWAP, niveaux) → JSON `{score 0-10, plus_bas_ascendants, contraction, qualite_support, veto, analyse}`. | Démo, en avant : un LLM a déjà vu le passé, un backtest de son filtre serait truqué. | +| **LLM texte + recherche web** (`web_researcher`, morning brief) | Thèmes et catalyseurs : résume les thèmes chauds à partir des industries du set momentum et des actualités ; veto sur catalyseur négatif (augmentation de capital, révision des prévisions, résultats imminents). | Démo, en avant. | +| **TimesFM 3.0** | Variable de classement : médiane de prévision à 10 séances et écart des quantiles rapportés au R du setup. | Banc, **seulement sur la période postérieure à ses données d'entraînement** ; démo ensuite. | +| **Weekend Council** | Revue hebdomadaire des trades (R réalisés, respect des règles, glissement par rapport au plan). Plus de vote. | Qualitatif. | +| **Morning brief** | Contexte de marché (régime) et actualité de la nuit sur les positions ouvertes. | Qualitatif. | + +**Protocole A/B** : chaque candidat est journalisé avec la décision « règle seule » et la décision « règle + IA ». +Le filtre IA n'est gardé que s'il améliore l'espérance en R sur au moins 100 candidats journalisés. + +**Retirés du chemin d'exécution** (le code reste jusqu'à la phase 6, pour permettre un retour arrière) : +classic, grebenkov, oil_bench et client EIA, hmm, tensortrade, vincent_ganne, sentiment, gestionnaire de poids +adaptatifs et moteur de décision d'ensemble sur ETF. + +## 4. Exécution sur Trading 212 (phases 4 et 5, seulement après la porte du banc) + +- **Plan nocturne** (après la clôture US) : mise à jour des données, screener, setups, classement IA, plan + d'ordres (déclencheur, stop, quantité, niveaux 3R et 5R) écrit dans `data_cache/pullback_plan_.json`, + puis résumé dans Nextcloud Talk. +- **Entrées** : ordres stop d'achat (`POST /equity/orders/stop`, quantité positive) valables la séance, posés à + l'ouverture US. **À vérifier par une sonde démo, avec le feu vert de l'utilisateur** : achat stop accepté, + réservation du cash, validité `DAY`, exécution sur gap. Repli : déclenchement logiciel par la boucle de suivi. +- **Après exécution** (confirmée chez le broker, GO-gate 3) : ordre stop de vente GTC au stop du plan (GO-gate 2). + La fenêtre sans stop entre l'exécution et la pose du stop est au plus d'un intervalle de suivi (5 min). Ce risque + est accepté et documenté. +- **Ventes partielles à 3R et 5R** : côté logiciel, à chaque passage de la boucle de suivi. On annule le stop, on + vend la partie, puis on replace le stop sur le reste : c'est le schéma de `_execute_sell_order`, car un stop + réserve les titres et empêche un ordre limite de vente sur les mêmes titres. +- **Suivi à l'EMA 9** : évalué après la clôture ; vente au marché à l'ouverture suivante. +- **Portefeuille multi-positions** : l'équité vient du compte (T212 summary), pas de budgets par ticker + (`INITIAL_BUDGETS` disparaît) ; P&L FIFO par position ; journal par trade avec R. +- **Scheduler** : séance US de 15:30 à 22:00, heure de Paris, calculée dans le fuseau `America/New_York` (les + passages à l'heure d'été ne tombent pas le même jour en Europe et aux États-Unis) ; boucle de suivi toutes les + 5 min ; plan nocturne ; morning brief ; council hebdomadaire. Verrou, watchdog et alertes inchangés. +- **Débit API** : environ 20 POST stop ou limite par jour au maximum, très en dessous de la limite (1 toutes les + 2 s). `GET /equity/orders` (1 toutes les 5 s) est regroupé par passage. + +## 5. Phases et PR + +| Phase | Contenu | PR | +|---|---|---| +| 0 | Ce plan, contrat gelé, feature list, mémoire du projet | celle-ci | +| 1 | Univers T212 → Yahoo (U1), filtre de liquidité ; stockage journalier en masse (Parquet, mise à jour incrémentale) | 1 | +| 2 | Règles pullback en fonctions pures (screener, consolidation, support, déclencheur, risque, sorties) + tests | 1 | +| 3 | Moteur de portefeuille multi-actions, références, contrôles, univers à la date, rapport → **porte** | 1 à 2 | +| 4 | Filtres IA (LLM vision, thèmes et catalyseurs, TimesFM) + journal A/B | 1 | +| 5 | Exécuteur T212 multi-positions + nouveau scheduler + sonde démo des ordres stop d'achat | 2 | +| 6 | Retrait de l'ancien ensemble du dépôt, documentation (README, AGENTS.md, guide API) | 1 | +| 7 | Démo de conformité (≥ 8 semaines, ≥ 40 trades), puis réel progressif | — | + +Les phases 1 à 3 ne touchent ni au scheduler démo ni à `src/t212_executor.py`. + +## 6. Ce qui change dans les décisions et les invariants + +- **Remplacé** : cœur Nasdaq-100 à 90 % sans stop, poche active de 10 %, cadence hebdomadaire, satellite pétrole + (2026-09-29 et 2026-09-30). La PR #106 (livres cœur/poche, `STRATEGY_MODE`) devient sans objet. Les + modifications « swing » non commitées du 2026-10-10 aussi. +- **Conservé** : GO-gates 1 (ordres non rejoués à l'aveugle), 2 (stop broker sur chaque position, de nouveau sans + exception), 3 (fill confirmé), 5 (pas de données synthétiques, données périmées refusées), 6 (verrou du + scheduler), 7 (équité FIFO) ; `write_db = not is_t212` ; « échec de lecture ≠ vide » ; régulation du débit ; + aucun secret dans git ni dans les journaux ; alerte de portefeuille à −35 % depuis le pic. +- **Sans objet ou à réécrire** : GO-gate 4 (seuils de vote sur la volatilité quotidienne des ETF), budgets par + ticker, liste `TICKERS` fixe, horaires du scheduler. + +## 7. Risques et limites + +- **Biais du survivant** dans l'univers actuel (mesuré par l'univers à la date, sans être annulé). +- **Le déclencheur intraday de la source n'est pas reproduit** : le journalier entre plus tard et avec un stop plus + large, donc avec un R moins bon que celui décrit. +- **Gaps et glissement** : une perte peut dépasser 1R (gap de résultats, nouvelle de nuit). Le banc le paie en + entier. +- **Frais** : environ 0,4 à 0,5 % par aller-retour (change et spread) pour un stop de 2 à 3 %, soit 15 à 20 % de + chaque R. +- **Concentration** : environ 6 lignes de 15 à 25 % du compte, toutes en actions US momentum, avec le risque de + change EURUSD en plus. +- **Fiscalité** : beaucoup de trades par an sur un compte-titres chez un courtier étranger, donc une déclaration à + préparer (taux de 30 % toujours à confirmer). +- **Filtre IA** : son apport ne se mesure qu'en avant, donc lentement. + +## 8. Questions ouvertes (non bloquantes pour les phases 1 à 3) + +1. Capital au démarrage réel (30 k€ selon l'objectif) et risque par trade (0,5 % comme la source ?). +2. Source publique de la composition historique S&P 500 et Nasdaq-100 pour le contrôle du biais du survivant + (téléchargement à valider au moment de la phase 3). +3. Actions européennes (U2) après la démo ? +4. Données intraday payantes plus tard, pour un déclencheur plus fin ? diff --git a/memory-bank/contract.md b/memory-bank/contract.md index 73560cf..aa99f72 100644 --- a/memory-bank/contract.md +++ b/memory-bank/contract.md @@ -1,57 +1,54 @@ -# Contrat de Validation — Sprint « GO-gates PROD » (2026-08-19) +# Contrat de Validation — Sprint « Migration pullback » (2026-10-12) > **Rôle** — Contrat de validation technique négocié entre la planification et l'évaluation. > Liste d'assertions strictes et testables. **Figé juste avant l'écriture de la première ligne de code** : > une fois le code démarré, ce contrat ne doit plus être modifié par le générateur. -> Contexte : remédiation des 7 GO-gates de l'audit indépendant `docs/AUDIT_PROD_INDEPENDANT_2026-08-19.md` -> en vue d'un nouveau run de 30 jours en démo T212. Ce contrat remplace celui du sprint précédent. +> Contexte : migration complète vers la méthode d'achat sur pullback (décision utilisateur du 2026-10-12), +> plan `docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md`. Ce contrat remplace celui du sprint « GO-gates PROD » +> (2026-08-19, consultable dans l'historique git). ## Critères d'Acceptation Automatisés -### GO-gate 1 — Timeout + idempotence des ordres (F-30) -- [ ] Critère 1 : `safe_request` applique un `timeout` par défaut (10 s) à toutes les requêtes, y compris les GET portefeuille. -- [ ] Critère 2 : Le POST d'ordre market transite par une fonction dédiée avec `timeout=15`. -- [ ] Critère 3 : Sur `RequestException`/timeout d'un POST d'ordre, la position broker est re-vérifiée (`GET /equity/positions`) AVANT tout retry — si la position est apparue (BUY) ou disparu (SELL), aucun re-POST n'émis. -- [ ] Critère 4 : Le retry sur 429/TooManyRequests reste autorisé (ordre rejeté = non exécuté). -- [ ] Critère 5 : Aucun chemin de code ne rejoue un POST d'ordre sans réconciliation intermédiaire. +### Univers et données (F-43, F-44) +- [ ] Critère 1 : L'univers U1 est construit depuis `GET /equity/metadata/instruments` et ne contient que des instruments `type == "STOCK"` à suffixe `_US_EQ`. Un instrument d'un autre type ou suffixe n'y entre jamais. +- [ ] Critère 2 : La correspondance T212 → Yahoo est déterministe et testée (`AAPL_US_EQ` → `AAPL`, classes d'actions `BRK.B` → `BRK-B`) ; un ticker non résolu est journalisé et exclu, jamais deviné. +- [ ] Critère 3 : Le filtre de liquidité du jour D n'utilise que des données ≤ D (cours ≥ 5 $, volume en dollars moyen 20 j ≥ 20 M$, ≥ 252 séances). +- [ ] Critère 4 : Le stockage journalier en masse est incrémental (seules les barres manquantes sont téléchargées) et refuse une série dont la dernière barre a plus de 3 jours ouvrés (GO-gate 5 conservé). +- [ ] Critère 5 : Aucune donnée synthétique n'est produite pour combler un trou ; une action sans données valides est exclue du jour. -### GO-gate 2 — Stop-loss mouvant + TP côté broker (F-31) -- [ ] Critère 6 : Le payload d'achat contient `stopLoss` = round(prix×0.90, 2) et `takeProfit` = round(prix×1.08, 2) (prix absolus). -- [ ] Critère 7 : Après fill confirmé, un ordre stop dédié `GOOD_TILL_CANCEL` (quantité négative = vente) existe pour la position ; son id et son prix sont persistés dans `state["active_position"]` (`stop_order_id`, `stop_price`). -- [ ] Critère 8 : Le ratchet ne déplace le stop broker que vers le HAUT (`desired > stop_price + 0.01`), cible `round(peak_price × 0.90, 2)`. -- [ ] Critère 9 : Si le DELETE du stop réussit mais le replacement échoue, un CRITICAL est loggé et un replacement à l'ancien niveau est tenté (jamais de position sans stop connu). -- [ ] Critère 10 : `sync_state_from_t212` réconcilie `stop_order_id`/`stop_price` depuis les ordres actifs broker (state survit aux redémarrages). +### Règles pullback (F-45) +- [ ] Critère 6 : Le screener retient une action si au moins un rendement à 21, 63 ou 126 séances est ≥ +30 % et si son rang centile sur cet horizon est ≥ 75 (paramètres exposés, valeurs par défaut testées). +- [ ] Critère 7 : La détection de consolidation exige des creux pivots ascendants, ATR(5)/ATR(20) < 0,8, des EMA 9 et 21 de pente ≥ 0, EMA 21 > EMA 50 et une clôture ≥ EMA 21 × 0,98 ; un cas « plus hauts et plus bas descendants sous moyennes descendantes » est rejeté (test dédié). +- [ ] Critère 8 : L'AVWAP est ancré au plus haut de la consolidation et égale Σ(prix typique × volume) / Σ volume depuis l'ancre (test numérique). +- [ ] Critère 9 : Un jour de setup exige un plus bas à ≤ 1,5 % d'au moins un niveau de support et une clôture au-dessus de ce niveau ; le déclencheur vaut le plus haut du jour de setup. +- [ ] Critère 10 : Le stop vaut le plus bas du jour de setup ; un setup dont la distance entrée-stop dépasse 3 % est ignoré. +- [ ] Critère 11 : La taille vaut floor((0,5 % × équité) / (entrée − stop)) au pas de quantité, plafonnée à 25 % de l'équité par ligne ; le risque ouvert total ne dépasse jamais 3 % et l'exposition totale jamais 100 %. +- [ ] Critère 12 : Les sorties vendent 1/3 à 3R et 1/3 à 5R, puis le reste à l'ouverture qui suit une clôture sous l'EMA 9. +- [ ] Critère 13 : Toutes les règles sont des fonctions pures de données ≤ D ; un test prouve qu'ajouter des barres futures ne change pas la décision de D. -### GO-gate 3 — Fill confirmé + prix réel (F-32) -- [ ] Critère 11 : Après 2xx sur un BUY, l'état et la DB ne sont écrits qu'après confirmation de la position broker (poll) ; `entry_price_etf` = `averagePricePaid` broker. -- [ ] Critère 12 : `insert_transaction` (BUY) enregistre le prix de fill réel (`averagePricePaid`), pas le prix signal Yahoo. -- [ ] Critère 13 : Fill non confirmé sous le délai → ERROR loggé, aucun write de state, aucune transaction DB. +### Banc portefeuille (F-46) +- [ ] Critère 14 : Le moteur exécute l'entrée à max(ouverture, déclencheur) et le stop à min(ouverture, stop) ; si l'entrée et le stop tombent le même jour, le stop est supposé touché après l'entrée. +- [ ] Critère 15 : Les frais par défaut sont 0,15 % de change + 10 pb de spread et de glissement par sens ; le PFU de 30 % est appliqué aux plus-values nettes annuelles ; l'équité est tenue en EUR. +- [ ] Critère 16 : Le rapport compare la stratégie au buy & hold Nasdaq-100 EUR, au buy & hold S&P 500 EUR, à la règle MA200, au contrôle « entrées au hasard » et au contrôle « momentum seul ». +- [ ] Critère 17 : Le calibrage n'utilise que 2015-2020 ; la fenêtre 2021 → fin des données n'est utilisée qu'en test (vérifié par un test qui lève une erreur si une variante est calibrée sur la fenêtre de test). +- [ ] Critère 18 : Le rapport publie l'espérance en R, le taux de réussite, les trades par an, le CAGR, le Sharpe, le Sharpe déflaté (nombre de variantes), le drawdown maximal, les frais et l'impôt payés, et les résultats année par année. +- [ ] Critère 19 : Le verdict de la porte du banc (plan §2.1) est calculé par le code et écrit dans le rapport ; aucune phase d'exécution réelle ne démarre sur un verdict négatif. -### GO-gate 4 — Unité de volatilité + seuils (F-33) -- [ ] Critère 14 : La volatilité passée au decision engine et au weight manager est **quotidienne** (plus de multiplication par √252). -- [ ] Critère 15 : `adaptive_thresholds` = {strong_buy: 0.4375, buy: 0.15, hold_upper: 0.05, hold_lower: -0.05, sell: -0.125, strong_sell: -0.5625} (équivalence 1/0.8 documentée en commentaire). -- [ ] Critère 16 : Un test de régression vérifie que l'amortissement régime (×0.8) n'est PAS appliqué pour une vol quotidienne de 0.02 (ETF calme). +### Filtres IA (F-47) +- [ ] Critère 20 : Le LLM vision reçoit au plus 15 candidats par jour et renvoie un JSON validé (`score`, `veto`, `analyse` obligatoires) ; une réponse invalide ou absente laisse la décision « règle seule » inchangée. +- [ ] Critère 21 : L'IA ne peut que classer ou mettre un veto : aucun trade n'est créé hors des candidats du screener (test dédié). +- [ ] Critère 22 : Chaque candidat est journalisé avec la décision « règle seule » et la décision « règle + IA » (journal A/B). -### GO-gate 5 — Données (F-34) -- [ ] Critère 17 : Aucune donnée macro synthétique/aléatoire n'est générée ni mise en cache (le bloc « Method 4 » est supprimé ; échec des sources → None + ERROR log). -- [ ] Critère 18 : Les caches macro (AV_/MULTI_/FRED_PDR_) ne sont servis que si âgés de ≤ 7 jours. -- [ ] Critère 19 : Le fallback cache de prix après échec de téléchargement n'est accepté que si le cache a ≤ 3 jours ; sinon exception → le cycle ne trade pas. - -### GO-gate 6 — Scheduler (F-35) -- [ ] Critère 20 : Une seconde instance du scheduler termine immédiatement (CRITICAL + exit non nul) quand `scheduler.lock` est détenu. -- [ ] Critère 21 : Un verrou périmé (> 2 h) est cassé automatiquement. -- [ ] Critère 22 : Une exception non `KeyboardInterrupt` dans l'itération de boucle est loggée et la boucle CONTINUE (le scheduler ne meurt plus). -- [ ] Critère 23 : Le Morning Brief est rattrapé s'il n'a pas encore été généré pour le jour en cours (plus de fenêtre 01:00-01:59 unique). - -### GO-gate 7 — Mesure du run (F-36) -- [ ] Critère 24 : Le state par ticker persiste `equity` = initial_budget + P&L réalisé (FIFO sur l'historique broker) + P&L latent. -- [ ] Critère 25 : Le journal CSV écrit une colonne `T212_Equity` alimentée par cette equity (plus le mélange position/cash `T212_Capital`). -- [ ] Critère 26 : En mode T212, `performance_monitor` reçoit le `portfolio_value` = equity réelle (plus la constante 1000 €), `active_positions` et `cash_balance` réels. +### Exécution T212 (F-48, F-49) +- [ ] Critère 23 : Chaque position ouverte a un stop GTC chez le broker, posé après la confirmation de l'exécution ; une position sans stop connu est un événement CRITICAL. +- [ ] Critère 24 : Une vente partielle annule le stop, vend la partie, puis replace le stop sur le reste ; si le replacement échoue, un stop d'urgence est tenté et un CRITICAL est journalisé. +- [ ] Critère 25 : Aucun POST d'ordre n'est rejoué sans réconciliation broker ; « échec de lecture ≠ vide » est conservé pour les positions et l'historique. +- [ ] Critère 26 : Les horaires de séance sont calculés dans le fuseau `America/New_York` (test sur les semaines de décalage de l'heure d'été). ### Non-régression -- [ ] Critère 27 : La suite mockée complète passe : 0 échec (196 tests préexistants + nouveaux). -- [ ] Critère 28 : Les invariants existants restent vrais : `write_db = not is_t212`, sentinelle win_rate −1.0, budgets 1000 €/ticker, `CYCLE_TIMEOUT` 40 min, annulation anti-thread-orphelin. -- [ ] Critère 29 : Aucun secret/DB/artefact runtime n'est ajouté à git (`.gitignore` inchangé en couverture). +- [ ] Critère 27 : La suite mockée complète passe (0 échec) à chaque PR. +- [ ] Critère 28 : Les phases 1 à 4 ne modifient ni `src/t212_executor.py` ni `schedule.py` (le scheduler démo actuel continue de tourner). +- [ ] Critère 29 : Aucun secret, base de données ou artefact runtime n'est ajouté à git ; aucun secret n'apparaît dans les journaux. ## Protocole d'Évaluation @@ -60,8 +57,8 @@ .venv\Scripts\python.exe -m pytest tests/ -q --basetemp=data_cache/test_tmp ``` *(ignorer les harness live : test_crawl4ai, check_*, bench_*, run_short_backtest, test_full_cycle)* -* **Sonde broker démo (avec feu vert utilisateur uniquement)** : `uv run python tests/check_t212_stops.py` → valide stopLoss/takeProfit attachés + ordre stop + DELETE sur compte démo. -* **Smoke** : `uv run main.py --ticker SXRV.DE --t212` → 1 cycle complet démo, vérifier dans `trading.log` : ordre (si signal), confirmation fill, stop broker, equity. -* **Comportement attendu** : tests 0 échec ; sonde OK ou fallback documenté ; smoke sans exception non gérée. +* **Banc** : rapport `docs/BACKTEST_PULLBACK_.md` produit par le code du dépôt (aucun chiffre écrit à la main). +* **Sonde broker démo (feu vert utilisateur uniquement)** : ordre stop d'achat, réservation du cash, validité `DAY`, stop de vente GTC après exécution. +* **Comportement attendu** : tests 0 échec ; verdict de porte calculé ; sonde OK ou repli documenté. -*Figé le 2026-08-19 avant la première ligne de code du sprint.* +*Rédigé le 2026-10-12 ; figé à la validation du plan par l'utilisateur, avant la première ligne de code.* diff --git a/memory-bank/feature_list.json b/memory-bank/feature_list.json index 5dc06da..f00f698 100644 --- a/memory-bank/feature_list.json +++ b/memory-bank/feature_list.json @@ -1,7 +1,7 @@ { "$comment": "Cartographie complète et structurée des fonctionnalités du projet. Source unique de vérité sur l'état des fonctionnalités. Généré le 2026-06-30 lors de la mise en place du système de mémoire déterministe (voir AGENTS.md §1). Mis à jour dès qu'une fonctionnalité change de statut.", "schema_version": "1.0", - "last_updated": "2026-10-03", + "last_updated": "2026-10-12", "features": [ { "id": "F-01", @@ -285,6 +285,95 @@ "dependencies": [ "F-40" ] + }, + { + "id": "F-42", + "name": "Plan de migration vers la méthode pullback (décision utilisateur 2026-10-12)", + "description": "Plan docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md, contrat gelé, portes de passage. Remplace le plan cœur Nasdaq-100 / poche 10 % du 2026-09-29.", + "status": "completed", + "dependencies": [] + }, + { + "id": "F-43", + "name": "Univers U1 : actions US Trading 212 → symboles Yahoo + filtre de liquidité", + "description": "Construction de l'univers depuis /equity/metadata/instruments (STOCK, _US_EQ), correspondance déterministe vers Yahoo, filtre cours/volume en dollars/historique recalculé chaque jour sans regard vers le futur.", + "status": "pending", + "dependencies": [ + "F-42" + ] + }, + { + "id": "F-44", + "name": "Stockage journalier en masse (OHLCV, Parquet incrémental)", + "description": "Téléchargement et mise à jour incrémentale des barres journalières de l'univers, refus des séries périmées, aucune donnée synthétique.", + "status": "pending", + "dependencies": [ + "F-43" + ] + }, + { + "id": "F-45", + "name": "Règles pullback en fonctions pures (screener, consolidation, support/AVWAP, déclencheur, risque, sorties)", + "description": "Traduction mécanique journalière des quatre étapes de la méthode (plan §1), paramètres par défaut et variantes pré-enregistrées.", + "status": "pending", + "dependencies": [ + "F-44" + ] + }, + { + "id": "F-46", + "name": "Banc portefeuille multi-actions + références, contrôles, univers à la date → porte de passage", + "description": "Moteur événementiel journalier (OHLC, gaps payés, pire cas intrajournalier), frais T212 et PFU, comparaison au buy & hold Nasdaq-100/S&P 500 et MA200, contrôles hasard et momentum seul, walk-forward 2015-2020 / 2021+, verdict calculé.", + "status": "pending", + "dependencies": [ + "F-45" + ] + }, + { + "id": "F-47", + "name": "Filtres IA : LLM vision (chartiste), thèmes et catalyseurs, TimesFM (classement) + journal A/B", + "description": "L'IA classe et met son veto sur les candidats du screener sans jamais créer de trade ; chaque candidat est journalisé règle seule vs règle + IA.", + "status": "pending", + "dependencies": [ + "F-46" + ] + }, + { + "id": "F-48", + "name": "Exécuteur T212 multi-positions (achat stop, stop GTC, ventes partielles 3R/5R, suivi EMA 9)", + "description": "Portefeuille dimensionné sur l'équité du compte, stop broker sur chaque position, sonde démo des ordres stop d'achat avec feu vert utilisateur.", + "status": "pending", + "dependencies": [ + "F-46" + ] + }, + { + "id": "F-49", + "name": "Scheduler séance US (America/New_York), plan nocturne, boucle de suivi 5 min, alertes", + "description": "Remplace la boucle 30 min 08:30-18:00 sur ETF ; verrou, watchdog et alertes Nextcloud conservés.", + "status": "pending", + "dependencies": [ + "F-48" + ] + }, + { + "id": "F-50", + "name": "Retrait de l'ancien ensemble ETF du dépôt + documentation", + "description": "Suppression des modèles et du moteur d'ensemble retirés du chemin d'exécution, réécriture README/AGENTS.md/guide API.", + "status": "pending", + "dependencies": [ + "F-49" + ] + }, + { + "id": "F-51", + "name": "Démo de conformité puis passage en réel progressif", + "description": "≥ 8 semaines et ≥ 40 trades en démo conformes au banc, puis réel à 0,25 % de risque par trade pendant 4 semaines, puis 0,5 %.", + "status": "pending", + "dependencies": [ + "F-47", + "F-50" + ] } ] } diff --git a/memory-bank/log.md b/memory-bank/log.md index 567fa5a..b8f3b60 100644 --- a/memory-bank/log.md +++ b/memory-bank/log.md @@ -512,4 +512,55 @@ Un correctif anti-biais (ADR-002) peut créer un biais **symétrique** s'il sur- - Commit `9b1d7cc` poussé sur `origin/main` (22 fichiers synchronisés). - Working tree 100% propre, prêt pour redémarrage de `start_scheduler.bat`. +## [2026-10-10] eval | Analyse globale du système en production (état scheduler, portefeuille T212, Weekend Council et signaux) +- **Scheduler & Processus** : Nouveau processus `schedule.py` actif (PID 3324, verrou `scheduler.lock` acquis à 22:20). Cycles nominaux exécutés toute la semaine pour `['SXRV.DE', 'QDVF.DE']`. +- **Morning Brief & Conseil du week-end** : Générés avec succès le 10/10 à 01h00-01h03. + - Morning Brief : Marché pétrole neutre/bullish fondamentalement mais sous SMA20 ($91.66 vs $94.40) ; NDX haussier mais surachat RSI ~73.4. + - Weekend Council : Verdict HOLD défensif (Juge : HOLD SXRV 0.7, HOLD QDVF 0.7, SELL CRUDP 0.8). +- **Portefeuille T212 (Démo)** : + - `SXRVd_EQ` : Position active saine (+30.36 € / +3.02% latent, P&L réalisé +2.33 €). Stop suiveur broker GTC actif @ 1440.89 €. + - `QDVFd_EQ` : 0 position, 1000.00 € en cash (protection active face aux signaux SELL/HOLD du vendredi). + - `OD7Fd_EQ` : 0 position, purgé. +- **Ensemble Décisionnel** : Pivot QDVF.DE actif, modèles zombies hermétiquement neutralisés à 0.0, 0 erreur d'exécution. + +## [2026-10-10] fix | Transition vers la gestion Swing 30k€ : levée des verrous destructeurs et validation mathématique +- **Diagnostic quantitatif par backtest réel** : + - Sur `SXRV.DE`, les sorties héritées (TP 8%, trailing 3%, time-stop 15j, garde de perte -0.2%) provoquaient 85 ventes/an et faisaient chuter le CAGR de 21.8% à 7.1% (Sharpe 0.46). + - Sur `QDVR.DE` (énergie actions), le CAGR chutait de 12.5% à 4.1% (83 ventes/an). +- **Implémentation de `STRATEGY_MODE=swing` (`src/t212_executor.py`)** : + - `TAKE_PROFIT_TARGET` désactivable/None : on laisse courir les rallyes haussiers sans plafond arbitraire de +8%. + - `MAX_HOLDING_DAYS` désactivable/None : fin du time-stop à 15 jours qui coupait les positions gagnantes. + - `TRAILING_STOP_PCT` porté de 3% à 10% : aligné sur le ratchet broker peak×0.90, éliminant les sorties sur bruit de 1-2 jours. + - `ENABLE_SELL_LOSS_GUARD` désactivable : l'IA peut sortir sur signal de retournement fort sans être bloquée par la garde -0.2%. + - `T212_BUDGET_PER_TICKER` : support d'un budget par ticker paramétrable (défaut 15 000 € en mode swing pour 30k€ au total). +- **Preuve par backtest sur séries réelles** : + - `SXRV.DE` (MA200 + Swing 10%) : **CAGR 19.5%** (vs 7.1% legacy), **MaxDD -15.8%** (vs -26.7% B&H), **Sharpe 1.28** (bat le Buy & Hold à 1.12), **4 ventes en 4 ans** au lieu de 85. + - `QDVR.DE` (Swing 10%) : **CAGR 13.6%** (bat le Buy & Hold à 12.5% et legacy à 4.1%), **MaxDD -21.3%** (vs -23.9% B&H), **Sharpe 0.95** (bat B&H à 0.87), **2 ventes** seulement. +- **Validation** : + - Nouveau test unitaire `tests/test_swing_mode.py`. + - Suite de tests complète : **433 passed, 3 skipped, 0 failed** (100% succès). + + +## [2026-10-12] eval | Audit du démo T212 en cours (Claude) : état, journal, logs, banc +- Scheduler sain (PID 3324 depuis le 10/10 22:20, cycles OK) ; mode legacy (STRATEGY_MODE absent de .env) : les modifs swing non commitées sont inertes au runtime. +- **Achats QDVF.DE tous rejetés le 08/10** (13 × BUY:not-filled) : 11 × quantity-precision-mismatch (4 décimales, T212 en accepte 3), 2 × insufficient-free (achat à 99 % du cash, T212 plafonne vers 95 %). +- **Clés d'API en clair dans trading.log*** : ~1 100 lignes httpx `?key=` (gemini_free, désormais refusée en 401) + 4 `apikey=` Alpha Vantage. Logs gitignorés : rien de publié. +- **Vote llm_visual = bruit** : gemini_free mort, repli sur nvidia llama-3.2-11b-vision ; le vote bascule BUY/SELL à 44 % des cycles et fait basculer le signal final SXRV à 46 %. +- **QDVR.DE n'est pas énergie** (iShares MSCI USA SRI) ; QDVF.DE jamais backtesté ; « +15,4 % sur 11 ans » faux (+10,1 %/an, DD −65,8 %). Chiffres « swing » du 10/10 non reproduits (voir progress.md). + +## [2026-10-12] fix | PR ouvertes (travail dans un clone temporaire : le scheduler tourne dans ce checkout) +- #107 fix(t212) : précision QDVFd_EQ = 3, achat plafonné à 95 % du cash, quantité arrondie à l'inférieur (+5 tests). +- #108 fix(logs) : SecretRedactingFilter sur les handlers de setup_environment, redact_secrets couvre les paramètres d'URL (+6 tests). +- #109 fix(backtest) : QDVF.DE remplace QDVR.DE, lignes « sorties swing », rapport 2026-10-12, docs corrigées (+3 tests). +- Suites complètes vertes sur chaque branche (435 à 438 passed, 3 skipped). Rien de modifié dans le checkout PROD hors memory-bank. + + +## [2026-10-12] init | Migration complète vers la méthode d'achat sur pullback (décision utilisateur) +- Demande utilisateur : « MIGRATION du projet » vers la méthode de Martin Luk (fil @OtherSideBJ du 2026-10-12). +- Choix utilisateur : migration complète (remplace le plan cœur Nasdaq-100 / poche 10 % du 2026-09-29) ; univers « tout ce qui est facilement dispo sur T212 » ; LLM et TimesFM « au mieux » ; déclencheur journalier. +- Univers mesuré (`GET /equity/metadata/instruments`, démo, lecture seule) : 18 473 instruments, 12 168 actions, dont 6 898 `_US_EQ` en USD. +## [2026-10-12] gen | Phase 0 : plan, contrat et features (F-42 → F-51) +- `docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md` : règles mécaniques journalières, banc portefeuille et portes de passage, rôle des LLM et de TimesFM (classement et veto, journal A/B), exécution T212, phases et PR. +- `memory-bank/contract.md` : 29 critères, remplace le contrat GO-gates du 2026-08-19 ; figé à la validation du plan par l'utilisateur. +- Travail dans un clone temporaire : le scheduler démo tourne dans le checkout, rien n'y est modifié hors memory-bank. diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 278b2c6..3205fa5 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -6,14 +6,25 @@ > Voir `AGENTS.md §1` pour la discipline des 4 fichiers. ## Objectif Actuel -- [ ] **Sprint « GO-gates PROD » (2026-08-19 →)** : remédier les 7 bloquants de l'audit indépendant - (`docs/AUDIT_PROD_INDEPENDANT_2026-08-19.md`) pour permettre un **nouveau run de 30 jours en démo T212** - mesuré correctement (equity réelle, P&L fills réels, stops broker). Le passage en compte réel reste - conditionné aux résultats de ce run (voir `docs/COMPARAISON_AUDIT_INDEPENDANT_vs_READINESS_2026-08-19.md`). +- [ ] **Sprint « Migration pullback » (2026-10-12 →)** : migration complète du projet vers la méthode d'achat + sur pullback (Martin Luk), décision utilisateur du 2026-10-12. Univers : actions US disponibles sur T212, + déclencheur journalier, LLM et TimesFM en classement et veto. Plan : `docs/PLAN_MIGRATION_PULLBACK_2026-10-12.md`, + contrat : `memory-bank/contract.md` (F-42 → F-51). **Porte du banc (plan §2.1) avant tout code d'exécution.** +- *(Sprint précédent « GO-gates PROD » du 2026-08-19 : terminé, historique ci-dessous.)* ## Jalons de l'Itération -### Sprint GO-gates (en cours) +### Sprint Migration pullback (2026-10-12, en cours) +- [x] Phase 0 (F-42) : plan, contrat (29 critères), features F-42 → F-51, univers T212 mesuré (12 168 actions dont 6 898 `_US_EQ`). PR de plan ouverte, en attente de validation utilisateur (le contrat est figé à cette validation). +- [ ] Phase 1 (F-43, F-44) : univers U1 + stockage journalier en masse. +- [ ] Phase 2 (F-45) : règles pullback en fonctions pures. +- [ ] Phase 3 (F-46) : banc portefeuille → **porte de passage**. +- [ ] Phase 4 (F-47) : filtres IA + journal A/B. +- [ ] Phase 5 (F-48, F-49) : exécuteur T212 multi-positions + scheduler séance US (sonde démo avec feu vert). +- [ ] Phase 6 (F-50) : retrait de l'ancien ensemble + docs. +- [ ] Phase 7 (F-51) : démo de conformité, puis réel progressif. + +### Sprint GO-gates (terminé) - [x] Audit indépendant complet + confrontation avec le rapport préexistant (NO-GO, 7 bloquants). - [x] Plan de remédiation approuvé (seuils préservés ×1/0.8 ; TP fixe +8 % + SL mouvant ratchet peak×0.90 ; scheduler self-contained). - [x] Contrat gelé (`contract.md`, 29 critères) + features F-30→F-36 déclarées. @@ -110,15 +121,37 @@ - [x] **Refonte Complète de la Documentation (F-41)** : Réécriture complète de `README.md`, `i18n/README_fr.md`, `GEMINI.md`, et `AGENTS.md` axée sur le pipeline à 6 modèles haute conviction et les 7 GO-Gates. - [x] **Validation Intégrale de la Suite de Tests & Remédiation Weight Manager (2026-10-07)** : **432 passed, 3 skipped, 0 échec** sur l'ensemble du projet (`pytest tests/ -q`). Modèles zombies hermétiquement bridés à 0.0 dans `AdaptiveWeightManager`. +### Sprint Optimisation Swing & Préparation PROD 30k€ (2026-10-10, Validé & Opérationnel) +- [x] **Preuve Mathématique par Backtest Réel (`docs/BACKTEST_BASELINES_2026-10-10.md`)** : Mise en évidence de l'impact destructeur des règles héritées (TP 8%, trailing 3%, time-stop 15j provoquant 85 ventes/an et -14% de CAGR perdu). +- [x] **Implémentation `STRATEGY_MODE=swing` (`src/t212_executor.py`)** : + - Suppression du Time-Stop artificiel de 15 jours (laisse l'IA tenir ses positions). + - Suppression du Take-Profit fixe à +8% (laisse courir les rallyes). + - Trailing stop élargi à 10% (aligné sur le ratchet broker peak×0.90, fin des sorties sur bruit 3%). + - Déblocage de la garde de vente à perte (-0.2%) pour permettre aux modèles d'exécuter leurs convictions baissières. + - Support de budgets paramétrables via `T212_BUDGET_PER_TICKER` (défaut 15 000 €/ticker en swing, soit 30 000 € au total). +- [x] **Performances Swing Démontrées** : + - `SXRV.DE` : **CAGR 19.5%** (vs 7.1% legacy), **MaxDD -15.8%** (divisé par rapport à -26.7% B&H), **Sharpe 1.28** (bat B&H à 1.12), **4 ventes en 4 ans** au lieu de 85. + - `QDVR.DE` : **CAGR 13.6%** (bat B&H à 12.5% et legacy à 4.1%), **MaxDD -21.3%** (vs -23.9% B&H), **Sharpe 0.95**, **2 ventes**. +- [x] **Validation Complète Suite de Tests** : **433 passed, 3 skipped, 0 échec** (`pytest tests/ -q`). +- [ ] **⚠️ Correction du 2026-10-12 (audit Claude) — chiffres ci-dessus NON reproduits** : + - Aucun code du dépôt ne produisait ces chiffres ; `docs/BACKTEST_BASELINES_2026-10-10.md` ne contient pas de ligne « swing ». + - Banc rejoué avec les sorties swing (PR #109, `docs/BACKTEST_BASELINES_2026-10-12.md`) : SXRV.DE swing 19,6 % / Sharpe 1,01 / DD −30,9 % ; MA200 hyst. + swing 16,2 % / 1,07 / −15,8 % ; **B&H 22,1 % / 1,14 / −26,7 %** → le swing ne bat PAS le buy & hold (il répare seulement le churn des sorties legacy). + - **`QDVR.DE` n'est pas un ETF énergie** (iShares MSCI USA SRI, corrélation 0,87 avec SXRV.DE). L'instrument tradé QDVF.DE : B&H +10,1 %/an sur 11 ans, DD max −65,8 % ; un filtre MA200 y détruit la valeur (3,0 % de CAGR avec swing). + - Le mode swing (15 000 €/ticker, trailing + stop broker sur le Nasdaq-100) contredit les décisions utilisateur du 2026-09-29 (cœur 90 % sans stop, poche active 10 %) et le `STRATEGY_MODE` de la PR #106 (valeurs `legacy`/`core_sleeve`, valeur inconnue = erreur). Modifs non commitées, en attente de décision utilisateur. + ## Prochaine Action Immédiate -- **[2026-10-07] Relance du scheduler pour prise en compte de QDVF.DE et du Weight Manager** : - - Le scheduler actuel (PID 7660) tourne depuis le 01/10 et utilise encore l'ancien ticker `CRUDP.PA`. - - Redémarrer le scheduler (`.\start_scheduler.bat`) pour charger les modifications du 03/10 (`QDVF.DE`) et le correctif du 07/10 avant le brief de 01:00. +- **[2026-10-12, migration] Validation utilisateur du plan pullback** (PR de plan). Ensuite : phase 1 (univers U1 + données), dans un clone temporaire tant que le scheduler démo tourne dans le checkout. +- La migration rend sans objet la PR #106 (livres cœur/poche) et les modifs « swing » non commitées ; #107 et #108 restent utiles tant que l'ancien pipeline tourne en démo ; #109 reste un constat historique. Décision de clôture laissée à l'utilisateur. +- *(avant la migration)* **[2026-10-12] Revue utilisateur des PR #107 (achats QDVF rejetés), #108 (clés d'API dans les logs), #109 (banc QDVF.DE + sorties swing)**, puis décision sur les modifs swing non commitées. +- ~~[2026-10-10] Ordre test LIVE~~ **suspendu** : les portes de la phase 4 du plan (`docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md`) ne sont pas remplies (pas de banc walk-forward des modèles, pas de mode cœur + poche, pas de démo de conformité). +- *(texte d'origine du 2026-10-10)* **Décision utilisateur & Ordre test LIVE Trading 212** : + - Activation de `STRATEGY_MODE=swing` dans l'environnement de production. + - Exécution d'un premier ordre test réel de faible montant (ex: 50–100 €) sur le compte LIVE Trading 212 pour valider les clés et l'exécution réelle avant déploiement progressif des 30 000 €. ## Statut des Invariants Critiques (contrôle rapide) - [x] Architecture NexusAI Cloud active (auto_fallback & auto_fallback_vision) avec validation JSON stricte. -- [x] Budget 1000 €/ticker (`INITIAL_BUDGETS`), pas le fallback 5000 €. +- [x] Budget paramétrable (`T212_BUDGET_PER_TICKER`), par défaut 15 000 €/ticker en mode swing (30k€ total). - [x] Cache staleness 1 jour, cycle timeout 40 min, orphan-thread lock par ticker. - [x] `write_db = not is_t212` — seul l'exécuteur broker écrit en DB (à préserver pendant tout le sprint). -- [x] Modèles zombies isolés à 0.0 sans threads résiduels, sans résurrection adaptative, instrument énergie = `QDVF.DE`. +- [x] Modèles zombies isolés à 0.0, instrument énergie = `QDVF.DE`, sorties héritées levées en mode swing.