Skip to content

docs: plan de passage en réel, runbook d'exploitation et statut de la phase 0 - #92

Merged
laurentvv merged 5 commits into
mainfrom
docs/plan-passage-reel
Sep 29, 2026
Merged

laurentvv merged 5 commits into
mainfrom
docs/plan-passage-reel

Conversation

@laurentvv

@laurentvv laurentvv commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Résumé

Analyse du run démo T212 n°2 (03/09 → 29/09/2026) et plan en 5 phases pour un passage en réel (30 k€, horizon moyen/long terme).

Aucun code modifié.

PR liées (phase 0)

#93 isolation des tests · #94 FinAcumen · #95 takeProfit · #96 limites d'appels T212 · #97 journal d'audit · #98 watchdog

Test plan

  • Relecture du plan et du runbook par le propriétaire

🤖 Generated with Claude Code

…/long terme)

Analyse du run démo T212 n°2 (03/09 → 29/09) : verdict NO-GO réel en l'état,
constat chiffré par modèle et par règle de sortie, plan en 5 phases
(hygiène → backtest walk-forward → refonte moyen terme → démo de conformité
→ réel progressif). Aucun code modifié.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
| Take-profit | +8 % (`TAKE_PROFIT_TARGET`) | Plafonne chaque gain à 8 %. Le TP attaché chez le broker est **rejeté (400) à chaque achat** (3/3) : c'est du code mort qui provoque un double POST. |
| Trailing stop logiciel | −3 % depuis le pic, dès +0,5 % de gain | CRUDP a une volatilité quotidienne de 1,9 à 3,5 % : **moins d'un écart-type d'une séance**, donc déclenchement quasi certain. SXRV (1,1 %) : environ 3 σ, déclenché en quelques semaines. |
| Time-stop | 15 jours calendaires (`MAX_HOLDING_DAYS`) | **Force la vente même si la position est en gain.** Incompatible avec un horizon de plusieurs mois. |
| Garde anti-perte | bloque tout SELL de modèle en dessous de −0,2 % | **18 ventes bloquées.** Les perdants sont conservés jusqu'au hard-stop −10 %. Asymétrie inverse du principe « couper les pertes, laisser courir les gains ». La tolérance de 0,2 % est aussi plus étroite que le spread réel (le 24/09 : valeur affichée 1 005,82 €, fill à 1 002,51 €, soit 0,33 %). |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Analyse inexacte : la garde anti-perte ne garde pas « les perdants jusqu'au hard-stop −10 % »

_execute_sell_order contourne _check_sell_loss_guard quand force_stop_loss=True (src/t212_executor.py:1720-1726), et _evaluate_time_stop renvoie ("SELL", True) dès que la position dépasse MAX_HOLDING_DAYS tant que le drawdown n'excède pas TIME_STOP_SOFT_LOSS (src/t212_executor.py:1226-1230). Concrètement : une position à −3 % est donc vendue au 15e jour par le time-stop, garde ou pas. Le tableau de la section 1.3 surestime l'asymétrie « on garde les perdants » et sous-estime le poids réel du time-stop (que la ligne suivante décrit pourtant correctement). Corriger la cellule, sinon la phase 2.3 (« supprimer le time-stop »)appears comme le seul levier alors que la garde en est un second.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

**2.3 Règles de sortie cohérentes avec le moyen terme**
- **Supprimer le take-profit fixe à +8 %.**
- **Supprimer le time-stop de 15 jours**, ou le remplacer par une sortie « tendance cassée ET aucun progrès depuis N semaines ».
- **Supprimer la garde anti-perte** sur les sorties de régime : une sortie est décidée par une règle, pas par le P&L latent.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Supprimer toute la garde anti-perte supprime aussi une protection documentée contre les prix d'entrée corrompus

La garde n'est pas qu'un filtre de P&L latent : d'après son propre docstring et _validate_and_recalibrate_entry_price (src/t212_executor.py:170-215), elle protège contre une référence d'entrée fantôme/corrompue qui faisait passer une vente à perte pour une vente à profit (incident de juin 2026, drift à −17 %). La supprimer entièrement en phase 2, sans mécanisme de remplacement, rouvre cette classe de bug. Préférer : neutraliser la garde uniquement pour les sorties de régime (exemptions explicites par exit_reason), et conserver un contrôle de cohérence entrée/valeur avant tout POST de vente.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.


| Règle | Paramètre | Effet pour du moyen/long terme |
|---|---|---|
| Take-profit | +8 % (`TAKE_PROFIT_TARGET`) | Plafonne chaque gain à 8 %. Le TP attaché chez le broker est **rejeté (400) à chaque achat** (3/3) : c'est du code mort qui provoque un double POST. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: « code mort » est inexact et contredit AGENTS.md

L'attachement takeProfit n'est pas du code mort : il y a un repli délibéré sur un ordre nu au 400 (src/t212_executor.py:1371-1376), et AGENTS.md documente cet attachement + fallback comme une garantie GO-gate 2. Le constat « 400 systématique sur 3/3 achats en démo » est pertinent, mais l'action 0.7 devrait être formulée comme « l'API live n'accepte pas takeProfit sur un ordre au marché, à confirmer avant réel », sinon on supprime une protection broker-side encore active sur d'autres endpoints.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (2 files)
  • docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md
  • docs/RUNBOOK_EXPLOITATION.md
Resolved since previous review

Les 3 constats précédents sont corrigés : le tag prod-2026-09-30 est désormais posé sur origin/main et poussé (git fetch origin, git tag ... origin/main, git push origin ...), ce qui rend le git clone --branch prod-2026-09-30 exécutable ; la description du HMM est exacte (src/hmm_model.py discrétise des rendements et renvoie BUY/SELL, il est présenté comme candidat à re-spécifier) ; la cible du modèle classique est cohérente avec src/features.py:203 (cible à 1 jour aujourd'hui, à refaire à 20-60 jours en phase 2.2), comme le §2.2. Le nouveau §8 (tranche A de la phase 1) a été vérifié contre docs/BACKTEST_BASELINES_2026-09-29.md sur la branche feat/backtest-baselines : chiffres de CAGR, drawdown, Sharpe, nombre de trades, turnover et période sont tous concordants, et les fichiers cités (src/backtest/, le rapport) existent bien sur cette branche.

Previous Review Summaries (2 snapshots, latest commit fafcf79)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit fafcf79)

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 3
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
docs/RUNBOOK_EXPLOITATION.md 31 §2 : le tag est créé en local mais jamais poussé, donc git clone --branch prod-2026-09-30 échoue ; git tag sans argument pose le tag sur le HEAD courant, pas forcément main
docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md 260 §7 pilier 1 : le HMM est décrit comme « détecteur de régime de volatilité » alors que src/hmm_model.py discrétise des rendements et renvoie BUY/SELL
docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md 262 §7 pilier 3 : « cible à 20-60 jours » contredit la même ligne, le §1.2 et src/features.py:203 (cible à 1 jour)
Files Reviewed (2 files)
  • docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md - 2 issues
  • docs/RUNBOOK_EXPLOITATION.md - 1 issue
Resolved since previous review

Les 3 constats précédents sont corrigés : la garde anti-perte est désormais décrite comme ne bloquant que les ventes de modèles (hard-stop et time-stop la contournent bien, force_stop_loss=True), sa suppression en phase 2.3 est remplacée par une neutralisation pour les sorties de régime en conservant le contrôle de cohérence du prix d'entrée (_validate_and_recalibrate_entry_price), et le « code mort » du takeProfit est corrigé. Le nouveau §7 et le constat sur la fenêtre sans stop lors d'une vente non exécutée ont été vérifiés contre src/t212_executor.py et sont exacts.

Fix these issues in Kilo Cloud

Previous review (commit 97e97c4)

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 1
Issue Details (click to expand)

WARNING

File Line Issue
docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md 67 La garde anti-perte est contournée par force_stop_loss (time-stop, hard-stop) : la conclusion « les perdants sont conservés jusqu'au hard-stop −10 % » est fausse et surestime l'asymétrie signalée
docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md 149 Phase 2.3 propose de supprimer entièrement la garde, ce qui retire la protection documentée contre les prix d'entrée corrompus (incident −17 % de juin 2026)

SUGGESTION

File Line Issue
docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md 64 « code mort » pour l'attachement takeProfit est inexact (repli deliberé sur ordre nu) et contredit l'invariant GO-gate 2 d'AGENTS.md
Files Reviewed (3 files)
  • docs/PLAN_AMELIORATION_PASSAGE_REEL_2026-09-29.md - 3 issues
  • memory-bank/log.md - 0 issues
  • memory-bank/progress.md - 0 issues

Fix these issues in Kilo Cloud


Reviewed by free · Input: 0 · Output: 0 · Cached: 0

…se 0

- docs/RUNBOOK_EXPLOITATION.md : séparation PROD/DEV par tag, installation du watchdog, arrêt et reprise
  propres, vérifications rapides ;
- plan : §6 avancement de la phase 0 (PR #93 à #98), diagnostic du modèle sentiment (quota Alpha Vantage
  + filtre de ticker, volontairement non réparé), vérification de la doc T212 en réel ;
- memory-bank : entrées log.md et progress.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@laurentvv laurentvv changed the title docs(plan): plan d'amélioration pour le passage en réel (30 k€, moyen/long terme) docs: plan de passage en réel, runbook d'exploitation et statut de la phase 0 Sep 29, 2026
laurentvv and others added 2 commits September 29, 2026 22:17
… décision

- §1.3 : la garde anti-perte ne bloque que les ventes décidées par les modèles (le time-stop
  et le hard-stop la contournent) ; « code mort » du takeProfit reformulé ;
- §2.3 : garde anti-perte neutralisée pour les sorties de régime seulement, conservée comme
  contrôle de cohérence du prix d'entrée (incident de juin 2026) ;
- §7 (nouveau) : piliers du système de décision (hypothèse à valider en phase 1) et constat
  complémentaire sur la fenêtre sans stop lors d'une vente non exécutée.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|---|---|---|---|---|
| 1 | **Filtre de tendance et de régime** | Grebenkov, HMM (uniquement comme détecteur de régime de volatilité) + règles simples (MA200, momentum 3-12 mois, drawdown en cours) | Décide le **niveau d'exposition** (0 / 25 / 50 / 75 / 100 %), pas chaque achat ou vente | Seul composant qui avait raison sur la période (Grebenkov : achat 25 jours sur 27 sur un marché haussier). Déterministe, backtestable sur 5 ans, et référence naturelle que tout autre pilier doit battre. |
| 2 | **Couche de risque et d'exécution** | GO-gates 1 à 7 : idempotence des ordres, fill confirmé, stop GTC à cliquet chez le broker, volatilité quotidienne, garde de fraîcheur des données, verrou du scheduler, equity FIFO ; puis watchdog et régulateur d'appels | Protège le capital **même quand les modèles se trompent** | C'est le vrai acquis du projet. Il a déjà résisté à des incidents réels (vente bloquée par un stop réservé, FIFO antéchronologique, état broker inconnu). Sur 30 k€, la survie passe avant la performance. |
| 3 | **Prévision quantitative de moyen terme** (candidat) | TimesFM 3.0 (via ses quantiles) et le modèle classique (cible à 20-60 jours) | Confirmation et **dimensionnement** (probabilité de hausse, dispersion), pas un signe directionnel brut | Pas un pilier en l'état : TimesFM vend dans 84 à 93 % des cycles sur une autre série que celle tradée, le classique vise le lendemain. À garder seulement s'ils battent la règle simple hors échantillon. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Cible du modèle classique incohérente avec le code et avec le reste du document

La colonne « Composants existants » annonce « le modèle classique (cible à 20-60 jours) », mais la colonne « Pourquoi » de la même ligne dit « le classique vise le lendemain », et le §1.2 (ligne 47) ainsi que src/features.py:203 (df["Target"] = np.where(df["Returns"].shift(-1) > threshold, 1, 0)) confirment une cible à 1 jour. Le §1.2 conclut d'ailleurs que « l'horizon de 1 jour est du bruit ».

Comme ce tableau sert d'hypothèse de travail pour le banc de la phase 1, y déclarer un composant existant « cible à 20-60 jours » sans que ce soit implémenté conduirait à tester une cible que le code ne produit pas. Soit corriger en « cible à 1 jour », soit expliciter que la cible 20-60 jours est à créer en phase 2.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.


| # | Pilier | Composants existants | Rôle | Pourquoi |
|---|---|---|---|---|
| 1 | **Filtre de tendance et de régime** | Grebenkov, HMM (uniquement comme détecteur de régime de volatilité) + règles simples (MA200, momentum 3-12 mois, drawdown en cours) | Décide le **niveau d'exposition** (0 / 25 / 50 / 75 / 100 %), pas chaque achat ou vente | Seul composant qui avait raison sur la période (Grebenkov : achat 25 jours sur 27 sur un marché haussier). Déterministe, backtestable sur 5 ans, et référence naturelle que tout autre pilier doit battre. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Le HMM n'est pas un détecteur de régime de volatilité

src/hmm_model.py discrétise des rendements (−0,5 % / neutre / +0,5 %, _discretize_returns) et renvoie un signal directionnel BUY/SELL selon l'état haussier (Viterbi + _identify_bullish_state). Rien dans le code ne l'utilise comme détecteur de volatilité, et le §1.2 (ligne 47) le relève d'ailleurs comme « BUY 13, SELL 13 ».

Décrire le HMM comme « détecteur de régime de volatilité » dans les « composants existants » est donc inexact et risque d'orienter le banc de la phase 1 vers un usage (filtrage de volatilité) que le modèle ne sait pas faire aujourd'hui.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.


# 2. Cloner PROD à côté (sur un tag validé, jamais sur une branche de travail)
git tag prod-2026-09-30 # tag posé sur un main validé
git clone --branch prod-2026-09-30 https://github.com/laurentvv/Trading-AI.git C:\GIT\Trading-AI-prod

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Le git clone --branch prod-2026-09-30 échoue : le tag n'est jamais poussé

L'étape 2 crée le tag en local (git tag prod-2026-09-30, ligne 30) puis clone depuis l'URL GitHub. Sans git push origin prod-2026-09-30, le tag n'existe pas sur le remote et git clone --branch sort en erreur (« Remote branch prod-2026-09-30 not found »), ce qui bloque la mise en place du dossier PROD décrite en §2.

Il manque également un git checkout main explicite avant le git tag : sans argument, le tag est posé sur le HEAD courant, qui peut être une branche de travail — ce que le commentaire « tag posé sur un main validé » suppose sans l'assurer.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

…assique) + avancement phase 1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@laurentvv
laurentvv merged commit 1c0064b into main Sep 29, 2026
2 checks passed
@laurentvv
laurentvv deleted the docs/plan-passage-reel branch September 29, 2026 21:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant