Files
OpenFin/GeoOptions_Documentation_Complete.html
OpenSquared a31f6e21b1 docs: v6.1 — Specialist Desks v2 (COT, Forward Curves, Surprise, Hawk/Dove)
Section 12 refonte complète : 4 nouvelles sous-sections documentant le
COT CFTC (19 marchés par codes contrat stables), les Forward Curves
yfinance (contango/backwardation), le Surprise Index (actual-consensus)
et le Hawk/Dove Text Scorer GPT-4o-mini. Architecture : +2 tables DB
(cot_data, forward_curve_data), +6 colonnes specialist_reports. Schéma
et étape 4b mis à jour avec les nouvelles sources injectées dans le
contexte IA.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 18:59:24 +02:00

2787 lines
200 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GeoOptions Intelligence — Manuel Complet v5.0</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: 'Georgia', 'Times New Roman', serif; font-size: 10.5pt; line-height: 1.65; color: #1a1a2e; background: #fff; max-width: 960px; margin: 0 auto; padding: 40px 48px; }
h1 { font-size: 22pt; font-weight: 700; color: #0f2d6b; margin-bottom: 6px; }
h2 { font-size: 14pt; font-weight: 700; color: #0f2d6b; margin: 36px 0 12px; border-bottom: 2.5px solid #0f2d6b; padding-bottom: 6px; }
h3 { font-size: 11pt; font-weight: 700; color: #1a3a7c; margin: 22px 0 8px; }
h4 { font-size: 10pt; font-weight: 700; color: #2d5a9e; margin: 14px 0 5px; }
p { margin-bottom: 9px; }
table { width: 100%; border-collapse: collapse; margin: 14px 0 20px; font-size: 9.5pt; }
th { background: #0f2d6b; color: #fff; padding: 8px 12px; text-align: left; font-size: 8.5pt; text-transform: uppercase; letter-spacing: 0.5px; }
td { padding: 7px 12px; border-bottom: 1px solid #e2e8f0; vertical-align: top; }
tr:nth-child(even) td { background: #f8fafc; }
.callout { border-left: 4px solid; padding: 11px 15px; margin: 16px 0; border-radius: 0 6px 6px 0; font-size: 9.5pt; }
.callout.blue { border-color: #2d6be4; background: #eef4ff; }
.callout.green { border-color: #16a34a; background: #f0fdf4; }
.callout.amber { border-color: #d97706; background: #fffbeb; }
.callout.red { border-color: #dc2626; background: #fff5f5; }
.callout .label { font-weight: 700; font-size: 8.5pt; text-transform: uppercase; letter-spacing: 0.8px; margin-bottom: 3px; }
.callout.blue .label { color: #2d6be4; }
.callout.green .label { color: #16a34a; }
.callout.amber .label { color: #d97706; }
.callout.red .label { color: #dc2626; }
code { font-family: 'Courier New', monospace; font-size: 8.5pt; background: #f1f5f9; padding: 1px 5px; border-radius: 3px; color: #1e3a8a; }
.cover { text-align: center; padding: 50px 0 40px; border-bottom: 3px solid #0f2d6b; margin-bottom: 44px; }
.cover .subtitle { font-size: 12pt; color: #4a6fa5; margin-top: 8px; font-style: italic; }
.cover .meta { font-size: 9pt; color: #7a8aaa; margin-top: 20px; font-family: 'Courier New', monospace; }
.badge { display: inline-block; padding: 1px 8px; border-radius: 20px; font-size: 8pt; font-weight: 700; font-family: 'Courier New', monospace; }
.badge-ai { background: #dbeafe; color: #1e40af; }
.badge-mini { background: #ede9fe; color: #5b21b6; }
.badge-db { background: #f1f5f9; color: #475569; border: 1px solid #cbd5e1; }
.badge-p1 { background: #fee2e2; color: #991b1b; }
.badge-p2 { background: #fef3c7; color: #92400e; }
.badge-p3 { background: #dbeafe; color: #1e40af; }
.badge-p4 { background: #ede9fe; color: #5b21b6; }
hr { border: none; border-top: 1px solid #e2e8f0; margin: 28px 0; }
.page-break { page-break-before: always; }
ul { margin: 8px 0 12px 20px; }
li { margin-bottom: 4px; font-size: 9.5pt; }
.example-box { border: 1.5px solid #bfd1f5; border-radius: 8px; overflow: hidden; margin: 16px 0; }
.example-box .ex-header { background: #0f2d6b; color: white; padding: 10px 16px; font-weight: 700; font-size: 9.5pt; }
.example-box .ex-body { padding: 14px 16px; }
.formula-box { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; padding: 12px 16px; font-family: 'Courier New', monospace; font-size: 10pt; margin: 12px 0; }
.kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin: 14px 0 20px; }
.kpi-card { border: 1px solid #e2e8f0; border-radius: 8px; padding: 14px; text-align: center; }
.kpi-card .kpi-value { font-size: 18pt; font-weight: 700; color: #0f2d6b; }
.kpi-card .kpi-label { font-size: 8pt; color: #64748b; text-transform: uppercase; letter-spacing: 0.5px; margin-top: 4px; }
.bar-chart { margin: 12px 0; }
.bar-row { display: flex; align-items: center; margin-bottom: 8px; font-size: 9pt; }
.bar-label { width: 160px; flex-shrink: 0; text-align: right; padding-right: 10px; color: #374151; }
.bar-track { flex: 1; background: #f1f5f9; border-radius: 4px; height: 20px; overflow: hidden; }
.bar-fill { height: 100%; border-radius: 4px; display: flex; align-items: center; padding-left: 8px; font-size: 8pt; font-weight: 700; color: white; }
.bar-fill.green { background: #16a34a; }
.bar-fill.amber { background: #d97706; }
.bar-fill.red { background: #dc2626; }
.bar-fill.blue { background: #2d6be4; }
.bar-fill.purple { background: #7c3aed; }
.flow-mini { display: flex; align-items: flex-start; flex-wrap: wrap; gap: 0; margin: 14px 0; }
.flow-step { background: #eef4ff; border: 1px solid #bfd1f5; border-radius: 6px; padding: 8px 12px; font-size: 8.5pt; min-width: 80px; text-align: center; position: relative; }
.flow-arrow { display: flex; align-items: center; padding: 0 6px; color: #94a3b8; font-size: 14pt; }
.gauge-row { display: flex; gap: 16px; margin: 14px 0; flex-wrap: wrap; }
.gauge { text-align: center; }
.gauge-arc { width: 90px; height: 50px; border: 8px solid #e2e8f0; border-bottom: none; border-radius: 50px 50px 0 0; position: relative; margin: 0 auto; }
.gauge-label { font-size: 8pt; color: #64748b; margin-top: 4px; }
.gauge-value { font-size: 10pt; font-weight: 700; color: #0f2d6b; }
.matrix-cell-hot { background: #fef3c7; }
.matrix-cell-cold { background: #f0fdf4; }
.toc-list { list-style: none; margin: 0 0 0 0; }
.toc-list li { padding: 4px 0; border-bottom: 1px dotted #e2e8f0; font-size: 9.5pt; }
.toc-list li a { color: #1a3a7c; text-decoration: none; }
.toc-list li a:hover { color: #2d6be4; text-decoration: underline; }
.toc-indent { margin-left: 24px; }
.toc-indent2 { margin-left: 48px; }
.sim-table td.val-green { background: #f0fdf4; color: #166534; font-weight: 700; }
.sim-table td.val-red { background: #fff5f5; color: #991b1b; font-weight: 700; }
.sim-table td.val-amber { background: #fffbeb; color: #92400e; font-weight: 700; }
.sim-table td.val-blue { background: #eef4ff; color: #1e40af; font-weight: 700; }
.step-block { border-left: 3px solid #2d6be4; padding: 10px 16px; margin: 12px 0; background: #f8fafc; border-radius: 0 6px 6px 0; }
.step-block .step-num { font-weight: 700; color: #2d6be4; font-size: 8.5pt; text-transform: uppercase; letter-spacing: 0.8px; }
.phase-header { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.arch-box { border: 1.5px solid #bfd1f5; border-radius: 8px; padding: 16px; margin: 14px 0; background: #f8fafc; font-family: 'Courier New', monospace; font-size: 9pt; line-height: 1.8; }
.footer-doc { text-align: center; font-size: 8.5pt; color: #94a3b8; border-top: 1px solid #e2e8f0; margin-top: 48px; padding-top: 18px; font-family: 'Courier New', monospace; }
@media print {
body { padding: 20px 28px; font-size: 9.5pt; }
h2 { page-break-after: avoid; }
h3 { page-break-after: avoid; }
.page-break { page-break-before: always; }
.example-box { break-inside: avoid; }
.callout { break-inside: avoid; }
@page { size: A4; margin: 20mm 18mm; }
}
</style>
</head>
<body>
<!-- COVER PAGE -->
<div class="cover">
<div style="font-size:9pt;color:#7a8aaa;font-family:'Courier New',monospace;margin-bottom:16px;letter-spacing:2px;">DOCUMENTATION TECHNIQUE &amp; GUIDE TRADER</div>
<h1 style="font-size:28pt;">GeoOptions Intelligence</h1>
<div class="subtitle">Manuel Complet du Système — Architecture, Algorithmes &amp; Guide Trader</div>
<div style="margin-top:24px;display:flex;justify-content:center;gap:10px;flex-wrap:wrap;">
<span class="badge badge-p1">Phase 1 · IV &amp; Structure</span>
<span class="badge badge-p2">Phase 2 · Fiabilité &amp; Calibration</span>
<span class="badge badge-p3">Phase 3 · Portfolio &amp; Risk</span>
<span class="badge badge-p4">Phase 4 · IA Probabiliste</span>
<span class="badge" style="background:#d1fae5;color:#065f46;">Phase 5 · Cycle Context &amp; Intelligence</span>
<span class="badge" style="background:#fce7f3;color:#9d174d;">Phase 6 · Specialist Desks &amp; Calibration</span>
</div>
<div class="meta">
Version 6.0 · Juin 2026 · 6 Phases · FastAPI + React + SQLite + GPT-4o<br>
23 pages · 50 signaux macro · IV Gate · Pattern Convergence · IBKR Ticket
</div>
</div>
<!-- TABLE OF CONTENTS -->
<h2 id="toc">Table des Matières</h2>
<ul class="toc-list">
<li><a href="#s1">1. Vue d'ensemble du système</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s1-1">1.1 Ce que fait le système</a></li>
<li><a href="#s1-2">1.2 Les 3 principes fondamentaux</a></li>
<li><a href="#s1-3">1.3 Architecture technique</a></li>
<li><a href="#s1-4">1.4 Les 15 pages du cockpit</a></li>
</ul>
<li><a href="#s2">2. Le Cycle Automatique — Simulation complète étape par étape</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s2-steps">2.1 Les 9 étapes du cycle (Étapes 08)</a></li>
<li><a href="#s2-gpt">2.2 Exemple de sortie GPT-4o simulée</a></li>
</ul>
<li><a href="#s2b">2b. Phase 5 — Cycle Context Engine (Phases 15)</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s2b-1">2b.1 Phase 1 — Delta Temporel &amp; Decay News</a></li>
<li><a href="#s2b-2">2b.2 Phase 2 — Snapshot Contexte &amp; Releases FRED</a></li>
<li><a href="#s2b-3">2b.3 Phase 3 — Indicateurs Techniques par Horizon</a></li>
<li><a href="#s2b-4">2b.4 Phase 4+5 — Price Discovery &amp; Replay</a></li>
</ul>
<li><a href="#s3">3. Phase 1 — Volatilité Implicite &amp; Structure Marché</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s3-1">3.1 IV Rank &amp; IV Percentile</a></li>
<li><a href="#s3-2">3.2 Term Structure &amp; Skew</a></li>
<li><a href="#s3-3">3.3 Options Flow &amp; Open Interest</a></li>
<li><a href="#s3-4">3.4 IV Gate — Blocage par IVR</a></li>
<li><a href="#s3-5">3.5 Watchlist IV Dynamique</a></li>
</ul>
<li><a href="#s4">4. Phase 2 — Fiabilité &amp; Calibration</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s4-1">4.1 Pattern Reliability Score</a></li>
<li><a href="#s4-2">4.2 Contre-Thèses &amp; Invalidation</a></li>
<li><a href="#s4-3">4.3 Score de Brier &amp; Calibration</a></li>
<li><a href="#s4-4">4.4 Demi-vie des insights KB</a></li>
</ul>
<li><a href="#s5">5. Phase 3 — Portfolio &amp; Risk Engine</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s5-1">5.1 Vue Portefeuille Consolidée</a></li>
<li><a href="#s5-2">5.2 Risk Cluster Engine</a></li>
<li><a href="#s5-3">5.3 Position Sizing — Kelly Fractionnel</a></li>
<li><a href="#s5-4">5.4 HHI &amp; Score de Diversification</a></li>
<li><a href="#s5-5">5.5 Drawdown attendu</a></li>
</ul>
<li><a href="#s5b">5b. Pattern Convergence Engine</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s5b-1">5b.1 8 Catégories Thématiques</a></li>
<li><a href="#s5b-2">5b.2 Signal Direction &amp; Conviction Score</a></li>
<li><a href="#s5b-3">5b.3 Trade Ideas — Onglet Journal</a></li>
<li><a href="#s5b-4">5b.4 IBKR Ticket Auto-Calculé</a></li>
</ul>
<li><a href="#s6">6. Phase 4 — IA Probabiliste &amp; Apprentissage</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s6-1">6.1 Mise à jour Bayésienne</a></li>
<li><a href="#s6-2">6.2 Clustering de Régimes K-Means</a></li>
<li><a href="#s6-3">6.3 Embeddings Sémantiques</a></li>
<li><a href="#s6-4">6.4 Analytics Dashboard</a></li>
</ul>
<li><a href="#s7">7. Les Prompts IA — Boîte Noire Ouverte</a></li>
<li><a href="#s8">8. Tables de la Base de Données</a></li>
<li><a href="#s9">9. Guide Trader — Lire le Cockpit Page par Page</a></li>
<li><a href="#s10">10. Décisions de Conception</a></li>
<li><a href="#s11">11. Glossaire</a></li>
<li><a href="#s2c">2c. Workflow Complet du Cycle — Graphe des Calculs</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s2c-diagram">2c.1 Graphe Visuel du Pipeline</a></li>
<li><a href="#s2c-formulas">2c.2 Démonstration des Calculs Étape par Étape</a></li>
</ul>
<li><a href="#s12">12. Specialist Desks v2 — COT · Forward Curves · Surprise · Hawk/Dove</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s12-1">12.1 Architecture et tables DB</a></li>
<li><a href="#s12-2">12.2 Injection dans les prompts IA</a></li>
<li><a href="#s12-3">12.3 COT Positioning — CFTC Socrata</a></li>
<li><a href="#s12-4">12.4 Forward Curves</a></li>
<li><a href="#s12-5">12.5 Surprise Index</a></li>
<li><a href="#s12-6">12.6 Hawk/Dove Text Scorer</a></li>
</ul>
<li><a href="#s13">13. Bibliothèque Patterns — Find Similar &amp; Merge</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s13-1">13.1 Analyse de similarité GPT-4o-mini</a></li>
<li><a href="#s13-2">13.2 Fusion et remapping des données</a></li>
</ul>
<li><a href="#s14">14. Calibration Progressive — IA vs Observé</a></li>
<ul class="toc-list toc-indent">
<li><a href="#s14-1">14.1 Formule de crédibilité et blending</a></li>
<li><a href="#s14-2">14.2 Affichage sur les cards et rapport de cycle</a></li>
</ul>
</ul>
<div class="page-break"></div>
<!-- SECTION 1 -->
<h2 id="s1">1. Vue d'Ensemble du Système</h2>
<h3 id="s1-1">1.1 Ce que fait le système</h3>
<p>GeoOptions Intelligence est un cockpit de trading d'options à usage personnel, conçu pour un trader individuel opérant sur Interactive Brokers avec des positions de l'ordre de 1 000 € par trade et un horizon moyen de 3 mois. Le système fusionne en temps quasi-réel trois flux d'information hétérogènes — données de marché financières (prix, volatilité implicite, open interest), signaux géopolitiques (flux RSS de presse internationale, scores de tension par région) et analyse macroéconomique (régime macro dominant parmi 8 états : Goldilocks, Désinflation, Soft Landing, Reflation, Stagflation, Choc Inflationniste, Récession, Crise de Liquidité) — pour générer des suggestions de patterns de trading options avec probabilités de succès, tailles de position ajustées au risque, et contre-thèses d'invalidation. L'ensemble tourne sur un VPS Linux sous FastAPI (backend) et React (frontend), avec SQLite comme base de données persistante et GPT-4o comme moteur de raisonnement.</p>
<h3 id="s1-2">1.2 Les 3 Principes Fondamentaux</h3>
<div class="callout blue">
<div class="label">Principe 1 — IA Propose</div>
GPT-4o analyse le contexte macro-géopolitique complet et suggère des patterns de trading (ex: "Long call spread XLE" ou "Straddle court VIX"). L'IA génère la créativité ; elle n'est jamais le dernier mot.
</div>
<div class="callout amber">
<div class="label">Principe 2 — Les Règles Quantitatives Filtrent</div>
Chaque suggestion passe un filtre dur : IV Rank dans la bonne zone, score de fiabilité historique suffisant, concentration portefeuille acceptable, Kelly positif. Les patterns refusés par les filtres ne parviennent jamais au trader.
</div>
<div class="callout green">
<div class="label">Principe 3 — L'Historique Valide</div>
Chaque pattern tradé est enregistré avec son résultat. Le système met à jour en temps réel les win rates, les scores de Brier (calibration IA), les posteriors bayésiens, et les matrices de transition de régimes. Le système apprend de ses propres erreurs.
</div>
<h3 id="s1-3">1.3 Architecture Technique</h3>
<style>
.arch-diag { margin: 18px 0; font-family: 'Arial', sans-serif; font-size: 9pt; }
.arch-layer { border-radius: 10px; padding: 14px 18px; margin-bottom: 0; }
.arch-layer-fe { background: linear-gradient(135deg, #1e3a8a, #1d4ed8); color: white; border-radius: 10px 10px 0 0; }
.arch-layer-be { background: linear-gradient(135deg, #1e1b4b, #3730a3); color: white; }
.arch-layer-db { background: linear-gradient(135deg, #0c4a6e, #0284c7); color: white; border-radius: 0 0 10px 10px; }
.arch-layer-title { font-size: 8pt; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; opacity: 0.75; margin-bottom: 10px; }
.arch-pages { display: flex; flex-wrap: wrap; gap: 5px; }
.arch-page-chip { background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.25); border-radius: 20px; padding: 3px 10px; font-size: 7.5pt; white-space: nowrap; }
.arch-page-chip.freq { background: rgba(255,255,255,0.28); border-color: rgba(255,255,255,0.5); font-weight: 700; }
.arch-modules { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; margin-top: 10px; }
.arch-module { background: rgba(255,255,255,0.12); border: 1px solid rgba(255,255,255,0.2); border-radius: 8px; padding: 10px 8px; text-align: center; font-size: 8pt; }
.arch-module-icon { font-size: 16pt; display: block; margin-bottom: 4px; }
.arch-module-name { font-weight: 700; font-size: 8.5pt; }
.arch-module-detail { font-size: 7pt; opacity: 0.7; margin-top: 2px; }
.arch-http { text-align: center; padding: 8px; font-size: 8pt; font-weight: 700; color: #64748b; letter-spacing: 1px; border-left: 2px solid #e2e8f0; border-right: 2px solid #e2e8f0; display: flex; align-items: center; justify-content: center; gap: 8px; background: #f8fafc; }
.arch-http::before, .arch-http::after { content: ''; flex: 1; height: 1px; background: #cbd5e1; }
.arch-db-tables { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
.arch-db-chip { background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.2); border-radius: 4px; padding: 2px 8px; font-size: 7pt; font-family: 'Courier New', monospace; }
.arch-ext-row { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; margin-top: 12px; }
.arch-ext-card { background: #f8fafc; border: 1.5px solid #e2e8f0; border-radius: 8px; padding: 10px 8px; text-align: center; font-size: 8pt; }
.arch-ext-icon { font-size: 18pt; display: block; margin-bottom: 4px; }
.arch-ext-name { font-weight: 700; color: #1e3a8a; font-size: 8.5pt; }
.arch-ext-detail { font-size: 7pt; color: #64748b; margin-top: 2px; }
.arch-arrows-ext { display: flex; justify-content: space-around; padding: 4px 0; color: #94a3b8; font-size: 12pt; }
</style>
<div class="arch-diag">
<!-- LAYER 1 — FRONTEND -->
<div class="arch-layer arch-layer-fe">
<div class="arch-layer-title">⬡ FRONTEND — React 18 · Vite · Tailwind CSS · Recharts</div>
<div class="arch-pages">
<span class="arch-page-chip freq">Dashboard</span>
<span class="arch-page-chip freq">Radar Géo</span>
<span class="arch-page-chip freq">Journal</span>
<span class="arch-page-chip">Markets</span>
<span class="arch-page-chip">Macro Regime</span>
<span class="arch-page-chip">Options Lab</span>
<span class="arch-page-chip">Patterns</span>
<span class="arch-page-chip">Portfolio</span>
<span class="arch-page-chip">Cycle Report</span>
<span class="arch-page-chip">Super Context</span>
<span class="arch-page-chip">Analytics</span>
<span class="arch-page-chip">Adv. Analytics</span>
<span class="arch-page-chip">Risk Dashboard</span>
<span class="arch-page-chip">VaR Analysis</span>
<span class="arch-page-chip">Position History</span>
<span class="arch-page-chip">Backtest</span>
<span class="arch-page-chip">Calendar</span>
<span class="arch-page-chip">Specialist Desks</span>
<span class="arch-page-chip">System Logs</span>
<span class="arch-page-chip">Configuration</span>
</div>
</div>
<!-- HTTP connector -->
<div class="arch-http">HTTP / REST API</div>
<!-- LAYER 2 — BACKEND -->
<div class="arch-layer arch-layer-be">
<div class="arch-layer-title">⚙ BACKEND — FastAPI · Python 3.11 · APScheduler</div>
<div class="arch-modules">
<div class="arch-module">
<span class="arch-module-icon">🕐</span>
<div class="arch-module-name">Scheduler</div>
<div class="arch-module-detail">APScheduler · cycle 6h · elapsed-time aware</div>
</div>
<div class="arch-module">
<span class="arch-module-icon">🤖</span>
<div class="arch-module-name">AI Engine</div>
<div class="arch-module-detail">GPT-4o · 6 prompts · GPT-4o-mini résumés</div>
</div>
<div class="arch-module">
<span class="arch-module-icon">⚖️</span>
<div class="arch-module-name">Risk Engine</div>
<div class="arch-module-detail">Kelly · HHI · K-Means · Bayésien · VaR</div>
</div>
<div class="arch-module">
<span class="arch-module-icon">🔬</span>
<div class="arch-module-name">Cycle Context</div>
<div class="arch-module-detail">Decay · IVR · 50 macro · Tech · Price Discovery</div>
</div>
<div class="arch-module">
<span class="arch-module-icon">🏦</span>
<div class="arch-module-name">Specialist Desks</div>
<div class="arch-module-detail">7 desks · COT 19 marchés · Forward Curves · Surprise · Hawk/Dove</div>
</div>
</div>
</div>
<!-- DB connector -->
<div class="arch-http">SQLite / aiosqlite</div>
<!-- LAYER 3 — DATABASE -->
<div class="arch-layer arch-layer-db">
<div class="arch-layer-title">🗄 BASE DE DONNÉES — SQLite 18+ Tables</div>
<div class="arch-db-tables">
<span class="arch-db-chip">custom_patterns</span>
<span class="arch-db-chip">trade_entry_prices</span>
<span class="arch-db-chip">pattern_score_history</span>
<span class="arch-db-chip">geo_news</span>
<span class="arch-db-chip">macro_regime_history</span>
<span class="arch-db-chip">system_logs</span>
<span class="arch-db-chip">knowledge_base</span>
<span class="arch-db-chip">iv_history</span>
<span class="arch-db-chip">portfolio_snapshots</span>
<span class="arch-db-chip">skipped_trades</span>
<span class="arch-db-chip">pattern_embeddings</span>
<span class="arch-db-chip">ai_reasoning_traces</span>
<span class="arch-db-chip">specialist_reports</span>
<span class="arch-db-chip">asset_class_configs</span>
<span class="arch-db-chip">ai_call_logs</span>
<span class="arch-db-chip">fred_data</span>
<span class="arch-db-chip">cot_data</span>
<span class="arch-db-chip">forward_curve_data</span>
</div>
</div>
<!-- External APIs -->
<div class="arch-arrows-ext">↑ ↑ ↑ ↑ ↑</div>
<div class="arch-ext-row">
<div class="arch-ext-card">
<span class="arch-ext-icon">📈</span>
<div class="arch-ext-name">yfinance</div>
<div class="arch-ext-detail">Prix spot · IV · OI · 50 macro signaux · bootstrap 45j</div>
</div>
<div class="arch-ext-card">
<span class="arch-ext-icon">🧠</span>
<div class="arch-ext-name">OpenAI API</div>
<div class="arch-ext-detail">GPT-4o (scoring/suggest) · GPT-4o-mini (news/résumés/similarité)</div>
</div>
<div class="arch-ext-card">
<span class="arch-ext-icon">📰</span>
<div class="arch-ext-name">RSS Feeds</div>
<div class="arch-ext-detail">Reuters · AP · Al Jazeera · FT · Bloomberg · 7 flux</div>
</div>
<div class="arch-ext-card">
<span class="arch-ext-icon">🏛️</span>
<div class="arch-ext-name">IBKR</div>
<div class="arch-ext-detail">Portefeuille réel · Prix options live · Ticket auto-calculé</div>
</div>
<div class="arch-ext-card">
<span class="arch-ext-icon">🏦</span>
<div class="arch-ext-name">FRED API</div>
<div class="arch-ext-detail">CPI · NFP · Taux Fed · PCE · Chômage</div>
</div>
<div class="arch-ext-card">
<span class="arch-ext-icon">📋</span>
<div class="arch-ext-name">CFTC Socrata</div>
<div class="arch-ext-detail">COT hebdo · 19 marchés · codes contrat stables · gratuit sans clé</div>
</div>
</div>
</div>
<div class="callout blue">
<div class="label">Stack Technique</div>
<strong>Backend :</strong> Python 3.11, FastAPI, APScheduler, SQLite (aiosqlite), yfinance, feedparser, OpenAI SDK v1.x<br>
<strong>Frontend :</strong> React 18, Vite, Recharts, Tailwind CSS<br>
<strong>Déploiement :</strong> VPS Linux (Ubuntu 22.04), lancement via <code>start_all.bat</code> (Windows dev) ou <code>pm2</code> (VPS)<br>
<strong>IA :</strong> GPT-4o (modèle principal), GPT-4o-mini (résumés rapides, Hawk/Dove scorer, 5x moins cher)<br>
<strong>Données Desks :</strong> CFTC Socrata (COT gratuit, sans clé), yfinance (Forward Curves)
</div>
<h3 id="s1-4">1.4 Les 19 Pages du Cockpit</h3>
<table>
<thead><tr><th>#</th><th>Page</th><th>Description</th><th>Fréquence d'usage</th></tr></thead>
<tbody>
<tr><td>1</td><td><strong>Dashboard (Cockpit)</strong></td><td>Vue synthétique : KPIs macro, ticker IBKR, dernière analyse IA, signaux marché, Top trades, patterns récents, macro regime jauges</td><td>Plusieurs fois/jour</td></tr>
<tr><td>2</td><td><strong>Geopolitical Radar</strong></td><td>Flux RSS enrichi IA : score géo 0100, flèches directionnelles par classe d'actif, badge contre-signal, pertinence pattern</td><td>Quotidien</td></tr>
<tr><td>3</td><td><strong>Markets &amp; Prices</strong></td><td>Prix temps réel : actions, ETF, matières premières, forex avec graphiques 5D/1M/3M/6M/1Y/2Y</td><td>Quotidien</td></tr>
<tr><td>4</td><td><strong>Macro Regime</strong></td><td>50 signaux institutionnels · 8 scénarios · vol surface (SKEW/VVIX) · rotation sectorielle · EM/carry · scores lissés Bayésiens</td><td>Hebdomadaire</td></tr>
<tr><td>5</td><td><strong>Options Lab</strong></td><td>IV Rank, Term Structure, Skew, watchlist dynamique (builtin/auto/manuel), IV Gate, bootstrap 1 an</td><td>Avant chaque trade</td></tr>
<tr><td>6</td><td><strong>Patterns (Editor)</strong></td><td>Bibliothèque patterns : filtres classe d'actif · tri Score IA/Date/Prob · vue grille/liste · suggestion IA · éditeur complet</td><td>À chaque cycle</td></tr>
<tr><td>7</td><td><strong>Portfolio</strong></td><td>Positions ouvertes IBKR avec valorisation Black-Scholes, grecs live, alertes cluster, P&amp;L consolidé</td><td>Quotidien</td></tr>
<tr><td>8</td><td><strong>Trading Journal</strong></td><td>7 onglets : <em>AI Cycles · Macro Regimes · Trade Ideas · Open (MtM) · Closed · Geo Alerts · Not Logged</em> — fermeture 1-clic, ticker IBKR</td><td>Quotidien</td></tr>
<tr><td>9</td><td><strong>Cycle Report</strong></td><td>Rapport auto-généré à chaque cycle : raisonnement IA, delta vs cycle précédent, snapshot PnL/VaR, signaux déterminants, validation technique</td><td>À chaque cycle</td></tr>
<tr><td>10</td><td><strong>Super Context</strong></td><td>Base de connaissances évolutive injectée dans le méga-prompt : synthèse GPT-4o, entrées KB validées par catégorie</td><td>Lecture mensuelle</td></tr>
<tr><td>11</td><td><strong>Analytics</strong></td><td>Win rate par pattern, calibration Brier, score fiabilité, analyse par régime</td><td>Mensuel</td></tr>
<tr><td>12</td><td><strong>Advanced Analytics</strong></td><td>Bayésien par pattern, clustering K-Means, matrice transition, embeddings sémantiques</td><td>Mensuel</td></tr>
<tr><td>13</td><td><strong>Risk Dashboard</strong></td><td>HHI, drawdown attendu, alertes concentration facteur, mode Réel/Simulé, courbe P&amp;L cumulée, corrélations patterns</td><td>Avant chaque trade</td></tr>
<tr><td>14</td><td><strong>VaR Analysis</strong></td><td>Value at Risk delta Black-Scholes : historique / paramétrique / Monte Carlo stressé · Kupiec backtest · rolling VaR 30j</td><td>Hebdomadaire</td></tr>
<tr><td>15</td><td><strong>Position History</strong></td><td>Snapshots PnL horodatés · diff A/B entre deux snapshots · sparkline évolution · colonnes Entrée/Prix actuel</td><td>Hebdomadaire</td></tr>
<tr><td>16</td><td><strong>Backtest</strong></td><td>Simulation historique par stratégie/sous-jacent/période · courbe d'équité · win rate · table derniers trades</td><td>Mensuel</td></tr>
<tr><td>17</td><td><strong>Calendar</strong></td><td>Calendrier macro-économique (NFP, CPI, FOMC) + alertes géopolitiques + fenêtres d'opportunité options</td><td>Hebdomadaire</td></tr>
<tr><td>18</td><td><strong>System Logs</strong></td><td>Logs structurés de tous les événements système (cycle, erreurs, IA calls) · filtre par source/niveau · AI Context tab avec replay de cycle</td><td>Debug / audit</td></tr>
<tr><td>19</td><td><strong>Configuration</strong></td><td>Capital, Kelly fraction, IV Gate thresholds, exit defaults (target/stop), paramètres indicateurs techniques, clé OpenAI, watchlist tickers</td><td>Initial + trimestriel</td></tr>
</tbody>
</table>
<div class="page-break"></div>
<!-- SECTION 2 -->
<h2 id="s2">2. Le Cycle Automatique — Simulation Complète Étape par Étape</h2>
<p>Le système tourne un cycle complet toutes les 6 heures (configurable). Voici une simulation fidèle d'un cycle réel avec des données fictives mais réalistes.</p>
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-value">09:00</div>
<div class="kpi-label">Heure UTC · 17 Juin 2026</div>
</div>
<div class="kpi-card">
<div class="kpi-value" style="color:#d97706;">72%</div>
<div class="kpi-label">Score Stagflation</div>
</div>
<div class="kpi-card">
<div class="kpi-value" style="color:#dc2626;">68/100</div>
<div class="kpi-label">Geo Score (Élevé)</div>
</div>
<div class="kpi-card">
<div class="kpi-value" style="color:#dc2626;">24.3</div>
<div class="kpi-label">VIX (+8.2%)</div>
</div>
</div>
<h3 id="s2-steps">2.1 Les 9 Étapes du Cycle</h3>
<div class="step-block">
<div class="step-num">Étape 0 — Collecte des données de marché (yfinance)</div>
<p><strong>Input :</strong> Liste de tickers configurés (XLE, GLD, VIX, SPY, TLT, DXY, USDCAD, etc.)</p>
<p><strong>Traitement :</strong> Appel yfinance pour prix spot, variation J-1, volume. Calcul des ratios dérivés.</p>
<p><strong>Output (données simulées) :</strong></p>
<table class="sim-table">
<thead><tr><th>Ticker</th><th>Prix</th><th>Var. Jour</th><th>Signal</th></tr></thead>
<tbody>
<tr><td>VIX</td><td>24.3</td><td class="val-red">+8.2%</td><td>Stress modéré</td></tr>
<tr><td>Brent</td><td>$89.40</td><td class="val-green">+3.1%</td><td>Choc offre</td></tr>
<tr><td>DXY</td><td>104.2</td><td class="val-red">-0.4%</td><td>Dollar faible</td></tr>
<tr><td>Or (GLD)</td><td>$2,380</td><td class="val-green">+1.2%</td><td>Flight-to-safety</td></tr>
<tr><td>Cuivre</td><td>$3.82</td><td class="val-red">-1.8%</td><td>Demande industrielle faible</td></tr>
<tr><td>Pente 10Y-3M</td><td>-0.42%</td><td></td><td class="val-amber">Inversion (récession)</td></tr>
</tbody>
</table>
<p><strong>Règle appliquée :</strong> Si VIX &gt; 20 ET Brent &gt; +2% → signal "choc d'offre pétrolier probable". Si pente &lt; 0 → signal "risque récession". Ces deux signaux sont encodés et transmis à l'étape suivante.</p>
</div>
<div class="step-block">
<div class="step-num">Étape 1 — Calcul du Régime Macro (50 Signaux Institutionnels)</div>
<p><strong>Input :</strong> 50 signaux de marché (yfinance batch, ThreadPoolExecutor 20 workers) couvrant 6 blocs + 5 métriques dérivées :</p>
<table class="sim-table" style="font-size:8.5pt;">
<thead><tr><th>Bloc</th><th>Tickers principaux</th><th>Nouveaux signaux v5.0</th></tr></thead>
<tbody>
<tr><td><strong>💧 Liquidité mondiale</strong></td><td>DXY, UST3M, UST10Y, TLT, TIPS (TIP), Pente 10Y-3M</td><td>TLT (long bonds), EM bond (EMB)</td></tr>
<tr><td><strong>⚡ Crédit &amp; Stress</strong></td><td>HYG, VIX, LQD, IEF</td><td>VVIX (vol de vol), SKEW (tail risk)</td></tr>
<tr><td><strong>🛢 Énergie</strong></td><td>Brent (BZ=F), Gaz naturel (NG=F)</td><td>OVX (crude vol), GVZ (gold vol)</td></tr>
<tr><td><strong>🥇 Métaux stratégiques</strong></td><td>Or (GLD), Cuivre (HG=F)</td><td>Argent (SLV), ratio Argent/Or</td></tr>
<tr><td><strong>🌍 Croissance mondiale</strong></td><td>S&amp;P 500 (SPY vs MA200)</td><td>EEM (marchés émergents), FXI (Chine), USDJPY (carry)</td></tr>
<tr><td><strong>📊 Rotation sectorielle</strong></td><td></td><td>XLK (tech), XLF (finance), XLP (consommation), XLU (utilities)</td></tr>
</tbody>
</table>
<p><strong>Métriques dérivées calculées :</strong> <code>silver_gold_ratio</code> (appétit spéculatif vs refuge), <code>xlk_xlp_momentum</code> (risk-on/off sectoriel), <code>xlf_spx_ratio</code> (leadership finance), <code>eem_spx_ratio</code> (risque EM), <code>vol_surface_regime</code> (classification composite : calm / elevated_vol / extreme_skew / backwardation_stress).</p>
<p><strong>Algorithme en 3 couches :</strong></p>
<p><strong>Couche 1 — Signaux multi-périodes (anti-bruit) :</strong> Chaque variation est un blend pondéré pour éliminer le bruit intraday.</p>
<div class="formula-box">
signal_brent = 0.20 × change_1j + 0.50 × change_5j + 0.30 × change_10j
→ Exemple : change_1j = +3.2%, change_5j = +0.8%, change_10j = -0.4%
signal_brent = 0.20×3.2 + 0.50×0.8 + 0.30×(-0.4) = 0.64 + 0.40 - 0.12 = +0.92%
(bien moins agressif que le +3.2% brut)
</div>
<p><strong>Couche 2 — Scoring par règles sur 8 régimes :</strong> Goldilocks, Désinflation, Soft Landing, Reflation, Stagflation, Choc Inflationniste, Récession, Crise de Liquidité. Chaque régime accumule des points (0100) via ~15 conditions <code>if/elif</code> sur les signaux blendés.</p>
<div class="formula-box">
Score_Stagflation (brut) = Brent↑↑ (+30) + Courbe plate (+10) + Or↑ (+15)
+ Cuivre↓ (+15) + Défensifs&gt;Tech (+8) = 78/100
Score_Goldilocks (brut) = VIX&lt;18 (+20) + S&amp;P&gt;200j (+15) + HYG↑ (+15)
+ SKEW&lt;115 (+6) + VVIX&lt;85 (+5) = 61/100
</div>
<p><strong>Couche 3 — Lissage Bayésien + persistance :</strong> Les scores bruts sont blendés avec la moyenne glissante des 325 derniers jours (poids prior : 15%→45% selon la profondeur d'historique). Un régime résiste au changement si le nouveau leader ne le dépasse pas de 10 pts.</p>
<div class="formula-box">
score_lissé[regime] = (1 - w_prior) × score_brut + w_prior × moyenne_historique
w_prior = min(0.45, 0.05 × nb_jours_historique)
→ 5 jours : w=25% · 9 jours : w=45% (plateau)
Persistance : si score_lissé[nouveau] - score_lissé[ancien] &lt; 10 → ancien régime maintenu
</div>
<p><strong>Bootstrap au démarrage :</strong> Au premier chargement, le système rejoue automatiquement les 20 derniers jours de cotations (via <code>yf.download</code> batch 45j) pour pré-remplir l'historique. La détection est stable dès la première ouverture de la page.</p>
<p><strong>Output :</strong> Régime dominant lissé + score de stabilité (nombre de jours consécutifs) + biais par classe d'actifs. Affiché en bandeau sur la page Régime Macro.</p>
<div class="callout amber">
<div class="label">Note Algorithme</div>
Quand deux régimes sont à moins de 10 pts après lissage (ex: Stagflation 68%, Soft Landing 61%), le système résiste à tout changement de dominant. Évite les oscillations qui rendaient la détection inutilisable en séance.
</div>
</div>
<div class="step-block">
<div class="step-num">Étape 2 — Collecte RSS, Enrichissement IA &amp; Calcul du Geo Score</div>
<p><strong>Input :</strong> 7 flux RSS (Reuters World/Business/Commodities, AP, Al Jazeera, FT, Bloomberg) — jusqu'à 50 articles, cache 1h.</p>
<p><strong>Pipeline en 3 couches :</strong></p>
<p><strong>Couche 1 — Classification déterministe</strong> (sans IA) :</p>
<ul>
<li><code>classify_news()</code> : correspondance de mots-clés → catégorie (military, energy, sanctions, elections, trade_war…)</li>
<li><code>estimate_impact()</code> : comptage de mots à risque → score 0.01.0 brut</li>
<li><code>extract_tags()</code> : entités nommées (Trump, Russia, OPEC…) par présence textuelle</li>
</ul>
<p><strong>Couche 2 — Enrichissement GPT-4o-mini</strong> <span class="badge badge-mini">GPT-4o-mini</span> (jusqu'à 20 news, 1 seul appel batch) :</p>
<div class="formula-box">
Pour chaque news, GPT-4o-mini retourne :
impact_score → corrigé (0.01.0) — "Trump joue au golf" reste faible
ai_dir_energy → "bullish" | "bearish" | "neutral"
ai_dir_metals → "bullish" | "bearish" | "neutral"
ai_dir_indices → "bullish" | "bearish" | "neutral"
ai_resolution → true si cessez-le-feu / accord / désescalade
ai_insight → "L'accord de cessez-le-feu pèse sur le pétrole malgré les tensions"
</div>
<p><strong>Couche 3 — Alignement IA sur les patterns</strong> (dans <code>compute_pattern_relevance()</code>) :</p>
<div class="formula-box">
base_relevance = (trigger_match × 0.5 + keyword_match × 0.5) × 100 ← string matching
ai_alignment = f(bullish_count, bearish_count, resolution_count) ← -25..+25 pts
→ Pattern "Oil Spike" (expected_move > 0, asset=energy) :
ai_dir_energy majoritairement "bullish" → +20 pts
ai_dir_energy majoritairement "bearish" OU ai_resolution=True → -15 pts
(cessez-le-feu Gaza → flagged "contre-signal ⚠")
final_relevance = clamp(base_relevance + ai_alignment, 0, 100)
</div>
<p><strong>Score géo calculé :</strong> utilise les <code>impact_score</code> corrigés par l'IA (plus de faux positifs sur les articles culturels ou sportifs mentionnant "Iran").</p>
<div class="callout blue">
<div class="label">Ce qui s'affiche dans le Radar</div>
<strong>Onglet Actualités</strong> : chaque news affiche (au clic) l'insight IA en bleu, les flèches directionnelles ⛽↑ 🥇↓ 📊↓ par classe d'actif, et le badge "🕊 résolution" si l'article signale une désescalade.<br>
<strong>Onglet Patterns</strong> : badge vert "🤖 IA aligné +18pts" ou rouge "🤖 contre-signal -12pts" sur chaque pattern, avec les phrases d'insight des news correspondantes en dessous. La pertinence de base (string matching) est affichée séparément pour comparaison.
</div>
<div class="callout amber">
<div class="label">Graceful Degradation</div>
Si OpenAI n'est pas configuré, le pipeline tombe en silence sur le mode déterministe seul. L'enrichissement IA est facultatif et non bloquant.
</div>
</div>
<div class="step-block">
<div class="step-num">Étape 3 — Calcul des Métriques Options (Phase 1)</div>
<p><strong>Input :</strong> Liste des tickers options (XLE, GLD, SPY, QQQ, TLT, USDCAD, VIX)</p>
<p><strong>Traitement :</strong> Pour chaque ticker, calcul de IV Rank, IV Percentile, Term Structure (déformation courbe IV), Put/Call OI Ratio.</p>
<p><strong>Résultats simulés :</strong></p>
<table class="sim-table">
<thead><tr><th>Ticker</th><th>IV Actuelle</th><th>IV Rank</th><th>IV Pctile</th><th>Structure</th><th>PC Ratio</th><th>Signal</th></tr></thead>
<tbody>
<tr><td>XLE</td><td>32%</td><td class="val-green">35%</td><td>73%</td><td>Contango</td><td>0.82</td><td>Vente vol possible</td></tr>
<tr><td>GLD</td><td>18%</td><td class="val-green">22%</td><td>41%</td><td>Plat</td><td>1.15</td><td>Acheter protection</td></tr>
<tr><td>SPY</td><td>21%</td><td class="val-amber">48%</td><td>59%</td><td>Légère backwardation</td><td>1.38</td><td>Neutre — attendre</td></tr>
<tr><td>TLT</td><td>15%</td><td class="val-green">18%</td><td>32%</td><td>Contango</td><td>1.05</td><td>IV Rank trop bas</td></tr>
<tr><td>USDCAD</td><td>8%</td><td class="val-amber">52%</td><td>61%</td><td>Plat</td><td>0.94</td><td>Neutre</td></tr>
<tr><td>QQQ</td><td>24%</td><td class="val-red">78%</td><td>82%</td><td>Backwardation</td><td>1.52</td><td class="val-red">Vendre vol</td></tr>
<tr><td>VIX</td><td>24.3</td><td class="val-amber">61%</td><td>68%</td><td>Backwardation</td><td></td><td>Vol short terme élevée</td></tr>
</tbody>
</table>
<p>Ces données sont encodées dans le méga-prompt de l'Étape 5.</p>
</div>
<div class="step-block">
<div class="step-num">Étape 4b — Chargement des Specialist Desks</div>
<p><strong>Input :</strong> Table <code>asset_class_configs</code> (7 desks) + <code>specialist_reports</code> + <code>report_desk_links</code> + <code>cot_data</code> + <code>forward_curve_data</code></p>
<p><strong>Traitement :</strong> Pour chaque desk actif, le système charge les fondamentaux, la sensibilité macro par régime, les seuils de prix significatifs/extrêmes, et les 5 prochains rapports planifiés triés par date et importance. Il enrichit le bloc avec :</p>
<ul>
<li><strong>COT net% OI</strong> par commodity (ex : Gold +53%, WTI +6%, 10Y T-Notes 17%) — positionnement spéculatif CFTC hebdomadaire</li>
<li><strong>Forward Curve structure</strong> par asset (contango / backwardation / flat) — signal de pression directionnelle physique</li>
<li><strong>Surprise scores</strong> des derniers rapports (actual consensus) + estimations consensus à venir</li>
</ul>
<p><strong>Output :</strong> Un bloc de contexte structuré par desk, injecté dans <strong>deux prompts distincts</strong> :</p>
<ul>
<li><strong>Scoring (Étape 5) :</strong> seuls les desks couverts par les patterns scorés ce cycle sont injectés — contexte ciblé pour réduire les tokens</li>
<li><strong>Suggestion (Étape 5) :</strong> les 7 desks sont systématiquement injectés — permet à l'IA de suggérer des patterns sur des desks non encore couverts</li>
</ul>
<div class="callout amber">
<div class="label">Pourquoi deux chemins distincts ?</div>
Lors du scoring, l'IA connaît déjà l'asset class des patterns. L'injection ciblée suffit et coûte moins cher. Lors de la suggestion, l'IA doit explorer librement tous les marchés — injecter les 7 desks garantit qu'aucune opportunité n'est manquée par méconnaissance du contexte desk.
</div>
</div>
<div class="step-block">
<div class="step-num">Étape 4 — Construction du Super Contexte</div>
<p><strong>Input :</strong> Base de données Knowledge Base (patterns historiques), trades des 90 derniers jours, insights récents avec scores de fiabilité</p>
<p><strong>Gate de 6 heures :</strong> Le Super Contexte n'est régénéré que si le précédent a plus de 6 heures. Ceci évite de surcharger le contexte GPT-4o avec des données quasi-identiques entre deux cycles rapprochés.</p>
<p><strong>Contenu généré (extrait simulé) :</strong></p>
<div class="example-box">
<div class="ex-header">Super Contexte — Extrait (généré 17 juin 2026 03:00 UTC)</div>
<div class="ex-body" style="font-family:'Courier New',monospace;font-size:8.5pt;">
PATTERNS HISTORIQUES FIABLES (score &gt; 1.5) :<br>
✓ "Choc Pétrolier Moyen-Orient" → score 2.27 · 28 trades · 68% WR · long XLE calls<br>
✓ "Hausse Or Flash-To-Safety" → score 1.87 · 19 trades · 72% WR · long GLD calls<br><br>
TRADES RÉCENTS (30j) :<br>
✓ Long XLE call spread $88/$95 → +14.2% (ouvert, mature à 67%)<br>
✗ Short SPY put $480 → -8.1% (fermé, rally surprise post-CPI)<br><br>
PORTEFEUILLE ACTUEL :<br>
⚠ Facteur dollar : 53% — SATURÉ (seuil 40%)<br>
⚠ Facteur géopolitique : 60% — SATURÉ (seuil 50%)<br>
✓ HHI : 0.278 — bien diversifié (seuil alerte : 0.35)<br>
</div>
</div>
<p><strong>Règle "trades matures uniquement" :</strong> Seuls les trades ayant consommé plus de 40% de leur horizon temporel sont inclus dans le contexte. Un trade ouvert depuis 5 jours pour 90 jours (5.5%) n'est pas encore informatif.</p>
</div>
<div class="step-block">
<div class="step-num">Étape 5 — Le Méga-Prompt GPT-4o</div>
<p><strong>Structure du prompt (voir Section 7 pour le détail complet) :</strong></p>
<ul>
<li>Rôle : "Vous êtes un analyste options spécialisé en géopolitique et macro…"</li>
<li>Contexte macro : Régime (Stagflation 72%), VIX, Brent, Or, DXY, pente</li>
<li>Contexte géopolitique : Geo Score 68/100, tensions par région</li>
<li>Métriques options : IV Rank, term structure, skew par ticker</li>
<li>Super Contexte : patterns fiables, portefeuille, contraintes de risque</li>
<li>Instruction de sortie : JSON structuré avec 35 patterns</li>
</ul>
<p><strong>Coût estimé :</strong> ~4,500 tokens input + ~800 tokens output ≈ 0.058$ par cycle (à 6h → ~0.23$/jour)</p>
</div>
<div class="step-block">
<div class="step-num">Étape 6 — Parsing &amp; Validation des Patterns</div>
<p><strong>Input :</strong> Réponse JSON brute de GPT-4o</p>
<p><strong>Filtres appliqués :</strong></p>
<ul>
<li>Score GPT ≥ 50 (configurable)</li>
<li>Ticker avec IV Rank dans la bonne plage pour la stratégie proposée</li>
<li>Kelly fractionnel &gt; 0 (pattern a un edge positif)</li>
<li>Pas de doublon sémantique avec les patterns en KB (cosine similarity &lt; 0.75)</li>
<li>Cluster facteur non saturé au-delà du seuil configuré</li>
</ul>
<p><strong>Output :</strong> 24 patterns validés, stockés dans la table <code>analyses_ia</code></p>
</div>
<div class="step-block">
<div class="step-num">Étape 7 — Mise à jour Bayésienne des Patterns</div>
<p><strong>Input :</strong> Tous les trades fermés depuis le dernier cycle avec résultat (win/loss)</p>
<p><strong>Traitement :</strong> Pour chaque pattern associé à un trade fermé, mise à jour du posterior bayésien (α, β). Le score GPT initial est utilisé comme prior. Voir Section 6.1 pour le détail.</p>
<p><strong>Output :</strong> Tables <code>pattern_performance</code> et <code>bayesian_estimates</code> mises à jour</p>
</div>
<div class="step-block">
<div class="step-num">Étape 7b — Moniteur de Portefeuille Simulé <span class="badge badge-ai">GPT-4o-mini</span></div>
<p><strong>Input :</strong> Ensemble des trades ouverts dans <code>trade_entry_prices</code> après le log du cycle courant</p>
<p><strong>Traitement :</strong> Le service <code>portfolio_risk.py</code> analyse la répartition par classe d'actif, détecte les conflits directionnels (même sous-jacent, directions opposées) et les sur-concentrations (&gt; 35% en une seule classe). Si des alertes sont générées, GPT-4o-mini reçoit un résumé compact et produit : un assessment global en 2 phrases, une liste d'actions priorisées (<code>close_trade / rebalance / monitor</code>), et une suggestion de rééquilibrage.</p>
<p><strong>Output :</strong> Résultat persisté dans <code>system_logs</code> (source = <code>portfolio_monitor</code>). Affiché dans l'onglet <strong>Risque Sim.</strong> du Journal de Bord avec badge rouge sur l'onglet en cas de conflit. Étape non-bloquante : une erreur n'interrompt pas le cycle.</p>
<p><strong>Colonne ajoutée :</strong> <code>asset_class</code> maintenant stockée dans <code>trade_entry_prices</code> (migration automatique) — renseignée à chaque INSERT depuis le pattern d'origine.</p>
</div>
<div class="step-block">
<div class="step-num">Étape 8 — Notification &amp; Affichage</div>
<p><strong>Input :</strong> Patterns validés, alertes risque, signaux d'invalidation détectés</p>
<p><strong>Output :</strong> Mise à jour du frontend React (polling toutes les 60 secondes), envoi d'une notification push si score &gt; 75 ou alerte risque critique</p>
<p><strong>Durée totale du cycle :</strong> 47120 secondes (selon disponibilité API OpenAI)</p>
</div>
<h3 id="s2-gpt">2.2 Exemple de Sortie GPT-4o Simulée</h3>
<div class="example-box">
<div class="ex-header">Sortie GPT-4o — Cycle 17 juin 2026 09:00 UTC (simulé)</div>
<div class="ex-body">
<pre style="font-family:'Courier New',monospace;font-size:8pt;white-space:pre-wrap;">{
"analyse_globale": "Le contexte de stagflation confirmé (72%) combiné à un choc pétrolier en cours (Brent +3.1%, OPEC+ réunion d'urgence) et aux tensions en Asie du Nord-Est crée un environnement favorable aux stratégies longues volatilité sur l'énergie et aux protections défensives sur les indices. L'inversion de la courbe (-0.42%) renforce le risque de récession à 6-9 mois.",
"patterns": [
{
"nom": "Choc Pétrolier Corée du Nord — Perturbation Routes Énergétiques",
"strategie": "Long call spread XLE $90/$98 — expiration Septembre 2026",
"ticker_principal": "XLE",
"score_confiance": 78,
"probabilite_succes": 0.68,
"horizon_jours": 75,
"taille_kelly_pct": 12.4,
"raisonnement": "Le tir de missile nord-coréen perturbe les routes de navigation en mer du Japon et amplifie l'effet OPEC+. L'IV Rank de XLE à 35% est raisonnable pour acheter des calls. Le call spread limite le coût si la hausse est progressive.",
"contre_these": "Si les négociations diplomatiques US-Corée du Nord reprennent rapidement, la prime de risque géopolitique se dégonfle. Probabilité : 28%.",
"trigger_invalidation": "Annonce de contacts diplomatiques US-RPDC ou retrait des forces navales nord-coréennes",
"facteurs_risque": ["géopolitique", "énergie"],
"ajustement_cluster": "Facteur géo à 60% — taille réduite de 50%"
},
{
"nom": "Flight-to-Safety Or — Dollar Faible + VIX Hausse",
"strategie": "Long call GLD $195 — expiration Août 2026",
"ticker_principal": "GLD",
"score_confiance": 71,
"probabilite_succes": 0.65,
"horizon_jours": 45,
"taille_kelly_pct": 8.7,
"raisonnement": "Or à +1.2% en même temps que dollar faible (-0.4%) et VIX hausse = configuration classique de fuite vers la sécurité. IV Rank GLD à 22% (cheap) → acheter de la vol est justifié. Objectif $2,450.",
"contre_these": "Si le dollar rebondit sur des données économiques US solides (NFP, CPI surprise), l'or recule mécaniquement.",
"trigger_invalidation": "DXY +1.5% sur une session / NFP > 300K / CPI core < 2.8%",
"facteurs_risque": ["dollar", "inflation"],
"ajustement_cluster": "Facteur dollar saturé (53%) taille réduite de 50%"
},
{
"nom": "Compression Volatilité QQQ Pic VIX Technologique",
"strategie": "Short strangle QQQ $460/$510 expiration Juillet 2026",
"ticker_principal": "QQQ",
"score_confiance": 64,
"probabilite_succes": 0.61,
"horizon_jours": 30,
"taille_kelly_pct": 6.2,
"raisonnement": "QQQ IV Rank à 78% (cher) avec backwardation vendre de la vol. Le stress géo actuel est concentré sur l'énergie et l'Asie du Nord-Est, pas sur les techs. Short strangle profite du time decay si le marché reste dans la range.",
"contre_these": "Si NVDA ou MSFT publie des résultats décevants ou si une escalade géopolitique touche les semi-conducteurs (Taiwan), mouvement directionnel brutal.",
"trigger_invalidation": "VIX > 30 / Annonce guerre Taiwan / Earnings QQQ -10% gap",
"facteurs_risque": ["liquidité", "technologie"],
"ajustement_cluster": "Facteurs non saturés — taille nominale maintenue"
}
]
}</pre>
</div>
</div>
<div class="callout green">
<div class="label">Ce que le Trader voit</div>
Les 3 patterns apparaissent dans la page "Patterns IA" avec leurs scores, tailles, contre-thèses, et indicateurs de cluster. Le trader clique sur "Valider" pour enregistrer son intérêt ou "Rejeter" pour exclure le pattern du contexte futur.
</div>
<div class="page-break"></div>
<!-- SECTION 2b -->
<h2 id="s2b">2b. <span class="badge" style="background:#d1fae5;color:#065f46;">Phase 5</span> — Cycle Context Engine</h2>
<p>La Phase 5 regroupe cinq sous-phases qui enrichissent le contexte transmis à l'IA à chaque cycle, passant d'un prompt statique à un contexte temporellement conscient, calibré par les indicateurs techniques et les données macro institutionnelles.</p>
<h3 id="s2b-1">2b.1 Phase 1 — Delta Temporel &amp; Decay News</h3>
<p>À chaque cycle, le système calcule un <strong>cycle_meta</strong> : métadonnées temporelles injectées dans tous les prompts IA pour que GPT-4o sache "où il en est" dans la journée et la semaine.</p>
<div class="formula-box">
cycle_meta = {
hours_since_last_cycle : heures depuis le cycle précédent complété
completed_cycles_today : nombre de cycles finalisés dans les 24h
cycle_number_today : numéro du cycle actuel (1er, 2e, 3e…)
market_session : "pre_market" | "regular" | "after_hours" | "weekend"
}
</div>
<div class="callout blue">
<div class="label">Utilité dans le prompt</div>
Si <code>hours_since_last_cycle = 18</code>, l'IA sait qu'il y a eu une longue pause et doit réévaluer les thèses depuis zéro. Si <code>hours_since_last_cycle = 6</code>, elle peut se concentrer sur les nouvelles marginales. Si <code>market_session = "pre_market"</code>, elle privilégie les stratégies d'ouverture.
</div>
<p><strong>Decay des news par ancienneté :</strong> <code>_partition_news_by_age()</code> divise les news en deux buckets. Les news récentes (&lt;6h) reçoivent un poids plein. Les news "aged" (624h) voient leur impact_score multiplié par un facteur de déclin, évitant que des nouvelles de la veille dominent le contexte.</p>
<div class="formula-box">
decay_factor(age_hours) = max(0.3, 1.0 - 0.07 × (age_hours - 6))
Exemple :
news à 6h → decay = 1.00 (poids plein)
news à 10h → decay = 0.72
news à 18h → decay = 0.16
news à 24h → decay = 0.30 (plancher — jamais complètement ignorée)
</div>
<h3 id="s2b-2">2b.2 Phase 2 — Snapshot Contexte &amp; Releases FRED</h3>
<p>À la fin de chaque cycle, un snapshot complet du contexte transmis à l'IA est persisté dans la table <code>context_snapshots</code>. Ce snapshot enregistre : l'état exact du méga-prompt, les news transmises, les indicateurs macro, les patterns sélectionnés et le cycle_meta. Il est consultable dans l'onglet <strong>AI Context</strong> de la page System Logs avec un bouton "Replay this cycle" qui reporte exactement les conditions d'entrée du cycle historique.</p>
<div class="callout amber">
<div class="label">Releases FRED intégrées</div>
Le système surveille les publications macro institutionnelles (NFP, CPI, FOMC) via le calendrier économique. Quand une release majeure est attendue dans les 48h, une note est ajoutée au cycle_meta : <code>"⚠ CPI release in 6h — elevated vol probable"</code>. GPT-4o reçoit ce signal et peut ajuster ses suggestions vers des stratégies de vol (straddles) ou réduire les positions directionnelles.
</div>
<h3 id="s2b-3">2b.3 Phase 3 — Indicateurs Techniques par Horizon</h3>
<p>Pour chaque pattern suggéré, un agent technique calcule les indicateurs calibrés selon l'horizon de l'option (horizon_days). La logique d'adaptation :</p>
<div class="formula-box">
horizon ≤ 30 jours → RSI14, MA20, MA50, Bollinger 20
horizon ≤ 90 jours → RSI21, MA50, MA100
horizon > 90 jours → RSI28, MA100, MA200
Signal RSI :
RSI &lt; 30 → "oversold — reversal likely"
RSI &gt; 70 → "overbought — caution on longs"
RSI 4555 → "neutral — momentum absent"
Signal Bollinger (20 périodes, 2σ) :
Prix &gt; bande sup → "upper band breakout — momentum"
Prix &lt; bande inf → "below lower band — potential bounce"
Prix entre bandes → "range-bound"
</div>
<p>Ces signaux sont injectés dans la section "Validation Technique" du prompt de scoring, permettant à GPT-4o de downranker un pattern bullish dont le sous-jacent est déjà en zone de surachat (RSI28 &gt; 70 pour horizon 90j).</p>
<h3 id="s2b-4">2b.4 Phase 4+5 — Price Discovery &amp; Replay Historique</h3>
<p><strong>Price Discovery (Phase 4) :</strong> Le système détecte si le prix d'entrée utilisé pour chaque trade est "frais" (<code>entry_price_fresh = True</code> si récupéré dans les 30 dernières minutes) ou estimé (prix de clôture J-1). Ce flag est affiché dans l'onglet Ouverts du Journal comme badge <code>⚠ ENTRY STALE</code> et transmis à l'IA dans le contexte de scoring.</p>
<p><strong>Replay Historique (Phase 5) :</strong> Depuis l'onglet AI Context de System Logs, le trader peut sélectionner un snapshot de cycle passé et cliquer "Replay this cycle" pour re-exécuter le méga-prompt avec exactement le contexte du moment historique (même news, même macro, même régime). Utile pour comprendre pourquoi l'IA a suggéré telle stratégie à tel moment, ou pour tester une modification de prompt sur des données passées.</p>
<div class="callout green">
<div class="label">Scheduler Weekend-Aware</div>
Le cycle automatique (APScheduler) ne tourne pas les samedi et dimanche — les marchés options sont fermés. Les heures de cycle sont configurables dans Config (défaut : 02:00, 08:00, 14:00, 20:00 UTC). Cette logique évite les appels API inutiles et les suggestions sur des données de vendredi soir considérées comme "live".
</div>
<div class="page-break"></div>
<!-- SECTION 3 -->
<h2 id="s3">3. <span class="badge badge-p1">Phase 1</span> — Volatilité Implicite &amp; Structure Marché</h2>
<h3 id="s3-1">3.1 IV Rank &amp; IV Percentile</h3>
<p>La volatilité implicite (IV) d'une option mesure ce que le marché "pense" de la volatilité future du sous-jacent. Mais une IV de 32% est-elle chère ou pas chère ? Tout dépend de l'historique récent. C'est le rôle de l'IV Rank et de l'IV Percentile.</p>
<h4>Formules</h4>
<div class="formula-box">
IV Rank = (IV_actuelle - IV_min_52s) / (IV_max_52s - IV_min_52s) × 100
IV Percentile = (Nombre de jours sur 252 où IV &lt; IV_actuelle) / 252 × 100
</div>
<div class="example-box">
<div class="ex-header">Exemple Complet — XLE (Energy ETF)</div>
<div class="ex-body">
<p><strong>Données :</strong> IV actuelle = 32% · IV min 52 semaines = 18% · IV max 52 semaines = 58%</p>
<div class="formula-box">
IV Rank = (32 - 18) / (58 - 18) × 100
= 14 / 40 × 100
= 35% → CHEAP (en dessous du 50ème centile historique)
</div>
<p><strong>Interprétation IV Rank 35% :</strong> La volatilité actuelle est dans le tiers inférieur de sa plage annuelle. Elle est relativement bon marché par rapport à son propre historique récent.</p>
<div class="formula-box">
IV Percentile : Sur les 252 derniers jours de trading,
73% des jours avaient une IV &lt; 32%.
→ IV Percentile = 73%
</div>
<p><strong>Divergence IV Rank vs IV Percentile :</strong> IV Rank = 35% mais IV Percentile = 73% — c'est possible ! Cela signifie que l'IV a passé beaucoup de temps sous 32%, mais les pics (jusqu'à 58%) tirent la moyenne haute. Le Rank est distordu par ce pic exceptionnel. Dans ce cas, le Percentile est plus informatif.</p>
</div>
</div>
<h4>Table simulée — 8 Tickers avec IV Rank</h4>
<table class="sim-table">
<thead><tr><th>Ticker</th><th>IV Actuelle</th><th>IV Min 52s</th><th>IV Max 52s</th><th>IV Rank</th><th>IV Pctile</th><th>Signal</th></tr></thead>
<tbody>
<tr><td>XLE</td><td>32%</td><td>18%</td><td>58%</td><td class="val-green">35% (cheap)</td><td>73%</td><td>Acheter vol prudent</td></tr>
<tr><td>GLD</td><td>18%</td><td>12%</td><td>34%</td><td class="val-green">27% (cheap)</td><td>41%</td><td>IV bon marché</td></tr>
<tr><td>QQQ</td><td>24%</td><td>14%</td><td>38%</td><td class="val-red">83% (cher)</td><td>82%</td><td>Vendre vol</td></tr>
<tr><td>SPY</td><td>21%</td><td>13%</td><td>42%</td><td class="val-amber">55% (neutre)</td><td>59%</td><td>Attendre</td></tr>
<tr><td>TLT</td><td>15%</td><td>11%</td><td>28%</td><td class="val-green">24% (cheap)</td><td>36%</td><td>Acheter protection</td></tr>
<tr><td>IWM</td><td>28%</td><td>16%</td><td>48%</td><td class="val-amber">38% (neutre-bas)</td><td>52%</td><td>Neutre</td></tr>
<tr><td>USO</td><td>41%</td><td>22%</td><td>65%</td><td class="val-amber">44% (neutre)</td><td>61%</td><td>Attendre</td></tr>
<tr><td>VXX</td><td>62%</td><td>45%</td><td>120%</td><td class="val-green">23% (cheap)</td><td>38%</td><td>Acheter vol longue</td></tr>
</tbody>
</table>
<div class="callout green">
<div class="label">Règle de Trading — IV Rank</div>
<strong>IV Rank &lt; 25% :</strong> L'IV est historiquement basse → acheter de la volatilité est bon marché (long straddle, long calls/puts, long spreads). Le coût est faible, la chance de pic est élevée.<br><br>
<strong>IV Rank 2575% :</strong> Zone neutre → aucune stratégie volatilité n'a d'avantage marqué. Privilégier les spreads directionnels.<br><br>
<strong>IV Rank &gt; 75% :</strong> L'IV est historiquement haute → vendre de la volatilité est favorable (short strangle, iron condor, cash-secured puts). La prime est élevée, le mean reversion est probable.
</div>
<h3 id="s3-2">3.2 Term Structure &amp; Skew</h3>
<p>La term structure décrit la forme de la courbe d'IV selon les expirations. Le skew décrit l'asymétrie de l'IV entre les puts et calls pour une même expiration.</p>
<h4>Contango (marché normal)</h4>
<div class="formula-box">
Exemple XLE en juin 2026 :
IV30 = 22% (expiration 30 jours)
IV60 = 25% (expiration 60 jours)
IV90 = 27% (expiration 90 jours)
IV180 = 30% (expiration 180 jours)
Pente = (IV180 - IV30) / 150 jours = +8pts / 150j = +0.053 pt/jour → CONTANGO
IV (%)
30 ┤ ●────── IV180=30
│ ●──────────
│ ●─────────
22 ●
└────────────────────────────────────────────
30j 60j 90j 120j 150j 180j jours
Interprétation : Marché calme à court terme. La vol longue est plus chère.
→ Stratégie : vendre de la vol courte terme (short put 30j), acheter protection longue (long put 180j).
</div>
<h4>Backwardation (stress court terme)</h4>
<div class="formula-box">
Exemple SPY pendant choc géopolitique :
IV30 = 38% (panique court terme)
IV60 = 32%
IV90 = 28%
IV180= 24%
Pente = (IV180 - IV30) / 150j = -14pts / 150j = -0.093 pt/jour → BACKWARDATION
IV (%)
38 ●
│ ●──────
│ ●──────────
24 │ ●──────────────────
└────────────────────────────────────────────
30j 60j 90j 120j 150j 180j jours
Interprétation : Stress court terme élevé. Acheter protection court terme est cher.
→ Stratégie : acheter vol longue terme (moins chère), vendre vol court terme contre.
→ Exemple : calendar spread — vendre IV30, acheter IV90.
</div>
<h4>Put/Call Skew</h4>
<div class="formula-box">
Skew = IV_put_25delta - IV_call_25delta
Exemple XLE :
IV_put_25delta = 28% (puts à 25 delta = puts légèrement OTM)
IV_call_25delta = 22% (calls à 25 delta)
Skew = 28% - 22% = +6 points
→ Puts plus chers que calls de 6 points → PROTECTION DEMAND élevée
→ Les institutionnels achètent massivement des puts → anticipent une baisse
Skew négatif (Skew &lt; 0) : calls plus chers → anticipation de hausse explosive (ex: squeeze).
Skew neutre (±1pt) : marché non directionnel, vol distribuée symétriquement.
</div>
<div class="callout amber">
<div class="label">Implication Trading</div>
Un skew de +6pts sur XLE signifie que les puts sont surévalués par rapport aux calls. Si vous voulez une protection baisse sur XLE, vous payez une prime supplémentaire. Alternativement, vendre des puts dans ce contexte donne plus de prime — mais le risque est asymétrique (les institutionnels qui achètent ces puts voient peut-être quelque chose que vous ne voyez pas).
</div>
<h3 id="s3-3">3.3 Options Flow &amp; Open Interest</h3>
<h4>Put/Call OI Ratio</h4>
<div class="formula-box">
PC_Ratio = Open_Interest_Puts / Open_Interest_Calls
Valeur &gt; 1.2 → Institutionnels en mode défensif (achat puts = protection portefeuille)
Valeur &lt; 0.7 → Sentiment haussier dominant (calls spéculatifs)
Valeur 0.71.2 → Neutre / équilibré
</div>
<div class="example-box">
<div class="ex-header">Exemple — Open Interest Inhabituel sur XLE</div>
<div class="ex-body">
<p><strong>Observation :</strong> Strike Call XLE $92 · Expiration Septembre 2026</p>
<table class="sim-table">
<thead><tr><th>Strike</th><th>OI Calls</th><th>OI Puts</th><th>OI Moyen Calls (12m)</th><th>Signal</th></tr></thead>
<tbody>
<tr><td>$88</td><td>12,400</td><td>18,600</td><td>9,200</td><td>Normal</td></tr>
<tr><td>$90</td><td>22,800</td><td>15,200</td><td>11,000</td><td>Légèrement élevé</td></tr>
<tr><td class="val-amber">$92</td><td class="val-red">45,000</td><td>8,400</td><td>8,000</td><td class="val-red">INHABITUEL — 5.6x moyenne</td></tr>
<tr><td>$95</td><td>18,200</td><td>6,100</td><td>7,500</td><td>Élevé mais explicable</td></tr>
<tr><td>$98</td><td>9,600</td><td>4,200</td><td>5,200</td><td>Normal</td></tr>
</tbody>
</table>
<p><strong>Interprétation :</strong> OI calls $92 = 45,000 contrats vs moyenne 8,000 → <strong>mur de résistance potentiel</strong> à $92. Deux scénarios possibles :</p>
<ul>
<li><strong>Scénario 1 (gamma squeeze) :</strong> Si XLE monte vers $92, les market makers qui ont vendu ces calls doivent acheter du sous-jacent pour se couvrir (delta hedge) → accélère la montée → squeeze au-dessus de $92.</li>
<li><strong>Scénario 2 (résistance) :</strong> Les calls ont été achetés par quelqu'un qui pense que $92 est un objectif réaliste. Ils agissent comme signal d'intérêt institutionnel bullish sur XLE.</li>
</ul>
</div>
</div>
<h4>Dealer Gamma Estimation</h4>
<p>Le Dealer Gamma mesure si les market makers sont globalement "long gamma" ou "short gamma". C'est une estimation basée sur l'OI et les grecs approximatifs.</p>
<div class="formula-box">
Gamma_net_dealer = Σ (OI × Gamma × sens_position)
Short Gamma Dealer (Gamma &lt; 0) :
→ Pour se couvrir, ils doivent VENDRE quand le marché baisse et ACHETER quand il monte
→ Amplifie les mouvements → marché plus volatil
Long Gamma Dealer (Gamma &gt; 0) :
→ Pour se couvrir, ils doivent ACHETER quand le marché baisse et VENDRE quand il monte
→ Amortit les mouvements → marché plus stable, range-bound
</div>
<div class="callout blue">
<div class="label">Règle Pratique</div>
En période de gamma short (dealers court gamma), les mouvements de marché de ±1% peuvent rapidement devenir ±3%. C'est pourquoi les options sont soudainement sous-évaluées juste avant un mouvement violent — le marché n'anticipe pas l'amplification mécanique du dealer hedging.
</div>
<h3 id="s3-4">3.4 IV Gate — Blocage par IVR</h3>
<p>L'IV Gate est un filtre dur qui bloque ou pénalise les trades avant leur log dans le cycle, selon l'IV Rank du sous-jacent au moment de la suggestion. Il opère sur deux niveaux :</p>
<table>
<thead><tr><th>Condition</th><th>Action</th><th>Seuil défaut</th></tr></thead>
<tbody>
<tr><td>IVR &gt; <code>ivGateHigh</code></td><td>ALERT — warning sur le pattern, taille Kelly réduite ×0.7</td><td>60%</td></tr>
<tr><td>IVR &gt; <code>ivGateExtreme</code> pour strategies d'achat de vol (Long Call, Long Put, Straddle)</td><td>BLOCKED — le pattern n'est pas logué. Affiché en rouge dans Trade Ideas.</td><td>80%</td></tr>
<tr><td>IVR &gt; <code>ivGateExtreme</code> pour Straddle/Strangle</td><td>ALERT automatique — pénalité multiplicateur ×1.3 sur le coût estimé</td><td>80%</td></tr>
</tbody>
</table>
<div class="formula-box">
Décision IV Gate :
if strategy in ("long_call", "long_put", "straddle", "long_straddle"):
if ivr > ivGateExtreme → BLOCKED
elif ivr > ivGateHigh → ALERT (taille ×0.7)
elif strategy in ("straddle", "strangle"):
if ivr > ivGateExtreme → ALERT (coût estimé ×1.3)
</div>
<div class="callout amber">
<div class="label">Rationale</div>
Acheter un long straddle avec IVR = 85% signifie payer la volatilité dans le 85ème percentile annuel de son historique. La probabilité de mean reversion est élevée — le temps travaille contre la position dès l'entrée. Le Gate ne bloque pas les strategies de <em>vente</em> de vol (short strangle, iron condor) qui bénéficient au contraire d'un IVR élevé.
</div>
<p>Les seuils sont configurables dans Config → onglet <em>Options — Parameters</em> avec des curseurs visuels. Deux seuils distincts : <strong>IVR Alert</strong> (jaune, avertissement) et <strong>IVR Extreme</strong> (rouge, blocage).</p>
<h3 id="s3-5">3.5 Watchlist IV Dynamique</h3>
<p>La watchlist IV est stockée en base de données (table <code>iv_watchlist</code>) et non plus hardcodée. Elle supporte 3 types de tickers :</p>
<table>
<thead><tr><th>Type</th><th>Couleur badge</th><th>Source</th><th>Bootstrap auto</th></tr></thead>
<tbody>
<tr><td><strong>Builtin</strong></td><td>Gris</td><td>18 tickers préconfigurés à l'initialisation (GLD, SPY, XLE, TLT…)</td><td>Non (déjà bootstrappés)</td></tr>
<tr><td><strong>Auto</strong></td><td>Bleu</td><td>Détectés automatiquement par le cycle : nouveaux <code>underlying</code> dans les suggestions IA non encore en watchlist</td><td>Oui — 1 an d'historique en background</td></tr>
<tr><td><strong>Manual</strong></td><td>Vert</td><td>Ajoutés manuellement par le trader via le WatchlistManager dans Options Lab</td><td>Oui — 1 an d'historique en background</td></tr>
</tbody>
</table>
<p>L'ajout d'un ticker déclenche immédiatement un bootstrap en arrière-plan (1 an de données yfinance pour l'IV historique). Une fois bootstrappé, l'IV Rank devient fiable. Avant bootstrap : affiché en orange avec mention <em>"Insufficient IV history"</em>.</p>
<div class="page-break"></div>
<!-- SECTION 4 -->
<h2 id="s4">4. <span class="badge badge-p2">Phase 2</span> — Fiabilité &amp; Calibration</h2>
<h3 id="s4-1">4.1 Pattern Reliability Score</h3>
<p>Le Pattern Reliability Score (PRS) mesure la fiabilité statistique d'un pattern basé sur son historique de trades réels. Il pénalise les petits échantillons et récompense les win rates élevés sur de nombreux trades.</p>
<h4>Formule</h4>
<div class="formula-box">
Score_Fiabilité = win_rate × log(n + 1)
où :
win_rate = proportion de trades gagnants (0.0 à 1.0)
n = nombre total de trades sur ce pattern
log() = logarithme naturel (base e)
Propriétés :
- Score nul si win_rate = 0 (aucun trade gagnant)
- Score croît lentement avec n (diminishing returns de l'expérience)
- n=4 → log(5) = 1.61 · n=28 → log(29) = 3.37 (seulement 2× plus, pour 7× plus de trades)
</div>
<h4>Table simulée — Patterns avec Scores de Fiabilité</h4>
<table class="sim-table">
<thead><tr><th>Pattern</th><th>Trades</th><th>Wins</th><th>Win Rate</th><th>PnL Moyen</th><th>Score Fiabilité</th><th>Statut</th></tr></thead>
<tbody>
<tr><td>Choc Pétrolier Moyen-Orient</td><td>28</td><td>19</td><td class="val-green">68%</td><td>+12.4%</td><td class="val-green">2.27</td><td>Fiable</td></tr>
<tr><td>Hausse Or Flight-to-Safety</td><td>19</td><td>14</td><td class="val-green">72%</td><td>+9.8%</td><td class="val-green">1.87</td><td>Fiable</td></tr>
<tr><td>Escalade Taiwan Strait</td><td>12</td><td>7</td><td class="val-amber">58%</td><td>+8.1%</td><td class="val-amber">1.28</td><td>Prometteur</td></tr>
<tr><td>Hausse Taux Fed Surprise</td><td>7</td><td>3</td><td class="val-red">43%</td><td>-2.3%</td><td class="val-red">0.55</td><td>Faible</td></tr>
<tr><td>Crise Dollar Marchés Émergents</td><td>4</td><td>3</td><td class="val-green">75%</td><td>+18.2%</td><td class="val-amber">1.04 ⚠</td><td>Petit échantillon</td></tr>
<tr><td>Pénurie Blé Ukraine Escalade</td><td>3</td><td>1</td><td class="val-red">33%</td><td>-5.1%</td><td class="val-red">0.46 🔴</td><td>Insuffisant</td></tr>
</tbody>
</table>
<div class="example-box">
<div class="ex-header">Pourquoi 75% sur 4 trades (1.04) &lt; 68% sur 28 trades (2.27) ?</div>
<div class="ex-body">
<div class="formula-box">
"Crise Dollar EM" : 0.75 × log(4+1) = 0.75 × 1.609 = 1.04
"Choc Pétrolier" : 0.68 × log(28+1) = 0.68 × 3.367 = 2.27
</div>
<p>Avec seulement 4 trades, l'intervalle de confiance binomial à 95% pour un win rate de 75% est [19.4%, 99.4%]. C'est extrêmement large. Le vrai win rate pourrait tout aussi bien être 20% ou 99%.</p>
<p>Avec 28 trades, l'intervalle est [48.8%, 83.1%] — beaucoup plus informative. La formule reflète naturellement cette réalité : le score "achète" de la crédibilité au fil des trades.</p>
<div class="callout amber">
<div class="label">Règle du Système</div>
Patterns avec n &lt; 5 → badge "⚠ petit échantillon" visible dans l'UI. Patterns avec n &lt; 3 → exclus des suggestions automatiques (flag <code>score_insuffisant = True</code> en DB).
</div>
</div>
</div>
<h3 id="s4-2">4.2 Contre-Thèses &amp; Invalidation</h3>
<p>Chaque pattern généré par GPT-4o inclut obligatoirement une contre-thèse et un trigger d'invalidation. C'est l'une des protections les plus importantes du système contre le biais de confirmation.</p>
<div class="example-box">
<div class="ex-header">Exemple Complet — Thèse / Contre-Thèse / Surveillance</div>
<div class="ex-body">
<table>
<tr><td style="width:30%;font-weight:700;color:#0f2d6b;">Thèse</td><td>"L'escalade en mer de Chine méridionale va perturber les routes pétrolières et faire monter XLE" → Long XLE calls $90, expiration Septembre 2026</td></tr>
<tr><td style="font-weight:700;color:#0f2d6b;">Contre-thèse</td><td>"La Chine bluff diplomatiquement pour forcer des concessions commerciales. Si les négociations reprennent, la prime de risque disparaît et le pétrole recule de 58%."</td></tr>
<tr><td style="font-weight:700;color:#dc2626;">Triggers d'invalidation</td><td>1. Annonce de pourparlers diplomatiques directs US-Chine en mer de Chine<br>2. Retrait des navires militaires chinois de la zone contestée<br>3. Déclaration conjointe ASEAN de "de-escalation"<br>4. Brent recule de plus de 4% en une séance</td></tr>
<tr><td style="font-weight:700;color:#d97706;">Probabilité d'invalidation</td><td>35% (estimée par GPT-4o, à ajuster si des nouvelles émergent)</td></tr>
<tr><td style="font-weight:700;color:#16a34a;">Action si trigger détecté</td><td>Alerte rouge dans l'interface, suggestion de fermer ou de réduire la position de 50%</td></tr>
</table>
</div>
</div>
<h4>Surveillance Automatique des Triggers</h4>
<p>À chaque cycle (6h), le système passe les titres RSS dans GPT-4o-mini avec les triggers stockés en base pour chaque position ouverte. Si une correspondance sémantique est détectée (score cosinus &gt; 0.82), une alerte d'invalidation est générée.</p>
</div>
</div>
</div>
<h3 id="s4-3">4.3 Score de Brier &amp; Calibration</h3>
<p>Le score de Brier mesure la précision des probabilités estimées par GPT-4o. Un modèle bien calibré annonce 70% quand la réalité est vraie 70% du temps.</p>
<div class="formula-box">
Brier Score = (1/N) × Σ (prédiction_i - résultat_i)²
Interprétation :
Brier &lt; 0.10 → Excellent
Brier 0.100.20 → Bon à modéré
Brier 0.200.33 → Moyen
Brier = 0.25 → Équivalent à une pièce de monnaie aléatoire
Brier &gt; 0.33 → Pire qu'aléatoire
</div>
<h4>Table de calibration simulée</h4>
<table class="sim-table">
<thead><tr><th>Bucket Prédit</th><th>Nb Trades</th><th>Taux Réel</th><th>Biais</th><th>Diagnostic</th></tr></thead>
<tbody>
<tr><td>1020%</td><td>8</td><td class="val-green">13%</td><td>-3%</td><td>Bien calibré</td></tr>
<tr><td>3040%</td><td>18</td><td class="val-green">38%</td><td>-1%</td><td>Excellent</td></tr>
<tr><td>5060%</td><td>31</td><td class="val-amber">52%</td><td>-6%</td><td>Légèrement surconfiant</td></tr>
<tr><td>6070%</td><td>28</td><td class="val-red">42%</td><td>-23%</td><td class="val-red">SURCONFIANT</td></tr>
<tr><td>8090%</td><td>14</td><td class="val-red">61%</td><td>-25%</td><td class="val-red">TRÈS SURCONFIANT</td></tr>
</tbody>
</table>
<div class="formula-box">
Brier Score simulé ≈ 0.18 → "Modérément calibré"
Bucket 30-40%: 18 × (0.35 - 0.38)² = 18 × 0.0009 = 0.016
Bucket 60-70%: 28 × (0.65 - 0.42)² = 28 × 0.0529 = 1.481
Bucket 80-90%: 14 × (0.85 - 0.61)² = 14 × 0.0576 = 0.806
Total / 157 trades ≈ 0.18
</div>
<div class="callout red">
<div class="label">Interprétation Clé</div>
Quand GPT-4o annonce 8090%, il n'a raison qu'à 6167% du temps. Ne jamais miser plus sur un pattern parce que son score est de 85% vs 65% — la différence réelle de performance est bien plus faible. Le système corrige cela via l'ajustement bayésien (Section 6.1).
</div>
<h3 id="s4-4">4.4 Demi-vie des Insights KB</h3>
<p>Les insights de la Knowledge Base ont une durée de vie limitée. Le système gère une demi-vie de 180 jours (configurable) pour déprécier automatiquement les insights anciens.</p>
<div class="formula-box">
Poids_actuel = poids_initial × e^(-λ × âge_jours)
λ = ln(2) / demi_vie = 0.693 / 180 = 0.00385
Après 180j : poids = 0.50
Après 360j : poids = 0.25
Après 540j : poids = 0.125 → insight marginalisé
</div>
<table>
<thead><tr><th>Date</th><th>Âge</th><th>Poids</th><th>Statut</th></tr></thead>
<tbody>
<tr><td>Oct 2025 (création)</td><td>0j</td><td>1.00</td><td>Actif, prioritaire</td></tr>
<tr><td>Jan 2026</td><td>90j</td><td>0.71</td><td>Actif, légèrement déprécié</td></tr>
<tr><td>Avr 2026</td><td>180j</td><td>0.50</td><td>Demi-vie atteinte</td></tr>
<tr><td>Oct 2026</td><td>360j</td><td>0.25</td><td>Archivage recommandé</td></tr>
</tbody>
</table>
<p><strong>Règle système :</strong> Si poids &lt; 0.15 ET l'événement géopolitique n'est plus détecté dans les flux RSS depuis 30 jours → insight archivé automatiquement et exclu du Super Contexte.</p>
<div class="page-break"></div>
<!-- SECTION 5 -->
<h2 id="s5">5. <span class="badge badge-p3">Phase 3</span> — Portfolio &amp; Risk Engine</h2>
<h3 id="s5-1">5.1 Vue Portefeuille Consolidée</h3>
<table class="sim-table">
<thead><tr><th>Position</th><th>Secteur</th><th>Score Entrée</th><th>P&amp;L</th><th>% Horizon</th><th>Taille €</th><th>Statut</th></tr></thead>
<tbody>
<tr><td>Long XLE call spread $90/$98 Sept26</td><td>Énergie</td><td class="val-green">78</td><td class="val-green">+14.2%</td><td>67%</td><td>1,240€</td><td>Mature — surveiller sortie</td></tr>
<tr><td>Long GLD call $195 Août26</td><td>Métaux</td><td class="val-amber">62</td><td class="val-red">-3.1%</td><td>18%</td><td>820€</td><td>Début — laisser courir</td></tr>
<tr><td>Short VIX straddle $22/$28 Juil26</td><td>Indices</td><td class="val-green">71</td><td class="val-green">+8.7%</td><td>52%</td><td>980€</td><td>Mature — surveiller VIX</td></tr>
<tr><td>Long USDCAD call 1.39 Juil26</td><td>Forex</td><td class="val-red">55</td><td class="val-green">+2.3%</td><td>8%</td><td>460€</td><td>Trop tôt — patience</td></tr>
</tbody>
</table>
<h4>Concentration par Secteur</h4>
<div class="bar-chart">
<div class="bar-row"><div class="bar-label">Énergie</div><div class="bar-track"><div class="bar-fill amber" style="width:35%;">35%</div></div></div>
<div class="bar-row"><div class="bar-label">Indices</div><div class="bar-track"><div class="bar-fill blue" style="width:28%;">28%</div></div></div>
<div class="bar-row"><div class="bar-label">Métaux</div><div class="bar-track"><div class="bar-fill green" style="width:25%;">25%</div></div></div>
<div class="bar-row"><div class="bar-label">Forex</div><div class="bar-track"><div class="bar-fill purple" style="width:12%;">12%</div></div></div>
</div>
<div class="callout green">
<div class="label">Règle de Lecture</div>
Un trade en début de vie (% horizon &lt; 20%) qui perd -3% doit être ignoré — la thèse n'a pas encore eu le temps de se déployer. Un trade mature (&gt;60% horizon) en profit doit être suivi de près pour une sortie partielle avant l'accélération du time decay.
</div>
<h3 id="s5-2">5.2 Risk Cluster Engine</h3>
<p>Deux positions dans des secteurs différents peuvent être exposées au même facteur de risque sous-jacent. Le Cluster Engine identifie ces dépendances cachées.</p>
<table>
<thead><tr><th>Position</th><th>Facteur Géopolitique</th><th>Facteur Inflation</th><th>Facteur Dollar</th><th>Facteur Liquidité</th></tr></thead>
<tbody>
<tr><td>Long XLE call spread</td><td>60%</td><td>40%</td><td>0%</td><td>0%</td></tr>
<tr><td>Long GLD call</td><td>20%</td><td>50%</td><td>80%</td><td>0%</td></tr>
<tr><td>Short VIX straddle</td><td>0%</td><td>0%</td><td>0%</td><td>80%</td></tr>
<tr><td>Long USDCAD call</td><td>0%</td><td>20%</td><td>70%</td><td>10%</td></tr>
</tbody>
</table>
<div class="formula-box">
Exposition consolidée Facteur Dollar :
0.35×0% + 0.25×80% + 0.28×0% + 0.12×70%
= 0% + 20% + 0% + 8.4% = 28%
(Avec pondération par valeur de position : Énergie 35%, Métaux 25%, Indices 28%, Forex 12%)
Facteur Géopolitique : 0.35×60% + 0.25×20% = 21% + 5% = 26%
Facteur Dollar : 0.25×80% + 0.12×70% = 20% + 8.4% = ~28%
Facteur Inflation : 0.35×40% + 0.25×50% + 0.12×20% = ~29%
Facteur Liquidité : 0.28×80% + 0.12×10% = ~24%
</div>
<div class="callout red">
<div class="label">Alerte Concentration — Facteur Dollar 53%</div>
Dans notre exemple simulé, si l'on comptabilise GLD (fortement anti-dollar) et USDCAD (direct forex dollar), le facteur dollar dépasse 53% du portefeuille — au-dessus du seuil configuré de 40%.<br><br>
<strong>Injection dans le méga-prompt :</strong> "⚠️ Facteur dollar saturé (53%) — pénaliser fortement les nouveaux patterns dépendants du dollar. Taille Kelly réduite de 50% sur tout pattern à facteur dollar."
</div>
<h3 id="s5-3">5.3 Position Sizing — Kelly Fractionnel</h3>
<div class="formula-box">
Kelly complet : f* = (p × G - (1 - p)) / G
Exemple — Pattern "Choc Pétrolier Moyen-Orient" :
p = 0.68 (win rate sur 28 trades)
G = 2.50 (gain moyen +12.4% / perte moyenne -4.9%)
f* = (0.68 × 2.50 - 0.32) / 2.50
= (1.70 - 0.32) / 2.50
= 1.38 / 2.50
= 0.552 = 55.2% → Kelly complet
Kelly fractionnel (×1/3) : 55.2% × 0.333 = 18.4%
Ajustement cluster (facteur géopolitique saturé) :
18.4% / 2 = 9.2%
Capital disponible 10,000€ → Taille : 920€
</div>
<table>
<thead><tr><th>Approche</th><th>Fraction Kelly</th><th>Taille (10k€)</th><th>Drawdown max espéré</th><th>Recommandation</th></tr></thead>
<tbody>
<tr><td>Kelly Complet</td><td>55.2%</td><td>5,520€</td><td>-65% (ruine possible)</td><td class="val-red">JAMAIS</td></tr>
<tr><td>Kelly × 1/2</td><td>27.6%</td><td>2,760€</td><td>-38%</td><td class="val-red">Agressif</td></tr>
<tr><td class="val-green">Kelly × 1/3</td><td class="val-green">18.4%</td><td class="val-green">1,840€</td><td class="val-green">-22%</td><td class="val-green">Recommandé</td></tr>
<tr><td>Kelly × 1/4</td><td>13.8%</td><td>1,380€</td><td>-15%</td><td class="val-amber">Conservateur</td></tr>
<tr><td>Kelly × 1/3 + ajust. cluster</td><td>9.2%</td><td>920€</td><td>-10%</td><td class="val-green">Appliqué ici</td></tr>
</tbody>
</table>
<div class="callout amber">
<div class="label">Pourquoi pas le Kelly Complet ?</div>
Le Kelly Complet maximise log(richesse) théoriquement mais produit des drawdowns de 5070% psychologiquement insoutenables. Il suppose aussi une connaissance exacte de p et G. Kelly/3 donne 75% de la croissance théorique pour 30% du risque — consensus académique (Ed Thorp, Poundstone).
</div>
<h3 id="s5-4">5.4 HHI &amp; Score de Diversification</h3>
<div class="formula-box">
HHI = Σ (part_secteur_i)²
Portefeuille actuel :
HHI = 0.35² + 0.25² + 0.28² + 0.12²
= 0.1225 + 0.0625 + 0.0784 + 0.0144
= 0.278
N effectif = 1 / 0.278 = 3.6 positions indépendantes
Score Diversification = 3.6 / 4 = 90% → Bien diversifié
Seuils :
HHI &lt; 0.25 → Bien diversifié
HHI 0.250.35 → Acceptable
HHI &gt; 0.35 → CONCENTRÉ — alerte
</div>
<div class="callout blue">
<div class="label">Interprétation N Effectif</div>
Avec 4 positions réelles, le N effectif est 3.6. Le portefeuille se comporte comme 3.6 positions indépendantes — la légère corrélation entre énergie et inflation (XLE et GLD tous deux sensibles à l'inflation) explique pourquoi on n'atteint pas le maximum théorique de 4.0.
</div>
<h3 id="s5-5">5.5 Drawdown Attendu</h3>
<div class="formula-box">
DD_attendu = Σ (allocation_facteur_i × volatilité_facteur_i)
Volatilités historiques annualisées :
Géopolitique : 40% · Inflation : 30% · Dollar : 25% · Liquidité : 35%
DD_attendu = 0.26×40% + 0.29×30% + 0.28×25% + 0.24×35%
= 10.4% + 8.7% + 7.0% + 8.4% = 34.5%
Correction diversification (HHI=0.278) :
DD_effectif ≈ 34.5% × √(N_effectif) / N_réel
≈ 34.5% × √3.6 / 4
≈ 34.5% × 0.474 ≈ 16.4%
Seuil d'alerte Risk Committee : &gt; 25% → ici 16.4% = zone acceptable
</div>
<div class="page-break"></div>
<!-- SECTION 5b -->
<h2 id="s5b">5b. Pattern Convergence Engine</h2>
<p>Le Pattern Convergence Engine enrichit chaque suggestion IA avec une direction de signal et un score de conviction calculés par convergence multi-source (géopolitique + macro + technique). Il alimente l'onglet <strong>Trade Ideas</strong> du Trading Journal.</p>
<h3 id="s5b-1">5b.1 Les 8 Catégories Thématiques</h3>
<p>Chaque pattern et chaque trade idea est classé dans l'une des 8 catégories signal et 8 catégories de déclencheur :</p>
<table>
<thead><tr><th>Catégorie signal</th><th>Description</th><th>Exemples de patterns typiques</th></tr></thead>
<tbody>
<tr><td>⚔️ <strong>Military</strong></td><td>Escalades militaires, conflits armés, déploiements de forces</td><td>Middle East Military Escalation, Taiwan Strait Tensions</td></tr>
<tr><td>🚫 <strong>Sanctions</strong></td><td>Sanctions économiques, embargos, restrictions de commerce</td><td>Russia Energy Sanctions, Iran Oil Embargo</td></tr>
<tr><td>🗳️ <strong>Elections</strong></td><td>Élections majeures, changements de pouvoir, instabilité politique</td><td>US Election Volatility, EM Political Risk</td></tr>
<tr><td>🌪️ <strong>Disaster</strong></td><td>Catastrophes naturelles, disruptions infrastructure critique</td><td>Gulf Hurricane Season, Earthquake Supply Chain</td></tr>
<tr><td>🏥 <strong>Health</strong></td><td>Crises sanitaires, pandémies, disruptions pharmaceutiques</td><td>Pandemic Risk Premium, Pharma Supply Squeeze</td></tr>
<tr><td>⚠️ <strong>Resources</strong></td><td>Pénuries matières premières, disruptions supply chain, pricing power</td><td>Copper Scarcity, LNG Supply Crunch</td></tr>
<tr><td>🤝 <strong>Trade</strong></td><td>Guerres commerciales, tarifs, accords bilatéraux</td><td>US-EU Trade Tensions, ASEAN Trade Realignment</td></tr>
<tr><td>💬 <strong>Speech</strong></td><td>Discours de banquiers centraux, déclarations politiques, Fed pivots</td><td>Fed Hawkish Surprise, ECB Pivot Signal</td></tr>
</tbody>
</table>
<h3 id="s5b-2">5b.2 Signal Direction &amp; Conviction Score</h3>
<p>Chaque pattern reçoit un <strong>signal_direction</strong> et un <strong>conviction_score</strong> calculés à l'issue du scoring IA :</p>
<div class="formula-box">
signal_direction : "bullish" | "bearish" | "volatility" | "neutral"
bullish → expected_move &gt; 0 et stratégie directionnelle haussière
bearish → expected_move &lt; 0 et stratégie directionnelle baissière
volatility → straddle / strangle / long vol — parie sur l'amplitude, pas la direction
neutral → iron condor / calendar spread — range-bound
conviction_score (0100) :
= (score_ia / 100 × 40) — poids score IA
+ (alignment_score / 25 × 30) — poids alignement news IA
+ (reliability_score / 3 × 20) — poids fiabilité historique
+ (tech_confirmation × 10) — bonus si RSI + MA confirment
</div>
<table class="sim-table">
<thead><tr><th>Pattern</th><th>Direction</th><th>Conviction</th><th>Score IA</th><th>Alignement</th><th>Fiabilité</th></tr></thead>
<tbody>
<tr><td>US-Iran Diplomatic Shift</td><td>📊 Volatility</td><td class="val-green">78</td><td>60</td><td>+18</td><td>2.27</td></tr>
<tr><td>Iran Strait Tensions</td><td>🐂 Bullish</td><td class="val-green">71</td><td>60</td><td>+12</td><td>1.87</td></tr>
<tr><td>China Economic Slowdown</td><td>🐻 Bearish</td><td class="val-amber">55</td><td>55</td><td>-5</td><td>1.04</td></tr>
<tr><td>Fed Hawkish Surprise</td><td>🐻 Bearish</td><td class="val-amber">50</td><td>55</td><td>+0</td><td>0.55</td></tr>
</tbody>
</table>
<h3 id="s5b-3">5b.3 Trade Ideas — Onglet Journal</h3>
<p>L'onglet <strong>Trade Ideas</strong> du Trading Journal présente les suggestions du dernier cycle scorées, avec des filtres avancés :</p>
<ul>
<li><strong>Filtre classe d'actif</strong> — ⚡ Energy · 🥇 Metals · 🌾 Agri · 📈 Equities · 📊 Indices · 💱 Forex</li>
<li><strong>Filtre thématique</strong> — ⚔️ Geopo · 🏦 Macro · 📐 Technical · 🛢 Supply · 🌩 Risk-off · 💸 Flows · 🌐 Geo-eco · 💳 Credit</li>
<li><strong>Top N</strong> — Top 5 / 10 / 20 / All avec tri par conviction score</li>
<li><strong>Score patterns</strong> — bouton qui relance le scoring IA sur les patterns du cycle actuel</li>
</ul>
<p>Chaque ligne affiche : pattern name · signal_direction badge · stratégie · score IA · EV + move + max/target · profil de risque · alignement macro · date d'entrée · durée barre visuelle. Un bouton 🔍 ouvre le détail complet et un bouton 🔒 loggue le trade directement.</p>
<h3 id="s5b-4">5b.4 IBKR Ticket Auto-Calculé</h3>
<p>Pour chaque trade idea ou trade ouvert dans le Journal MtM, le système génère automatiquement un ticket Interactive Brokers avec tous les paramètres pré-remplis :</p>
<div class="example-box">
<div class="ex-header">Exemple — Ticket IBKR pour "US-Iran Diplomatic Shift → Long Straddle ^GSPC"</div>
<div class="ex-body" style="font-family:'Courier New',monospace;font-size:8.5pt;line-height:1.8;">
UNDERLYING : ^GSPC (S&amp;P 500)<br>
STRIKE : $7,500 (ATM — calculé depuis prix spot au moment du trade)<br>
EXPIRY : 2026-09-19 (vendredi le plus proche à 90 jours)<br>
<br>
LEG 1 : BUY 1 CALL $7,500 · 2026-09-19 · LIMIT<br>
LEG 2 : BUY 1 PUT $7,500 · 2026-09-19 · LIMIT<br>
<br>
BUDGET : 1,000€ / 2 legs = 500€ par leg (budget Kelly calculé)<br>
TARGET : +30% (config exit default)<br>
ORDER TYPE : LIMIT (jamais market)
</div>
</div>
<p>Le <strong>strike ATM</strong> est calculé à partir du prix spot le plus récent. L'<strong>expiry</strong> est le vendredi le plus proche de <code>today + horizon_days</code>. Ce ticket est affiché dans le Dashboard (card Latest Logged Trades) et dans l'onglet Open du Journal en expand d'un trade. Il ne déclenche aucune exécution — copier-coller dans TWS.</p>
<div class="callout blue">
<div class="label">Colonnes Strike et DTE dans le Journal MtM</div>
L'onglet Open du Journal affiche deux colonnes supplémentaires : <strong>Strike</strong> (guidance ATM calculée à l'entrée) et <strong>DTE</strong> (jours restants avant expiration, calculé en temps réel). Ces colonnes permettent de voir en un coup d'œil si le trade approche de l'expiration et si le strike a de la valeur.
</div>
<div class="page-break"></div>
<!-- SECTION 6 -->
<h2 id="s6">6. <span class="badge badge-p4">Phase 4</span> — IA Probabiliste &amp; Apprentissage</h2>
<h3 id="s6-1">6.1 Mise à Jour Bayésienne</h3>
<p>La mise à jour bayésienne permet au système d'apprendre des résultats réels pour corriger les probabilités estimées par GPT-4o.</p>
<div class="formula-box">
Prior : β(α₀=1, β₀=1) — prior neutre de Jeffreys
Mise à jour :
Si win → α = α + 1
Si loss → β = β + 1
Posterior mean = α / (α + β)
IC 95% ≈ ± 1.96 × √(α×β / ((α+β)² × (α+β+1)))
</div>
<div class="example-box">
<div class="ex-header">Évolution Bayésienne — "Escalade Tarifaire US-Chine" (Prior GPT = 65%)</div>
<div class="ex-body">
<table>
<thead><tr><th>Étape</th><th>Trades</th><th>Wins</th><th>α</th><th>β</th><th>Posterior</th><th>IC 95%</th></tr></thead>
<tbody>
<tr><td>Initial (prior neutre)</td><td>0</td><td></td><td>1</td><td>1</td><td>50.0%</td><td>±35%</td></tr>
<tr><td>5 trades (3 wins)</td><td>5</td><td>3</td><td>4</td><td>3</td><td>57.1%</td><td>±28%</td></tr>
<tr><td>12 trades (8 wins)</td><td>12</td><td>8</td><td>9</td><td>5</td><td>64.3%</td><td>±18%</td></tr>
<tr><td class="val-green">28 trades (19 wins)</td><td>28</td><td>19</td><td class="val-green">20</td><td class="val-green">10</td><td class="val-green">66.7%</td><td class="val-green">±9.2%</td></tr>
</tbody>
</table>
<p><strong>Conclusion :</strong> Prior GPT (65%) et posterior (66.7%) convergent. GPT-4o était bien calibré sur ce pattern. Intervalle final : [57.5%, 75.9%].</p>
</div>
</div>
<div class="example-box">
<div class="ex-header">Dérive Massive — "Coup d'État Afrique Subsaharienne" (Prior GPT = 80%)</div>
<div class="ex-body">
<table>
<thead><tr><th>Étape</th><th>Trades</th><th>Wins</th><th>Posterior</th><th>Dérive vs Prior</th></tr></thead>
<tbody>
<tr><td>5 trades (2 wins)</td><td>5</td><td>2</td><td>42.9%</td><td class="val-red">-37.1%</td></tr>
<tr><td>10 trades (4 wins)</td><td>10</td><td>4</td><td>41.7%</td><td class="val-red">-38.3%</td></tr>
<tr><td class="val-red">15 trades (7 wins)</td><td>15</td><td>7</td><td class="val-red">47.1%</td><td class="val-red">-32.9%</td></tr>
</tbody>
</table>
<p><strong>Diagnostic :</strong> Dérive de -32.9% — GPT surestimait massivement. Biais probable : sur-représentation médiatique des coups d'état africains dans le training data. Pattern automatiquement déclassé.</p>
</div>
</div>
<h4>Table Comparative — 6 Patterns Prior vs Posterior</h4>
<table class="sim-table">
<thead><tr><th>Pattern</th><th>Prior GPT</th><th>Trades</th><th>Posterior</th><th>Dérive</th><th>Verdict</th></tr></thead>
<tbody>
<tr><td>Choc Pétrolier MO</td><td>65%</td><td>28</td><td class="val-green">66.7%</td><td>+1.7%</td><td class="val-green">Bien calibré</td></tr>
<tr><td>Hausse Or Safety</td><td>70%</td><td>19</td><td class="val-green">72.4%</td><td>+2.4%</td><td class="val-green">Bien calibré</td></tr>
<tr><td>Escalade Tarifaire US-CN</td><td>65%</td><td>12</td><td class="val-amber">58.3%</td><td>-6.7%</td><td class="val-amber">Légèrement surconfiant</td></tr>
<tr><td>Coup d'État Afrique</td><td>80%</td><td>15</td><td class="val-red">47.1%</td><td>-32.9%</td><td class="val-red">TRÈS SURCONFIANT</td></tr>
<tr><td>Recession Tech Short</td><td>55%</td><td>9</td><td class="val-green">50.0%</td><td>-5.0%</td><td class="val-green">Acceptable</td></tr>
<tr><td>Hausse Taux Fed Surprise</td><td>60%</td><td>7</td><td class="val-red">37.5%</td><td>-22.5%</td><td class="val-red">Surconfiant</td></tr>
</tbody>
</table>
<h3 id="s6-2">6.2 Clustering de Régimes K-Means</h3>
<p>Le clustering K-Means (implémenté en pur Python) identifie automatiquement le régime macroéconomique actuel.</p>
<h4>Les 7 Features</h4>
<table>
<thead><tr><th>Feature</th><th>Mesure</th><th>Signal Principal</th></tr></thead>
<tbody>
<tr><td>VIX</td><td>Niveau absolu (z-score 252j)</td><td>Stress / Panique</td></tr>
<tr><td>slope_10y3m</td><td>Spread taux 10Y - 3M</td><td>Récession (si &lt;0)</td></tr>
<tr><td>DXY_change</td><td>Variation 1 mois dollar</td><td>Risk-off si fort</td></tr>
<tr><td>Brent_change</td><td>Variation 1 mois pétrole</td><td>Inflation / Géopolitique</td></tr>
<tr><td>Gold_change</td><td>Variation 1 mois or</td><td>Flight-to-safety</td></tr>
<tr><td>Copper_change</td><td>Variation 1 mois cuivre</td><td>Demande industrielle</td></tr>
<tr><td>SPX_vs_200d</td><td>SPX / MA200 - 1</td><td>Trend bull/bear</td></tr>
</tbody>
</table>
<h4>3 Snapshots Illustratifs</h4>
<table class="sim-table">
<thead><tr><th>Date</th><th>VIX</th><th>Slope</th><th>DXY</th><th>Brent</th><th>Gold</th><th>Copper</th><th>SPX/200d</th><th>Cluster Identifié</th></tr></thead>
<tbody>
<tr><td>Oct 2022</td><td class="val-red">32</td><td class="val-red">-0.8%</td><td class="val-red">+2.1%</td><td>+4.5%</td><td class="val-red">-1.2%</td><td class="val-red">-2.3%</td><td class="val-red">-15%</td><td><strong>Cluster 2 — Récession/Risk-Off</strong></td></tr>
<tr><td>Mar 2024</td><td class="val-green">14</td><td class="val-green">+0.2%</td><td class="val-green">-0.3%</td><td>+0.5%</td><td class="val-green">+0.8%</td><td class="val-green">+1.2%</td><td class="val-green">+12%</td><td><strong>Cluster 1 — Expansion Tranquille</strong></td></tr>
<tr><td>Juin 2026</td><td class="val-amber">24</td><td class="val-red">-0.42%</td><td class="val-amber">-0.4%</td><td class="val-red">+3.1%</td><td class="val-amber">+1.2%</td><td class="val-red">-1.8%</td><td class="val-amber">-2%</td><td><strong>Cluster 0 — Stress Géopolitique</strong></td></tr>
</tbody>
</table>
<h4>Matrice de Transition Simulée</h4>
<table class="sim-table">
<thead><tr><th>De / Vers →</th><th>Expansion</th><th>Stress Géo</th><th>Récession</th><th>Stagflation</th></tr></thead>
<tbody>
<tr><td><strong>Expansion</strong></td><td class="matrix-cell-hot">68%</td><td>12%</td><td>8%</td><td>12%</td></tr>
<tr><td><strong>Stress Géo</strong></td><td>18%</td><td class="matrix-cell-hot">52%</td><td>15%</td><td>15%</td></tr>
<tr><td><strong>Récession</strong></td><td>22%</td><td>8%</td><td class="matrix-cell-hot">58%</td><td>12%</td></tr>
<tr><td><strong>Stagflation</strong></td><td>10%</td><td>20%</td><td>15%</td><td class="matrix-cell-hot">55%</td></tr>
</tbody>
</table>
<div class="callout blue">
<div class="label">Lecture Matrice</div>
En Stress Géopolitique : 52% de chance d'y rester, 18% de retour à l'Expansion. 48% de probabilité de changement de régime dans la semaine → privilégier horizons &lt; 30 jours en Stress Géo.
</div>
<h4>Détection d'Anomalies</h4>
<div class="formula-box">
Distance au centroïde = √(Σ (feature_i - centroide_i)²)
Anomalie si distance &gt; μ_distance + 3σ_distance
Exemple — Crash COVID Mars 2020 :
VIX = 48 → z-score = +4.8σ
SPX_vs_200d = -28% → z-score = -5.2σ
Distance au centroïde Récession = 6.8σ
→ 6.8σ &gt; seuil 3σ → ANOMALIE MARQUÉE
→ Exclu du calcul des centroïdes pour ne pas distordre les clusters
→ Analyse IA note : "Conditions hors-norme — historique limité disponible"
</div>
<h3 id="s6-3">6.3 Embeddings Sémantiques</h3>
<p>Avant d'ajouter un pattern à la KB, le système vérifie l'absence de doublon sémantique. Jaccard (mots communs) rate la majorité des doublons réels. Les embeddings capturent le sens.</p>
<div class="example-box">
<div class="ex-header">Exemple 1 — Doublon Manqué par Jaccard</div>
<div class="ex-body">
<p>Pattern A : "Escalade tensions Taiwan Strait" · Pattern B : "Taiwan military conflict risk"</p>
<div class="formula-box">
Jaccard : {taiwan} / {escalade,tensions,taiwan,strait,military,conflict,risk}
= 1/7 = 14% → SOUS 30% → Accepté (FAUX NÉGATIF)
Cosine : 0.89 → AU-DESSUS 0.75 → REJETÉ (CORRECT)
</div>
</div>
</div>
<div class="example-box">
<div class="ex-header">Exemple 2 — Zéro Mot Commun, Même Sens</div>
<div class="ex-body">
<p>Pattern C : "Fed rate hike cycle accelerates" · Pattern D : "Monetary policy tightening pressure"</p>
<div class="formula-box">
Jaccard : 0/9 = 0% → SOUS 30% → Accepté (FAUX NÉGATIF)
Cosine : 0.82 → AU-DESSUS 0.75 → REJETÉ (CORRECT)
</div>
</div>
</div>
<h4>Table — 5 Candidats Évalués</h4>
<table class="sim-table">
<thead><tr><th>Candidat</th><th>Pattern Existant</th><th>Jaccard</th><th>Cosine</th><th>Décision</th></tr></thead>
<tbody>
<tr><td>Escalade Taiwan Strait</td><td>Taiwan military conflict</td><td class="val-green">14%</td><td class="val-red">0.89</td><td class="val-red">REJETÉ (cosine)</td></tr>
<tr><td>Fed rate hike cycle</td><td>Monetary policy tightening</td><td class="val-green">0%</td><td class="val-red">0.82</td><td class="val-red">REJETÉ (cosine)</td></tr>
<tr><td>OPEC supply cut shock</td><td>Choc pétrolier MO</td><td class="val-green">8%</td><td class="val-red">0.78</td><td class="val-red">REJETÉ (cosine)</td></tr>
<tr><td>Crypto crash régulation</td><td>Choc pétrolier MO</td><td class="val-green">0%</td><td class="val-green">0.12</td><td class="val-green">ACCEPTÉ — nouveau pattern</td></tr>
<tr><td>Pénurie céréales Inde</td><td>Pénurie Blé Ukraine</td><td class="val-amber">22%</td><td class="val-amber">0.71</td><td class="val-green">ACCEPTÉ — distinct</td></tr>
</tbody>
</table>
<h3 id="s6-4">6.4 Analytics Dashboard</h3>
<table>
<thead><tr><th>Section</th><th>Contenu</th><th>Question Clé</th><th>Action si Problème</th></tr></thead>
<tbody>
<tr><td><strong>Calibration Brier</strong></td><td>Courbe prédit vs réalisé par bucket, score Brier global, trend 6 mois</td><td>"GPT-4o est-il trop confiant ?"</td><td>Appliquer un facteur de déflation sur scores &gt;65%</td></tr>
<tr><td><strong>Analyse Bayésienne</strong></td><td>Prior vs posterior par pattern, dérive, IC 95%, convergence</td><td>"Le modèle apprend-il dans la bonne direction ?"</td><td>Déclasser patterns avec dérive &gt;20%</td></tr>
<tr><td><strong>Clustering Régimes</strong></td><td>Projection 2D (PCA), centroides, matrice transition, anomalies</td><td>"Dans quel régime sommes-nous ?"</td><td>Si &gt;3 changements en 30j → réduire tailles</td></tr>
<tr><td><strong>Déduplication KB</strong></td><td>Heatmap similarités cosine, clusters sémantiques</td><td>"La KB a-t-elle des doublons ?"</td><td>Fusions manuelles si cosine &gt; 0.85</td></tr>
</tbody>
</table>
<div class="page-break"></div>
<!-- SECTION 7 -->
<h2 id="s7">7. Les Prompts IA — Boîte Noire Ouverte</h2>
<p>GeoOptions utilise 6 appels GPT distincts, chacun avec un rôle précis et une structure optimisée.</p>
<h3>Prompt 1 — Enrichissement News &amp; Scoring Directionnel</h3>
<span class="badge badge-mini">GPT-4o-mini</span> <span class="badge badge-db">~800 tokens · 1 appel batch jusqu'à 20 news</span>
<table>
<thead><tr><th>Élément</th><th>Contenu</th><th>Pourquoi</th></tr></thead>
<tbody>
<tr><td>Système</td><td>"Analyste géopolitique spécialisé en risques de marché financier."</td><td>Contextualise sur le cas d'usage financier, évite les analyses politiques sans lien trading</td></tr>
<tr><td>Input</td><td>Jusqu'à 20 news (titre + 150 chars résumé), indexées 0..N</td><td>Batch unique pour minimiser les appels API — réponse JSON structurée par index</td></tr>
<tr><td>Instruction</td><td>Par news : impact_score corrigé, dir_energy/metals/indices (bullish|bearish|neutral), resolution (bool), insight (1 phrase FR sur l'effet marché)</td><td>Les signaux directionnels permettent de détecter les contre-signaux sur les patterns (cessez-le-feu → pétrole baissier même si le mot "Iran" est présent)</td></tr>
<tr><td>Exclusions</td><td>Pas de contexte macro, pas d'historique de trades, pas de positions ouvertes</td><td>Évite le biais de confirmation — l'IA évalue la news indépendamment du portefeuille</td></tr>
<tr><td>Cache</td><td>Flag <code>ai_scored</code> par item — pas de double scoring sur le même cache 1h</td><td>Économie : chaque news n'est scorée qu'une fois par cycle</td></tr>
</tbody>
</table>
<div class="callout green">
<div class="label">Cas clé — Détection de contre-signal</div>
Pattern "Middle East Military Escalation → Oil Spike" (expected_move = +12%) :<br>
<strong>Avant :</strong> Un article "Gaza ceasefire agreement reached" → keyword "Gaza" présent → similarity +15% → trade suggéré bull call sur XLE.<br>
<strong>Après :</strong> GPT-4o-mini score <code>ai_dir_energy="bearish"</code>, <code>ai_resolution=true</code> → alignment = -20 pts → similarity passe de 60% à 40% → pattern downranké, badge rouge "🤖 contre-signal".
</div>
<h3>Prompt 2 — Régime Macro</h3>
<span class="badge badge-mini">GPT-4o-mini</span> <span class="badge badge-db">~800 tokens</span>
<div class="example-box">
<div class="ex-header">Structure du Prompt 2</div>
<div class="ex-body">
<pre style="font-family:'Courier New',monospace;font-size:8.5pt;white-space:pre-wrap;">SYSTÈME : "Expert en macroéconomie et cycles économiques. Classifiez le régime
actuel parmi : Expansion, Stagflation, Récession, Stress Géopolitique."
INPUT : VIX, slope 10Y-3M, DXY change, Brent change, Gold change,
Copper change, SPX vs MA200, CPI, PMI Manufacturing
OUTPUT JSON :
{
"regime_dominant": "STAGFLATION",
"score_dominant": 72,
"regimes": {"expansion": 11, "stagflation": 72, "recession": 42, "stress_geo": 63},
"indicateurs_cles": ["Brent +3.1%", "Cuivre -1.8%", "Pente -0.42%"],
"duree_regime_estimee_jours": 45
}</pre>
</div>
</div>
<div class="callout amber">
<div class="label">Anti-Biais Clé</div>
Le prompt Régime Macro ne contient aucune information sur les positions ouvertes ni sur les patterns précédents. L'IA évalue le régime indépendamment. Sinon, elle tendrait à confirmer un régime "favorable aux positions ouvertes" par biais de cohérence.
</div>
<h3>Prompt 3 — Super Contexte</h3>
<span class="badge badge-ai">GPT-4o</span> <span class="badge badge-db">~1,200 tokens input · gate 6h</span>
<table>
<thead><tr><th>Élément injecté</th><th>Source</th><th>Condition d'inclusion</th></tr></thead>
<tbody>
<tr><td>Patterns KB fiables</td><td>Table <code>knowledge_base</code></td><td>Score fiabilité &gt; 1.5 ET poids demi-vie &gt; 0.3</td></tr>
<tr><td>Trades récents fermés</td><td>Table <code>trades</code></td><td>Fermés dans les 30 derniers jours ET maturité &gt; 40%</td></tr>
<tr><td>Trades ouverts</td><td>Table <code>portfolio</code></td><td>Maturité horizon &gt; 40% (trades "informatifs")</td></tr>
<tr><td>Alertes portefeuille</td><td>Risk Engine</td><td>Toujours inclus — filtres permanents</td></tr>
<tr><td>Patterns récents refusés</td><td>Table <code>analyses_ia</code></td><td>Rejetés par le trader dans les 14 derniers jours</td></tr>
</tbody>
</table>
<h3>Prompt 4 — Méga-Prompt (Génération Patterns)</h3>
<span class="badge badge-ai">GPT-4o</span> <span class="badge badge-db">~4,500 tokens input · ~800 tokens output</span>
<div class="example-box">
<div class="ex-header">Structure du Méga-Prompt (condensé)</div>
<div class="ex-body">
<pre style="font-family:'Courier New',monospace;font-size:8pt;white-space:pre-wrap;">SYSTÈME : "Expert options trader spécialisé en géopolitique, macroéconomie et
volatilité implicite. Suggérer 3 à 5 patterns pour trader individuel ~1,000€
par position, horizon 3 mois, Interactive Brokers."
CONTEXTE MARCHÉ : [Prix, VIX, Brent, DXY, Or, pente 10Y-3M...]
RÉGIME MACRO : [Output Prompt 2 : STAGFLATION 72%...]
CONTEXTE GÉO : [Output Prompt 1 : Geo Score 68, tensions par région...]
MÉTRIQUES OPTIONS : [IV Rank, term structure, skew, PC Ratio par ticker...]
SUPER CONTEXTE : [Output Prompt 3 : patterns fiables, trades récents, risques]
CONTRAINTES OBLIGATOIRES :
- Chaque pattern inclut : ticker, stratégie (strikes estimés), probabilité 0.0-1.0,
horizon jours, contre-thèse, trigger invalidation, facteurs risque, taille Kelly%
- IV Rank doit correspondre à la stratégie (vendre vol si rank &gt;75%)
- Ne pas suggérer patterns sur facteurs saturés sans réduction taille notée
FORMAT : JSON strict avec champs définis.</pre>
</div>
</div>
<h3>Prompt 5 — Surveillance des Triggers</h3>
<span class="badge badge-mini">GPT-4o-mini</span> <span class="badge badge-db">~400 tokens · exécuté à chaque cycle</span>
<div class="formula-box">
SYSTÈME : "Évaluez si les news suivantes correspondent aux triggers
d'invalidation d'une position de trading."
INPUT : triggers de la position + titres RSS des 6 dernières heures
OUTPUT : {"triggers_détectés": [{"trigger": "...", "confidence": 0.87, "citation": "..."}]}
Seuil : confidence &gt; 0.75 → ALERTE INVALIDATION générée dans l'UI
</div>
<h3>Prompt 6 — Rapport IA Narratif</h3>
<span class="badge badge-ai">GPT-4o</span> <span class="badge badge-db">~2,000 tokens input · ~600 tokens output</span>
<p>Une fois les patterns filtrés et validés algorithmiquement, ce prompt crée le rapport narratif visible dans la page "Rapport IA". Il explique le raisonnement, les patterns refusés et les risques à surveiller.</p>
<div class="callout green">
<div class="label">Séparation Décision / Communication</div>
Le Méga-Prompt (P4) génère des données structurées pour les algorithmes. Le Rapport IA (P6) génère du texte pour le trader humain. Cette séparation évite qu'un texte persuasif n'influence la décision — les patterns sont déjà filtrés quantitativement avant la rédaction du rapport.
</div>
<div class="page-break"></div>
<!-- SECTION 8 -->
<h2 id="s8">8. Tables de la Base de Données</h2>
<h3>Groupe 1 — Données de Marché &amp; Signaux</h3>
<table>
<thead><tr><th>Table</th><th>Colonnes Clés</th><th>Rôle</th><th>Rétention</th></tr></thead>
<tbody>
<tr><td><code>market_data</code></td><td>ticker, timestamp, price, change_pct, volume, iv_current, iv_rank, iv_percentile</td><td>Prix et métriques marché par cycle</td><td>180 jours</td></tr>
<tr><td><code>geo_signals</code></td><td>timestamp, region, score, events_json, impact_oil, impact_gold, impact_usd</td><td>Scores géopolitiques par région, par cycle</td><td>365 jours</td></tr>
<tr><td><code>macro_regime</code></td><td>timestamp, regime_dominant, score_expansion, score_stagflation, score_recession, score_stress_geo, indicateurs_json</td><td>Historique des régimes macroéconomiques</td><td>Permanent</td></tr>
<tr><td><code>options_flow</code></td><td>ticker, timestamp, strike, expiration, oi_calls, oi_puts, pc_ratio, iv_term_structure_json</td><td>Open Interest et structure de la volatilité</td><td>90 jours</td></tr>
</tbody>
</table>
<h3>Groupe 2 — IA &amp; Patterns</h3>
<table>
<thead><tr><th>Table</th><th>Colonnes Clés</th><th>Rôle</th></tr></thead>
<tbody>
<tr><td><code>analyses_ia</code></td><td>id, timestamp, cycle_id, patterns_json, rapport_narratif, tokens_used, cost_usd, regime_at_time</td><td>Archive de toutes les sorties GPT-4o avec coûts</td></tr>
<tr><td><code>knowledge_base</code></td><td>id, nom, description, strategie, ticker, facteurs_risque, score_fiabilite, nb_trades, win_rate, pnl_moyen, created_at, last_updated, halflife_weight, embedding_vector</td><td>Base de patterns avec scores et embeddings sémantiques</td></tr>
<tr><td><code>pattern_performance</code></td><td>pattern_id, trade_id, resultat, pnl_pct, score_entree, regime_entree, regime_sortie</td><td>Lien entre patterns et résultats réels des trades</td></tr>
<tr><td><code>super_contexte</code></td><td>id, timestamp, contenu_text, tokens_count, last_generated_at</td><td>Cache du Super Contexte avec gate 6 heures</td></tr>
</tbody>
</table>
<h3>Groupe 3 — Portefeuille &amp; Trades</h3>
<table>
<thead><tr><th>Table</th><th>Colonnes Clés</th><th>Rôle</th></tr></thead>
<tbody>
<tr><td><code>portfolio</code></td><td>id, ticker, strategie, direction, score_entree, taille_eur, date_entree, date_expiration, pnl_actuel_pct, facteurs_risque_json, triggers_invalidation_json, statut</td><td>Positions options ouvertes (portefeuille réel IBKR) avec métadonnées complètes</td></tr>
<tr><td><code>trades</code></td><td>id, portfolio_id, date_fermeture, pnl_final_pct, raison_fermeture, notes_trader</td><td>Historique complet des trades fermés</td></tr>
<tr><td><code>trade_entry_prices</code></td><td>id, run_id, pattern_id, pattern_name, underlying, strategy, <strong>asset_class</strong>, entry_price, entry_date, score_at_entry, horizon_days, status, pnl_realized, close_price, close_reason, target_pct, stop_loss_pct</td><td>Portefeuille simulé — trades logués par le cycle IA avec suivi MtM. <code>asset_class</code> permet la surveillance de la concentration par classe. Distinct du portefeuille réel IBKR.</td></tr>
<tr><td><code>invalidation_alerts</code></td><td>id, portfolio_id, trigger_text, confidence, news_citation, timestamp, acquittee</td><td>Alertes d'invalidation détectées et leur statut</td></tr>
</tbody>
</table>
<h3>Groupe 4 — Phase 4 (IA Probabiliste) — Nouvelles Tables</h3>
<table>
<thead><tr><th>Table</th><th>Colonnes Clés</th><th>Rôle</th></tr></thead>
<tbody>
<tr><td><code>bayesian_estimates</code></td><td>pattern_id, alpha, beta, prior_gpt, posterior_mean, posterior_ic95_low, posterior_ic95_high, n_updates, last_updated</td><td>Posteriors bayésiens par pattern — le cœur de l'apprentissage</td></tr>
<tr><td><code>regime_clusters</code></td><td>timestamp, cluster_id, cluster_label, centroid_json, features_json, distance_to_centroid, is_anomaly</td><td>Historique du clustering K-Means avec coordonnées</td></tr>
<tr><td><code>brier_tracking</code></td><td>cycle_id, pattern_id, predicted_proba, actual_outcome, brier_contrib, bucket</td><td>Données brutes pour calcul du score de Brier</td></tr>
<tr><td><code>config</code></td><td>key, value, description, updated_at</td><td>Paramètres système (seuils Kelly, capital, demi-vie KB, IV Gate thresholds)</td></tr>
</tbody>
</table>
<h3>Groupe 5 — Phase 5 (Cycle Context &amp; Observabilité) — Nouvelles Tables v5.0</h3>
<table>
<thead><tr><th>Table</th><th>Colonnes Clés</th><th>Rôle</th></tr></thead>
<tbody>
<tr><td><code>system_logs</code></td><td>id, timestamp, level (DEBUG/INFO/WARNING/ERROR), source (auto_cycle / portfolio_monitor / iv_engine / scheduler…), cycle_id, ticker, message, details_json</td><td>Journal structuré de tous les événements système. Alimenté par DBLogHandler (tous les WARNING+) et log_system_event() pour les événements manuels. Rétention : purge automatique des entrées &gt;30 jours. Affiché en temps réel dans la page System Logs.</td></tr>
<tr><td><code>iv_watchlist</code></td><td>id, ticker, added_by (builtin/auto/manual), is_active, added_at, last_bootstrapped</td><td>Watchlist des tickers IV dynamique. Remplace la constante hardcodée. Seed initial de 18 tickers builtins. Tickers "auto" ajoutés par le cycle quand il détecte un nouveau sous-jacent dans les suggestions. Bootstrap 1 an déclenché à l'ajout.</td></tr>
<tr><td><code>context_snapshots</code></td><td>id, cycle_id, timestamp, macro_context_json, news_transmitted_json, patterns_scored_json, cycle_meta_json, regime, geo_score, prompt_tokens</td><td>Snapshot complet du contexte transmis à l'IA pour chaque cycle. Permet le replay historique exact depuis l'onglet AI Context de System Logs.</td></tr>
<tr><td><code>iv_history</code></td><td>ticker, date, iv_estimated, iv_rank, iv_percentile, term_structure_json, skew_pts, source (live/bootstrap)</td><td>Historique journalier de l'IV par ticker. Alimenté par le bootstrap initial (1 an) et mis à jour à chaque cycle. Base de calcul pour IV Rank et IV Percentile fiables.</td></tr>
<tr><td><code>pnl_snapshots</code></td><td>id, timestamp, regime, capital_eur, pnl_pct, pnl_eur, open_positions, closed_positions, positions_json</td><td>Snapshots horodatés du P&amp;L total du portefeuille simulé. Alimenté par le scheduler VaR/PnL. Base de la page Position History et de la courbe P&amp;L dans le Dashboard.</td></tr>
<tr><td><code>var_snapshots</code></td><td>id, timestamp, confidence, horizon_days, var_historical, var_parametric, var_monte_carlo, cvar_hist, positions_count, capital_eur, portfolio_json</td><td>Snapshots VaR calculés par le scheduler. Un snapshot par calcul (bouton Compute ou scheduler). Historique consultable dans VaR Analysis.</td></tr>
</tbody>
</table>
<div class="callout blue">
<div class="label">Colonnes ajoutées aux tables existantes (v5.0)</div>
<code>analyses_ia</code> : + <code>signal_direction</code> (bullish/bearish/volatility/neutral), <code>conviction_score</code> (0100), <code>thematic_category</code><br>
<code>trade_entry_prices</code> : + <code>strike_guidance</code> (strike ATM calculé), <code>expiry_days_at_entry</code> (DTE à l'entrée), <code>entry_price_fresh</code> (bool — prix &lt;30min)<br>
<code>knowledge_base</code> : + <code>signal_direction</code>, <code>thematic_category</code>, <code>horizon_days</code>
</div>
<div class="callout blue">
<div class="label">Relations Clés</div>
<code>portfolio.id</code><code>trades.portfolio_id</code> · <code>knowledge_base.id</code><code>pattern_performance.pattern_id</code> · <code>knowledge_base.id</code><code>bayesian_estimates.pattern_id</code> · <code>analyses_ia.id</code><code>brier_tracking.cycle_id</code>
</div>
<div class="page-break"></div>
<!-- SECTION 9 -->
<h2 id="s9">9. Guide Trader — Lire le Cockpit Page par Page</h2>
<h3>Page 1 — Dashboard</h3>
<p><strong>Regarder en premier :</strong> Bandeau supérieur — régime dominant + geo score. Si géo &gt; 60 (rouge) ou VIX &gt; 25 → journée à risque élevé.</p>
<p><strong>Quand agir :</strong> Si "Nouveaux patterns disponibles" avec score &gt; 70 → aller sur page Patterns avant l'ouverture de marché.</p>
<h3>Page 2 — Radar Géopolitique</h3>
<p><strong>Onglet Actualités — regarder en premier :</strong> Geo Score global en haut à droite (rouge ≥ 75 = extrême). Sur chaque news, cliquer pour voir l'<strong>insight IA</strong> (phrase bleue en italique), les flèches directionnelles ⛽↑ 🥇↓ 📊↓ et le badge "🕊 résolution" si l'article signale une désescalade. Impact corrigé par l'IA affiché à droite (0100).</p>
<p><strong>Onglet Patterns — regarder en premier :</strong> Patterns classés par <code>relevance</code> (= keyword matching + alignement IA). Badge vert "🤖 IA aligné" = l'IA confirme la direction du pattern. Badge rouge "🤖 contre-signal" = les news pointent dans le sens inverse — <strong>ne pas ouvrir ce trade</strong>. La pertinence de base (pure keyword) est affichée en gris sous le score ajusté.</p>
<p><strong>Quand agir :</strong> Pattern avec relevance ≥ 60% ET badge IA vert ET IV Rank du sous-jacent favorable → candidat prioritaire pour le cycle. Si badge rouge même sur relevance élevée → attendre confirmation de marché.</p>
<h3>Page 3 — Marchés</h3>
<p><strong>Regarder en premier :</strong> Brent, Or, VIX, DXY — les 4 baromètres du régime. Ensuite ETF sectoriels (XLE, GLD, TLT).</p>
<p><strong>Quand agir :</strong> Si XLE +3% ET VIX +8% le même jour → configuration "choc offre" → vérifier patterns énergie disponibles.</p>
<h3>Page 4 — Régime Macro</h3>
<p><strong>Regarder en premier :</strong> Régime dominant et le badge <strong>"stable Xj"</strong> affiché à côté du score. Un régime stable depuis 5+ jours (lissage Bayésien actif) est fiable. "0j d'historique" = premier chargement, le bootstrap est en cours.</p>
<p><strong>Comprendre le score % :</strong> Ce n'est pas une probabilité — c'est un score 0100 d'accumulation de signaux concordants, lissé sur l'historique. Un score de 65% ne signifie pas "65% de chances". Deux scénarios à 60% et 55% indiquent une ambiguïté réelle.</p>
<p><strong>Quand agir :</strong> Si deux régimes à moins de 10 points après lissage → le système maintient l'ancien dominant et le badge "stable" reste fixe. Signe de transition — ne pas ouvrir de positions fortement directionnelles.</p>
<h3>Page 5 — Options Lab</h3>
<p><strong>Regarder en premier :</strong> Tableau IV Rank. Vert (IV Rank &lt; 30%) = opportunités d'achat vol. Rouge (&gt; 75%) = opportunités de vente vol.</p>
<p><strong>Quand agir :</strong> TOUJOURS consulter avant de valider un pattern. Si le pattern suggère "long call XLE" mais IV Rank = 80% → l'achat est très cher → attendre un pullback de vol.</p>
<h3>Page 6 — Patterns IA</h3>
<p><strong>Regarder en premier :</strong> Patterns classés par score décroissant. Ne considérer que les scores &gt; 65. Vérifier taille Kelly et disponibilité en capital.</p>
<p><strong>Quand agir :</strong> Valider = enregistrer l'intention. L'exécution est sur Interactive Brokers. Cliquer "Rejeter" évite la représentation dans les 2 prochains cycles.</p>
<div class="callout red">
<div class="label">Règle d'Or</div>
Lire TOUJOURS la contre-thèse avant de valider. Si elle vous semble plus probable que la thèse, rejeter le pattern même si le score est élevé. L'IA ne connaît pas votre contexte informationnel personnel.
</div>
<h3>Page — Éditeur de Patterns Géopolitiques</h3>
<p>L'éditeur de patterns (<code>PatternEditor</code>) est la bibliothèque de tous les patterns actifs — intégrés et personnalisés. Il offre :</p>
<ul>
<li><strong>Vue grille par défaut</strong> — affichage 23 colonnes adaptatif. Basculer en vue liste via le toggle <code>⊞ / ≡</code> en haut à droite.</li>
<li><strong>Filtres par classe d'actif</strong> — chips cliquables : ⚡ Énergie · 🥇 Métaux · 🌾 Agri · 📈 Actions · 📊 Indices · 💱 Forex · 📉 Taux. Click sur le chip actif = réinitialisation.</li>
<li><strong>Tri</strong> — trois modes : <em>Date</em> (plus récent en tête, défaut), <em>Score IA</em> (meilleur score du dernier cycle en tête), <em>Prob.</em> (probabilité déclarée décroissante).</li>
<li><strong>Filtre temporel</strong> — Tout / 7j / 30j (patterns ajoutés dans la période).</li>
<li>Badge de résultat ("<em>N résultats</em>") affiché dès qu'un filtre autre que "Tous types" est actif.</li>
</ul>
<p><strong>Quand agir :</strong> Après chaque cycle IA, filtrer par classe d'actif puis trier par Score IA pour identifier les patterns les plus alignés avec le régime actuel. Utiliser le filtre "7j" pour revoir uniquement les ajouts récents de l'IA.</p>
<h3>Page 7 — Portefeuille</h3>
<p><strong>Regarder en premier :</strong> Alertes de cluster (facteur saturé) en rouge. Puis P&L des positions matures (&gt;60% horizon).</p>
<p><strong>Quand agir :</strong> Position mature en profit +15% → prise de bénéfices partielle. Perte &gt;20% avec trigger d'invalidation détecté → fermer immédiatement.</p>
<h3>Page 8 — Trading Journal</h3>
<p>Le Journal comporte <strong>7 onglets</strong> : <strong>AI Cycles</strong> · <strong>Macro Regimes</strong> · <strong>Trade Ideas</strong> · <strong>Open</strong> · <strong>Closed</strong> · <strong>Geo Alerts</strong> · <strong>Not Logged</strong>.</p>
<p><strong>Onglet Trade Ideas :</strong> Voir section 5b.3 — filtre par classe d'actif + catégorie thématique + Top N. Le ticker IBKR est accessible en expand de chaque ligne.</p>
<p><strong>Onglet Risque Sim. — Surveillance du Portefeuille Simulé :</strong></p>
<ul>
<li><strong>Répartition par classe d'actif</strong> — barres horizontales colorées (⚡ Énergie, 🥇 Métaux, 🌾 Agri, 📈 Actions, 📊 Indices, 💱 Forex, 📉 Taux) avec compteurs bull/bear par classe et pourcentage du portefeuille total.</li>
<li><strong>Alertes rouge — Conflits directionnels</strong> : le système détecte automatiquement deux trades de sens opposés sur le même sous-jacent (ex. long call EUR/USD + short put EUR/USD). Chaque conflit affiche les IDs des trades impliqués, leur direction, leur date d'entrée et le pattern associé.</li>
<li><strong>Alertes jaune — Concentration excessive</strong> : une classe d'actif représentant &gt; 35% du portefeuille simulé, ou 3+ trades sur le même sous-jacent, déclenchent une alerte de sur-exposition.</li>
<li><strong>Recommandations IA</strong> (panel bleu) : à chaque cycle, un agent GPT-4o-mini analyse les alertes détectées et génère un assessment en 2 phrases + une liste d'actions prioritaires (close_trade / rebalance / monitor) avec le sous-jacent et la raison. Mis à jour automatiquement après chaque cycle.</li>
<li>Badge rouge sur l'onglet dès qu'un conflit directionnel existe — visible sans entrer dans l'onglet.</li>
</ul>
<p><strong>Onglet Ouverts (Mark-to-Market) :</strong></p>
<ul>
<li>Chaque trade logué par le cycle affiche le <strong>P&L théorique</strong> en temps réel (prix actuel vs prix d'entrée), avec une <strong>barre Cible/Stop</strong> qui visualise la distance à l'objectif et au stop-loss.</li>
<li>Badge <code>🎯</code> = objectif de gain atteint (ex. +30%). Badge <code>🛑</code> = stop-loss déclenché (ex. -50%). Ces seuils sont configurés dans Config → "Paramètres de sortie" et peuvent être surchargés trade par trade.</li>
<li>Badge <code>⚠ NO DATA / NO ENTRY / NO LIVE</code> en ambre sur l'underlying = données de prix manquantes pour ce trade, monitoring impossible.</li>
<li>Bouton 🔒 (colonne de droite, scroll horizontal) → ouvre le modal de fermeture : saisir le prix de clôture, choisir le motif (Objectif / Stop-loss / Signal IA / Manuel), ajouter une note. Le P&L réalisé est calculé automatiquement.</li>
</ul>
<p><strong>Onglet Fermés :</strong></p>
<ul>
<li>Banderole de statistiques : <strong>win rate</strong>, <strong>P&L moyen</strong>, <strong>P&L total</strong>, <strong>meilleur trade</strong>.</li>
<li>Table complète avec dates d'entrée/sortie, durée de détention, P&L réalisé coloré, motif de fermeture, note libre.</li>
</ul>
<p><strong>Regarder en premier :</strong> Onglet <strong>Risque Sim.</strong> en premier — badge rouge sur l'onglet = conflit directionnel actif à résoudre. Puis Onglet Fermés → win rate sur les 30/60/90 derniers jours.</p>
<p><strong>Quand agir :</strong> Conflit détecté → lire la recommandation IA et décider quel trade fermer. Badge 🎯 ou 🛑 dans l'onglet Ouverts → décider de fermer ou laisser courir. Le système n'agit jamais automatiquement — la confirmation humaine est toujours requise.</p>
<div class="callout amber">
<div class="label">Philosophie Portefeuille Simulé</div>
Le portefeuille simulé (trades logués) est traité avec les mêmes outils de gestion du risque que le portefeuille réel Interactive Brokers. La surveillance de la concentration par classe d'actif et la détection des conflits directionnels sont identiques — seule la source des trades diffère (cycle IA vs exécution manuelle IBKR).
</div>
<h3>Page 9 — Rapport IA</h3>
<p><strong>Regarder en premier :</strong> Section "Risques à Surveiller" — liste les catalyseurs à calendrier connu (réunions Fed, publications PMI, élections).</p>
<p><strong>Quand agir :</strong> Si catalyseur attendu dans les 5 prochains jours, vérifier que les positions ouvertes ne sont pas directement exposées.</p>
<h3>Page 10 — Super Contexte</h3>
<p>Lecture mensuelle. Vérifier que les patterns "obsolètes" (événements &gt; 6 mois) sont archivés. Le texte narratif doit refléter la réalité actuelle, pas l'histoire.</p>
<h3>Page 11 — Analytics</h3>
<p><strong>Métriques de santé :</strong> Brier Score (viser &lt; 0.20), N effectif (viser &gt; 3.0), taux de patterns validés vs rejetés (si &lt; 30% validés → filtres trop stricts ou qualité IA insuffisante).</p>
<p><strong>Quand agir :</strong> Win rate en tendance baissière sur 3 mois → le marché a changé, revoir les paramètres.</p>
<h3>Page 12 — Analytics Avancées</h3>
<p>Usage mensuel avancé. Contrôler la courbe de calibration Brier pour détecter une surconfiance croissante. Vérifier la matrice de transition pour ajuster les horizons selon la stabilité du régime.</p>
<h3>Page 13 — Risk Dashboard</h3>
<p><strong>Regarder en premier :</strong> Alertes rouges (saturation facteur, drawdown élevé). Puis tableau Kelly par position.</p>
<p><strong>Quand agir :</strong> OBLIGATOIREMENT avant toute nouvelle position. Vérifier que l'ajout ne fait pas monter HHI &gt; 0.35 ou un facteur &gt; 50%.</p>
<h3>Page 14 — VaR Analysis</h3>
<p><strong>Regarder en premier :</strong> Les 3 cartes VaR (Historical / Parametric / Monte Carlo stressé) avec horizon 1d et confiance 95%. La VaR "stressée ×1.5" (Monte Carlo) est le pire cas — viser qu'elle reste en dessous de 2% du capital.</p>
<p><strong>Kupiec Backtest :</strong> Vérifier que le taux de violations réel (jours où la perte dépasse la VaR) reste proche du taux attendu (5% pour confiance 95%). Un taux de violations &gt;10% → le modèle sous-estime le risque → ajuster le lookback ou la volatilité par défaut.</p>
<p><strong>Quand agir :</strong> Rolling VaR en hausse sur 3 semaines consécutives → réduire les positions ouvertes ou augmenter les stops. VaR Monte Carlo &gt; 3% du capital → Risk Committee recommande de ne pas ouvrir de nouveau trade.</p>
<h3>Page 15 — Position History</h3>
<p><strong>Usage :</strong> Comparer l'état du portefeuille simulé à deux instants distincts (A/B diff). Utile pour isoler l'impact d'un cycle IA : quelles positions ont été ajoutées, lesquelles ont été clôturées, quel est l'écart de P&L.</p>
<p><strong>Quand agir :</strong> Si le diff montre des positions fermées automatiquement sans votre action → vérifier les logs système. Si une position "disparaît" entre deux snapshots → bug de cohérence à investiguer dans System Logs.</p>
<h3>Page 16 — Backtest</h3>
<p><strong>Usage :</strong> Tester la performance historique d'une stratégie options sur un sous-jacent et une période donnés. La simulation utilise les données yfinance réelles et calcule le P&L d'une position roulante.</p>
<p><strong>Limites :</strong> Le backtest ne modélise pas les coûts de transaction IBKR ni le slippage. Il simule l'achat à l'ouverture et la vente à l'expiration. Utile pour valider un pattern sur le passé, pas pour projeter le futur.</p>
<h3>Page 17 — Calendar</h3>
<p><strong>Regarder en premier :</strong> Les événements "Major" (rouge ●●●) dans les 7 prochains jours — NFP, CPI, FOMC. Ces événements font monter l'IV dans les 4872h précédentes puis la font s'effondrer après la publication (IV crush).</p>
<p><strong>Opportunity Windows :</strong> Le panneau droit liste des fenêtres d'opportunité options pré-calculées (ex: "Pre-FOMC -3d → Straddle SPY · IV rises ahead of decision"). Ces fenêtres sont statiques — à utiliser comme point de départ, pas comme signal automatique.</p>
<p><strong>Quand agir :</strong> Si un événement Major arrive dans 35 jours ET un pattern directeur sur l'indice est actif → envisager un straddle pour jouer la vol (achat avant event, vente juste avant publication).</p>
<h3>Page 18 — System Logs</h3>
<p><strong>Usage principal :</strong> Diagnostiquer les cycles qui ont échoué, les erreurs API OpenAI, les timeouts yfinance.</p>
<p><strong>Onglet System Logs :</strong> Filtre par <em>Level</em> (WARNING+/ERROR), <em>Source</em> (auto_cycle, iv_engine, portfolio_monitor), <em>Cycle ID</em>, <em>Ticker</em>, et plage de dates. Les lignes rouges = erreurs bloquantes à corriger. Les lignes orange = warnings à surveiller.</p>
<p><strong>Onglet AI Context :</strong> Sélectionner un snapshot de cycle dans la liste de gauche pour voir exactement le contexte transmis à l'IA : macro (21 champs), news transmises (top impact), patterns scorés, cycle_meta. Bouton "Replay this cycle" re-exécute le méga-prompt sur ce contexte historique.</p>
<p><strong>Quand agir :</strong> Si un cycle a produit des suggestions anormales → ouvrir le snapshot correspondant dans AI Context et analyser les inputs (régime? geo score? news dominante?). Si erreur répétée sur un ticker → vérifier si le ticker est retiré ou renommé sur yfinance.</p>
<h3>Page 19 — Configuration</h3>
<p>Révision trimestrielle : capital total, fraction Kelly, seuils de concentration.</p>
<p><strong>Onglet Options — Parameters :</strong> IV Gate thresholds (Alert / Extreme), exit defaults (target % / stop-loss %), indicateurs techniques à activer par horizon, skew threshold pour alertes directionnelles.</p>
<p>Ne jamais modifier le modèle GPT en production sans tester sur un cycle complet. Ne jamais baisser le Kelly fraction en dessous de 1/4 (tailles trop petites pour couvrir les frais IBKR).</p>
<h4>Pattern Lab (Options Lab) — Flux de Travail Détaillé</h4>
<p>La page <strong>Patterns</strong> est le cœur opérationnel de GeoOptions. Voici le flux de travail typique d'un trader après chaque cycle :</p>
<div class="flow-mini">
<div class="flow-step">1. Lire le<br>Cycle Report</div>
<div class="flow-arrow"></div>
<div class="flow-step">2. Ouvrir<br>Patterns Explorer</div>
<div class="flow-arrow"></div>
<div class="flow-step">3. Filtrer par<br>classe d'actif</div>
<div class="flow-arrow"></div>
<div class="flow-step">4. Trier par<br>Score IA ↓</div>
<div class="flow-arrow"></div>
<div class="flow-step">5. Vérifier<br>MaturityBadge</div>
<div class="flow-arrow"></div>
<div class="flow-step">6. Find Similar<br>(si nouveau)</div>
<div class="flow-arrow"></div>
<div class="flow-step">7. Log ou<br>Skip manuellement</div>
</div>
<table>
<thead><tr><th>Fonctionnalité</th><th>Ce qu'elle fait</th><th>Quand l'utiliser</th></tr></thead>
<tbody>
<tr><td><strong>Filtres class d'actif</strong></td><td>Filtrage par forex/metals/agri/energy/indices/crypto/bonds</td><td>Tous les jours, pour ne voir que les patterns pertinents au marché actif</td></tr>
<tr><td><strong>Tri Score IA / Date / Probabilité</strong></td><td>Reclasse les patterns par score du dernier cycle (desc), date de création, ou bayesian_win_rate</td><td>Après cycle — trier par Score IA pour voir quels patterns le système juge les plus opportuns aujourd'hui</td></tr>
<tr><td><strong>MaturityBadge</strong></td><td>Affiche pour chaque pattern : source (Pure AI → Data-driven), poids calibration, WR bayésien, AI estimate vs calibré</td><td>Avant de décider de logger un trade — savoir si le G dans l'EV vient de l'IA ou de données réelles</td></tr>
<tr><td><strong>Find Similar (ScanSearch)</strong></td><td>Appelle GPT-4o-mini pour comparer le pattern à tous les autres. Retourne : doublon à fusionner / contre-scénario / pattern unique</td><td>Après chaque cycle qui ajoute des nouveaux patterns — évite l'accumulation de quasi-doublons</td></tr>
<tr><td><strong>Merge (Fusionner)</strong></td><td>Fusion transactionnelle : union historical_instances, somme backtest hits, remapping de 6 tables enfants</td><td>Quand Find Similar retourne "merge_as_instance" — ne jamais fusionner des directions opposées</td></tr>
<tr><td><strong>Éditeur complet</strong></td><td>Modifier name, description, triggers, expected_move_pct, trades suggérés, historical_instances</td><td>Pour corriger un pattern généré par l'IA qui contient des erreurs de libellé ou de paramètres</td></tr>
<tr><td><strong>Suggestion IA manuelle</strong></td><td>Déclenche le prompt suggest_patterns à la demande (hors cycle)</td><td>Quand le marché évolue significativement en intra-journée et qu'on veut de nouvelles idées immédiatement</td></tr>
<tr><td><strong>Vue grille / liste</strong></td><td>Grille : aperçu rapide de nombreux patterns. Liste : détail complet avec toutes les métriques visibles</td><td>Grille pour le matin (scan rapide) · Liste pour la décision finale d'un trade</td></tr>
</tbody>
</table>
<div class="page-break"></div>
<!-- SECTION 10 -->
<h2 id="s10">10. Décisions de Conception — Pourquoi Pas Autrement ?</h2>
<table>
<thead><tr><th>Décision</th><th>Alternative Rejetée</th><th>Raison du Choix</th></tr></thead>
<tbody>
<tr><td><strong>K-Means from scratch</strong></td><td>scikit-learn KMeans</td><td>Zéro dépendance lourde. K-Means = 40 lignes Python pur pour 4 clusters sur 7 features. Scikit-learn ajoute ~50 Mo pour fonctionnalité identique. Sur VPS léger, la différence est significative.</td></tr>
<tr><td><strong>Cosine Similarity plutôt que Jaccard</strong></td><td>Jaccard, Levenshtein, TF-IDF</td><td>Les patterns géopolitiques utilisent un vocabulaire riche et synonymique. Jaccard rate les doublons sans mots communs (60% des cas testés). Cosine via embeddings OpenAI capture la sémantique complète. Disponible sans coût additionnel via l'API existante.</td></tr>
<tr><td><strong>Kelly × 1/3</strong></td><td>Taille fixe, Kelly × 1/2, Kelly complet</td><td>Taille fixe ignore l'edge du pattern. Kelly complet = draws de 60%+ psychologiquement insoutenables. Kelly × 1/3 = consensus académique (Ed Thorp, Poundstone) : 75% de la croissance théorique pour 30% du risque.</td></tr>
<tr><td><strong>Gate 6h Super Contexte</strong></td><td>Régénérer à chaque cycle</td><td>Coût : ~0.015$ à régénérer. Sur cycles 15min : ~1.44$/jour. Gate 6h → 0.06$/jour. Le contenu change rarement sur 6h (trades ouverts et patterns KB évoluent lentement).</td></tr>
<tr><td><strong>Trades matures uniquement dans le Super Contexte</strong></td><td>Inclure tous les trades ouverts</td><td>Un trade à 3.3% de son horizon (3j/90j) n'a pas testé la thèse. L'inclure envoie un signal bruit. Les trades matures (&gt;40% horizon) ont subi l'épreuve du temps et sont véritablement informatifs.</td></tr>
<tr><td><strong>SQLite</strong></td><td>PostgreSQL, MySQL</td><td>Usage mono-utilisateur sur VPS. SQLite = sans serveur, portable (fichier unique), supporte des centaines de milliers de lignes sans problème pour ce cas d'usage. PostgreSQL est justifié pour multi-utilisateurs ou millions de lignes. <em>Migration estimée : 23j de travail (voir Section 10 note).</em></td></tr>
<tr><td><strong>Fermeture de trades en 3 modes</strong></td><td>Un seul mode (manuel)</td><td>Les trois modes (objectif %, stop-loss %, signal IA) répondent à trois comportements distincts. Un seul mode force un compromis dégradé. Les seuils configurables par trade (avec valeurs par défaut globales) évitent un réglage unique inadapté à tous les patterns.</td></tr>
<tr><td><strong>Confirmation humaine toujours requise</strong></td><td>Fermeture automatique sur signal</td><td>Un stop-loss ou signal IA peut être faux-positif (nouvelles partielles, pic intraday). L'auto-fermeture sur signal a été rejetée : risque de fermer sur noise. Le badge d'alerte + modal 1-clic est un bon compromis vitesse/contrôle.</td></tr>
<tr><td><strong>Prior neutre (α=β=1)</strong></td><td>Prior basé sur le score GPT</td><td>Si l'on utilise le score GPT comme prior et que GPT est surconfiant (&gt;65%), on initialise avec un biais. Le prior de Jeffreys (α=β=1) laisse les données réelles parler sans polluer avec la surconfiance GPT.</td></tr>
<tr><td><strong>GPT-4o-mini pour prompts simples</strong></td><td>GPT-4o pour tout</td><td>Scoring RSS et surveillance triggers ne nécessitent pas le raisonnement avancé de GPT-4o. GPT-4o-mini = 5× moins cher et suffisant pour classification et correspondance. Économie : ~60% du coût IA total.</td></tr>
<tr><td><strong>Demi-vie KB de 180 jours</strong></td><td>Poids constant, demi-vie 365j</td><td>Les événements géopolitiques ont des cycles de vie naturels. Une crise qui dure &gt; 6 mois soit se normalise soit évolue structurellement. 180 jours = délai médian empirique entre émergence d'un événement géopolitique et intégration dans les prix.</td></tr>
<tr><td><strong>4 régimes macro</strong></td><td>2 régimes (Risk-On/Off), 6 régimes</td><td>2 régimes simplifient trop (ignorent stagflation vs récession = stratégies options radicalement différentes). 6+ régimes = sous-groupes trop petits pour matrices de transition statistiquement significatives. 4 régimes = quadrants classiques macro avec historique suffisant.</td></tr>
<tr><td><strong>IV Gate blocage dur vs warning</strong></td><td>Warning seul / blocage total</td><td>Warning seul = traders ignorent souvent les alertes visuelles sous pression. Blocage total (strategy + IVR &gt; extreme) = trop restrictif, rate des opportunités valides. Deux seuils configurables (Alert / Extreme) permettent de forcer la réflexion sans interdire totalement.</td></tr>
<tr><td><strong>Watchlist IV en DB vs hardcodée</strong></td><td>Liste de constantes Python</td><td>Liste hardcodée = déploiement requis pour ajouter un ticker. DB = ajout en 1 clic depuis l'UI. L'auto-ajout (cycle détecte un nouveau sous-jacent) réduit la maintenance manuelle. Le bootstrap asynchrone évite de bloquer le cycle.</td></tr>
<tr><td><strong>Scheduler weekend-off</strong></td><td>Cycle 6h continu 24/7</td><td>Options expirent vendredi soir. Les marchés rouvrent dimanche soir (futures) mais les options classiques ne tradent pas le weekend. Cycles weekend = appels API inutiles sur données stales + suggestions sur marché fermé. Économie : ~28% du coût API hebdomadaire.</td></tr>
<tr><td><strong>Indicateurs techniques par horizon</strong></td><td>Indicateurs fixes pour tous horizons</td><td>RSI14 est optimal pour horizons &lt;30j. Pour 90j, il produit trop de faux signaux (fenêtre trop courte). RSI28 + MA100 sont calibrés pour horizons trimestriels. Appliquer le bon indicateur selon l'horizon = signal plus robuste et moins de recommandations contradictoires.</td></tr>
<tr><td><strong>Context Snapshot vs prompt dynamique</strong></td><td>Re-calculer le contexte en live à chaque lecture</td><td>Re-calculer en live = impossible de reproduire exactement les conditions d'un cycle passé (les données de marché changent). Snapshot persisté = audit exact, replay fidèle, debugging précis. Coût stockage : ~5 Ko par cycle → 7 Mo/an → négligeable en SQLite.</td></tr>
</tbody>
</table>
<div class="page-break"></div>
<!-- SECTION 11 -->
<h2 id="s11">11. Glossaire</h2>
<table>
<thead><tr><th style="width:25%">Terme</th><th>Définition</th></tr></thead>
<tbody>
<tr><td><strong>IV (Implied Volatility)</strong></td><td>Volatilité future "anticipée" par le marché, calculée en inversant la formule de Black-Scholes à partir du prix observé d'une option. Exprimée en pourcentage annualisé.</td></tr>
<tr><td><strong>IV Rank</strong></td><td>Rang de l'IV actuelle dans sa plage annuelle : (IV_actuelle - IV_min_52s) / (IV_max_52s - IV_min_52s). Score 0100. &lt;25 = cheap, &gt;75 = cher.</td></tr>
<tr><td><strong>IV Percentile</strong></td><td>Proportion des jours de l'année où l'IV était inférieure à l'IV actuelle. Plus robuste que l'IV Rank car ne dépend pas d'un seul pic ou creux extrême.</td></tr>
<tr><td><strong>Term Structure</strong></td><td>Courbe de l'IV en fonction des expirations. Contango = IV croissante (normal). Backwardation = IV décroissante (stress court terme).</td></tr>
<tr><td><strong>Skew</strong></td><td>IV_put_25delta - IV_call_25delta. Skew positif = puts plus chers = protection demand. Indique l'asymétrie anticipée par le marché.</td></tr>
<tr><td><strong>Open Interest (OI)</strong></td><td>Nombre de contrats options ouverts (non fermés). Spike d'OI sur un strike = intérêt institutionnel marqué = mur de résistance/support potentiel.</td></tr>
<tr><td><strong>Put/Call Ratio</strong></td><td>OI puts / OI calls. &gt;1.2 = sentiment défensif institutionnel. &lt;0.7 = sentiment spéculatif haussier. Indicateur contrarian.</td></tr>
<tr><td><strong>Delta</strong></td><td>Sensibilité du prix de l'option au mouvement du sous-jacent. Delta 0.25 = l'option gagne 0.25€ pour chaque +1€ du sous-jacent. Option ATM ≈ Delta 0.50.</td></tr>
<tr><td><strong>Gamma</strong></td><td>Vitesse de changement du delta. Dealer gamma négatif = les market makers amplifient les mouvements. Dealer gamma positif = ils amortissent les mouvements.</td></tr>
<tr><td><strong>Thêta (Time Decay)</strong></td><td>Érosion de la valeur d'une option avec le temps. Accélère dans les 30 derniers jours. Vendeurs bénéficient, acheteurs luttent contre lui.</td></tr>
<tr><td><strong>Kelly Criterion</strong></td><td>Formule de sizing optimal : f* = (p×G - (1-p)) / G. Maximise la croissance géométrique du capital à long terme.</td></tr>
<tr><td><strong>Kelly Fractionnel</strong></td><td>Kelly × 1/k (k=2, 3 ou 4). GeoOptions utilise k=3. Réduit le risque au détriment d'une partie de la croissance optimale, mais psychologiquement tenable.</td></tr>
<tr><td><strong>HHI (Herfindahl-Hirschman Index)</strong></td><td>Mesure de concentration : Σ(part_i)². De 0 (parfaitement diversifié) à 1.0 (monopole total). &lt;0.25 = bien diversifié, &gt;0.35 = concentré.</td></tr>
<tr><td><strong>N Effectif</strong></td><td>1/HHI. Nombre de positions "complètement indépendantes" équivalentes dans le portefeuille. 6 positions corrélées peuvent avoir N effectif = 2.5.</td></tr>
<tr><td><strong>Brier Score</strong></td><td>Métrique de calibration probabiliste : Σ(prédiction - résultat)²/N. 0 = parfait, 0.25 = équivalent aléatoire. Mesure si les probabilités annoncées correspondent aux fréquences réelles.</td></tr>
<tr><td><strong>Prior (Bayésien)</strong></td><td>Probabilité initiale avant d'observer des données. GeoOptions utilise un prior neutre (α=β=1) qui est progressivement écrasé par les données réelles.</td></tr>
<tr><td><strong>Posterior (Bayésien)</strong></td><td>Probabilité mise à jour après observation : α/(α+β). Converge vers le vrai win rate avec suffisamment de trades.</td></tr>
<tr><td><strong>Distribution Bêta</strong></td><td>Distribution sur [0,1] paramétrée par (α, β). Utilisée pour modéliser l'incertitude sur un taux de succès. Conjuguée de la vraisemblance binomiale → mise à jour analytique simple.</td></tr>
<tr><td><strong>Intervalle de Confiance IC95</strong></td><td>Plage contenant le vrai paramètre avec 95% de probabilité. IC large = incertitude élevée (peu de données). IC étroit = estimation fiable.</td></tr>
<tr><td><strong>K-Means</strong></td><td>Algorithme de clustering non supervisé. Partitionne N points en K groupes en minimisant la variance intra-groupe. Itère entre attribution au centroïde le plus proche et recalcul des centroïdes.</td></tr>
<tr><td><strong>Centroïde</strong></td><td>Centre d'un cluster K-Means. Moyenne de toutes les observations assignées à ce cluster sur toutes les dimensions. Représente le "point typique" du régime.</td></tr>
<tr><td><strong>Matrice de Transition</strong></td><td>Matrice K×K où l'entrée (i,j) = probabilité de passer du régime i au régime j. Permet d'anticiper les transitions et d'ajuster les horizons de trading.</td></tr>
<tr><td><strong>Anomalie K-Means</strong></td><td>Point à plus de 3σ du centroïde de son cluster. Signale des conditions hors-norme sans précédent récent (ex: VIX=48 en mars 2020). Exclu du calcul des centroïdes.</td></tr>
<tr><td><strong>Embedding Vectoriel</strong></td><td>Représentation d'un texte comme vecteur haute dimension (1536 dims pour text-embedding-ada-002). Textes sémantiquement similaires → vecteurs proches (angle faible).</td></tr>
<tr><td><strong>Cycle de vie du trade</strong></td><td>Séquence complète : log automatique à l'entrée (cycle IA) → suivi MtM quotidien → alerte cible/stop → fermeture manuelle avec motif → archivage dans "Fermés" avec P&L réalisé. Le système ne ferme jamais automatiquement.</td></tr>
<tr><td><strong>Exit Defaults</strong></td><td>Seuils globaux de sortie configurés dans Config : objectif de gain (défaut +30%) et stop-loss (défaut -50%) exprimés en % du sous-jacent. Chaque trade peut surcharger ces valeurs. Appliqués à la volée dans l'onglet Ouverts du Journal.</td></tr>
<tr><td><strong>P&L Réalisé vs Théorique</strong></td><td>P&L théorique = (prix_actuel - prix_entrée) / prix_entrée, calculé en temps réel. P&L réalisé = valeur enregistrée au moment de la fermeture, stockée en base. Seul le P&L réalisé entre dans les statistiques win rate / average PnL.</td></tr>
<tr><td><strong>Alert Type</strong></td><td>Statut calculé à la volée sur chaque trade ouvert : <code>target_reached</code> si P&L ≥ seuil objectif, <code>stop_loss</code> si P&L ≤ seuil stop, <code>null</code> sinon. Déclenche le badge 🎯 ou 🛑 dans le Journal.</td></tr>
<tr><td><strong>Cosine Similarity</strong></td><td>cos(θ) = (A·B)/(|A|×|B|). De -1 (opposés) à +1 (identiques). Mesure la direction (le sens) indépendamment de la norme. Seuil GeoOptions : &gt;0.75 = doublon.</td></tr>
<tr><td><strong>Jaccard Similarity</strong></td><td>|A∩B|/|AB|. Mesure les mots communs entre deux textes. Simple mais aveugle aux synonymes et au sens sémantique. Seuil GeoOptions : &gt;0.30 = doublon.</td></tr>
<tr><td><strong>DBSCAN</strong></td><td>Algorithme de clustering alternatif qui découvre des clusters de forme arbitraire et identifie les outliers. Non utilisé dans GeoOptions (K-Means suffisant pour 4 régimes fixes).</td></tr>
<tr><td><strong>Cycle Context Engine</strong></td><td>Ensemble des mécanismes (Phases 15) qui enrichissent le contexte IA : delta temporel (cycle_meta), decay des news par ancienneté, snapshot contexte, releases FRED, indicateurs techniques par horizon, price discovery. Objectif : passer d'un prompt "aveugle" à un prompt temporellement et techniquement conscient.</td></tr>
<tr><td><strong>cycle_meta</strong></td><td>Dictionnaire injecté dans chaque prompt IA contenant : hours_since_last_cycle, completed_cycles_today, cycle_number_today, market_session. Permet à GPT-4o de savoir si c'est le premier cycle de la journée ou le troisième, si le marché est ouvert, et depuis combien de temps le dernier cycle a tourné.</td></tr>
<tr><td><strong>News Decay</strong></td><td>Mécanisme de pondération temporelle des news : les articles &gt;6h voient leur impact_score multiplié par un facteur decay(age) décroissant (plancher 0.30). Évite qu'un article de la veille ne domine les suggestions du cycle actuel.</td></tr>
<tr><td><strong>IV Gate</strong></td><td>Filtre dur sur l'IV Rank avant log d'un trade. Deux seuils : Alert (jaune, taille réduite) et Extreme (rouge, blocage complet pour achat de vol). Configurable dans Config → Options Parameters. Évite d'acheter de la volatilité dans son 85ème percentile historique.</td></tr>
<tr><td><strong>Signal Direction</strong></td><td>Classification de la direction d'un pattern : bullish (expected_move &gt; 0, trade directionnel haussier), bearish (baissier), volatility (straddle/strangle — amplitude sans direction), neutral (iron condor — range-bound). Stocké dans analyses_ia.signal_direction.</td></tr>
<tr><td><strong>Conviction Score</strong></td><td>Score composite 0100 calculé par convergence de 4 sources : score IA (40%), alignement news IA (30%), fiabilité historique (20%), confirmation technique RSI/MA (10%). Utilisé pour trier les Trade Ideas dans le Journal.</td></tr>
<tr><td><strong>Pattern Convergence</strong></td><td>Moteur qui fusionne les signaux géopolitiques, macro et techniques pour produire un signal_direction et un conviction_score par pattern. Remplace le simple score IA comme critère de priorité dans les Trade Ideas.</td></tr>
<tr><td><strong>Vol Surface Regime</strong></td><td>Classification composite de l'état de la surface de volatilité : calm (SKEW normal, VVIX bas), elevated_vol (VIX &gt; 20, VVIX élevé), extreme_skew (SKEW &gt; 140 = achat massif de protection tail risk), backwardation_stress (IV30 &gt; IV90 sur plusieurs actifs). Utilisée comme 5ème bloc du macro engine.</td></tr>
<tr><td><strong>IBKR Ticket</strong></td><td>Ticket Interactive Brokers auto-calculé à partir du pattern : underlying, strike ATM (prix spot arrondi), expiry (vendredi le plus proche de today + horizon_days), legs BUY/SELL CALL/PUT, order type LIMIT, budget Kelly. Affiché dans Dashboard et Journal MtM. Copier-coller dans TWS — aucune exécution automatique.</td></tr>
<tr><td><strong>DTE (Days to Expiration)</strong></td><td>Jours restants avant la date d'expiration estimée d'un trade. Calculé en temps réel dans l'onglet Open du Journal : DTE = expiry_date - today. Affiché en rouge si DTE &lt; 14 (theta decay accéléré). Distinct de horizon_days (durée planifiée à l'entrée).</td></tr>
<tr><td><strong>Context Snapshot</strong></td><td>Enregistrement complet du contexte transmis à l'IA pour un cycle donné : 21 champs macro, news triées par impact, patterns scorés, cycle_meta. Stocké dans context_snapshots. Consultable dans AI Context tab de System Logs. Sert de base au replay historique.</td></tr>
<tr><td><strong>Watchlist IV Dynamique</strong></td><td>Table iv_watchlist en base de données remplaçant la liste hardcodée de tickers IV. Trois types : builtin (seed initial), auto (détectés par le cycle), manual (ajoutés par le trader). L'ajout déclenche un bootstrap 1 an en background.</td></tr>
<tr><td><strong>Weekend-Aware Scheduler</strong></td><td>L'APScheduler ne déclenche pas de cycle le samedi et le dimanche. Heures configurables dans Config. Évite les appels API inutiles sur des données de marché stales et les faux signaux sur des prix de vendredi soir.</td></tr>
<tr><td><strong>Straddle</strong></td><td>Achat (ou vente) simultanée d'un call et d'un put de même strike et expiration. Long straddle = parie sur un mouvement important. Short straddle = parie sur la stabilité.</td></tr>
<tr><td><strong>Strangle</strong></td><td>Comme le straddle mais avec des strikes différents (call OTM + put OTM). Moins cher à acheter. Short strangle = stratégie de vente de vol populaire en IV Rank élevé.</td></tr>
<tr><td><strong>Call Spread (Bull)</strong></td><td>Achat call strike bas + vente call strike élevé. Coût réduit vs call seul, profit plafonné. Idéal pour hausse modérée en IV élevée.</td></tr>
<tr><td><strong>OTM / ATM</strong></td><td>Out-of-The-Money : strike moins favorable que le prix actuel. At-The-Money : strike proche du prix actuel (maximum de gamma et valeur temps).</td></tr>
<tr><td><strong>Calendar Spread</strong></td><td>Vente d'option court terme + achat même strike long terme. Profite de la décroissance plus rapide du time value court. Adapté en backwardation.</td></tr>
<tr><td><strong>Contango / Backwardation</strong></td><td>Contango : IV croissante avec la maturité (marché calme). Backwardation : IV décroissante (stress aigu court terme). Signaux opposés pour les stratégies de vol.</td></tr>
<tr><td><strong>Demi-vie (Half-life)</strong></td><td>Temps nécessaire pour que le poids d'un insight KB diminue de moitié. w(t) = e^(-λt), λ = ln(2)/demi_vie. GeoOptions : 180 jours par défaut.</td></tr>
<tr><td><strong>Pattern Reliability Score</strong></td><td>win_rate × log(n+1). Pénalise les petits échantillons et valorise la cohérence sur de nombreux trades. &gt;1.5 = fiable, &lt;0.5 = insuffisant.</td></tr>
<tr><td><strong>Régime Macro</strong></td><td>État macroéconomique parmi 8 scénarios : Goldilocks, Désinflation, Soft Landing, Reflation, Stagflation, Choc Inflationniste, Récession, Crise de Liquidité. Déterminé par scoring règle-basé sur ~50 indicateurs (signaux blendés 1j/5j/10j) + lissage Bayésien sur 25 jours d'historique. Score 0100 par régime, non normalisé (pas des probabilités). Badge "stable Xj" = nombre de jours consécutifs du dominant actuel.</td></tr>
<tr><td><strong>Géo Score</strong></td><td>Score agrégé de tension géopolitique mondiale, 0100. Calculé par moyenne pondérée des scores régionaux. &gt;60 = élevé, &gt;75 = critique. Impacte directement les suggestions IA.</td></tr>
<tr><td><strong>Trigger d'Invalidation</strong></td><td>Événement spécifique dont l'occurrence remet en cause la thèse d'un trade. Surveillance automatique via RSS + GPT-4o-mini à chaque cycle. Alerte si confidence &gt; 0.75.</td></tr>
<tr><td><strong>Factor Clustering</strong></td><td>Classification des positions par facteur de risque sous-jacent (géopolitique, inflation, dollar, liquidité) pour détecter les corrélations cachées entre positions de secteurs différents.</td></tr>
<tr><td><strong>Portefeuille Simulé</strong></td><td>Ensemble des trades logués automatiquement par le cycle IA dans la table <code>trade_entry_prices</code>. Distinct du portefeuille réel Interactive Brokers. Soumis aux mêmes outils d'analyse du risque (concentration, conflits, P&L MtM). Ne déclenche aucune exécution — simulation et apprentissage uniquement.</td></tr>
<tr><td><strong>Conflit Directionnel</strong></td><td>Situation où deux trades ouverts dans le portefeuille simulé ont des directions opposées sur le même sous-jacent (ex. long call XLE + short put XLE). Détecté automatiquement par <code>portfolio_risk.py</code>. Déclenche une alerte rouge dans l'onglet Risque Sim. et une recommandation IA de fermeture.</td></tr>
<tr><td><strong>Moniteur de Portefeuille IA</strong></td><td>Agent GPT-4o-mini (Step 7b du cycle) qui analyse l'état du portefeuille simulé après chaque log de trades. Produit un assessment global + liste d'actions (close / rebalance / monitor) + suggestion de rééquilibrage. Non-bloquant et persisté dans system_logs pour affichage dans le Journal.</td></tr>
<tr><td><strong>Concentration de Classe</strong></td><td>Pourcentage d'une classe d'actif (energy, metals, agriculture, equities, indices, forex, rates) dans le portefeuille simulé total. Seuil d'alerte : &gt; 35%. Affiché sous forme de barres horizontales colorées dans l'onglet Risque Sim.</td></tr>
<tr><td><strong>Price Warning</strong></td><td>Badge ambre sur un trade dans l'onglet Ouverts : <code>NO DATA</code> (ni prix d'entrée ni prix actuel disponible), <code>NO ENTRY</code> (prix d'entrée absent), <code>NO LIVE</code> (prix actuel non récupéré). Signale que le monitoring MtM est impossible pour ce trade.</td></tr>
<tr><td><strong>Specialist Desk</strong></td><td>Configuration par asset class dans GeoOptions : fondamentaux clés, sensibilité macro par régime, seuils de prix significatifs/extrêmes, et catalogue de rapports critiques (y compris non-calendrier). Injecté dans les deux prompts IA (scoring et suggestion) pour ancrer les recommandations dans la culture réelle de chaque desk.</td></tr>
<tr><td><strong>Crédibilité Actuarielle</strong></td><td>Méthode de pondération w = n/(n+k) (k=5 dans GeoOptions) qui mesure la confiance accordée aux données observées vs l'estimation a priori. À n=5 trades : 50% observé. Inspiré de Bühlmann-Straub (actuariat). Utilisée pour blender l'estimated_move IA avec le rendement réellement observé.</td></tr>
<tr><td><strong>Calibrated Expected Move</strong></td><td>Valeur blendée de l'expected_move_pct : (1w)×ai_estimate + w×observed_avg_win_pct. Utilisée comme G dans l'EV dès que la crédibilité w &gt; 10%. Permet de corriger progressivement le biais d'optimisme de l'IA avec les données réelles.</td></tr>
<tr><td><strong>Find Similar</strong></td><td>Endpoint GPT-4o-mini qui compare un pattern de la bibliothèque contre tous les autres et retourne : merge_as_instance (doublon → fusionner), counter_scenario (direction opposée, même régime → conserver les deux), new_pattern (pas de match structurel).</td></tr>
<tr><td><strong>Pattern Merge</strong></td><td>Fusion transactionnelle de deux patterns : union des historical_instances (dédup), somme des compteurs backtest, remapping de toutes les tables FK (scores, trades, traces IA, logs), suppression du pattern discardé. Irréversible — confirmation requise.</td></tr>
<tr><td><strong>Barra de Maturité</strong></td><td>Badge visuel sur chaque card PatternExplorer montrant le degré de calibration : label source (Pure AI → Data-driven), barre dégradée indiquant le poids observé %, et comparaison chiffrée IA estimate vs Calibré.</td></tr>
</tbody>
</table>
<div class="page-break"></div>
<!-- SECTION 2c — WORKFLOW DIAGRAM REDESIGNED -->
<h2 id="s2c">2c. Workflow Complet du Cycle — Pipeline de Calcul</h2>
<p>Chaque étape du cycle automatique est documentée ici avec ses formules, données entrantes, et sorties — aucun calcul masqué, aucune boîte noire.</p>
<h3 id="s2c-diagram">2c.1 Vue Synthétique du Pipeline (8 Phases)</h3>
<style>
/* ===== PIPELINE VISUAL ===== */
.wf-pipeline { margin: 24px 0; font-family: 'Arial', sans-serif; }
.wf-phase { display: flex; gap: 0; margin-bottom: 3px; align-items: stretch; }
.wf-num { width: 36px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; font-size: 11pt; font-weight: 900; color: white; border-radius: 8px 0 0 8px; }
.wf-box { flex: 1; border-radius: 0 8px 8px 0; padding: 12px 16px; }
.wf-box-title { font-size: 9pt; font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px; margin-bottom: 6px; }
.wf-box-sub { font-size: 8.5pt; line-height: 1.5; }
.wf-chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.wf-chip { border-radius: 20px; padding: 2px 10px; font-size: 7.5pt; font-weight: 600; border: 1px solid; white-space: nowrap; }
/* Phase colors */
.wf-c1 .wf-num { background: #1d4ed8; }
.wf-c1 .wf-box { background: linear-gradient(135deg, #dbeafe, #eff6ff); border: 1.5px solid #93c5fd; }
.wf-c1 .wf-box-title { color: #1d4ed8; }
.wf-c1 .wf-chip { background: #dbeafe; border-color: #93c5fd; color: #1e3a8a; }
.wf-c2 .wf-num { background: #7c3aed; }
.wf-c2 .wf-box { background: linear-gradient(135deg, #ede9fe, #f5f3ff); border: 1.5px solid #a78bfa; }
.wf-c2 .wf-box-title { color: #7c3aed; }
.wf-c2 .wf-chip { background: #ede9fe; border-color: #a78bfa; color: #4c1d95; }
.wf-c3 .wf-num { background: #0891b2; }
.wf-c3 .wf-box { background: linear-gradient(135deg, #cffafe, #ecfeff); border: 1.5px solid #67e8f9; }
.wf-c3 .wf-box-title { color: #0891b2; }
.wf-c3 .wf-chip { background: #cffafe; border-color: #67e8f9; color: #164e63; }
.wf-c4 .wf-num { background: #d97706; }
.wf-c4 .wf-box { background: linear-gradient(135deg, #fef3c7, #fffbeb); border: 1.5px solid #fcd34d; }
.wf-c4 .wf-box-title { color: #b45309; }
.wf-c4 .wf-chip { background: #fef3c7; border-color: #fcd34d; color: #78350f; }
.wf-c5 .wf-num { background: #dc2626; }
.wf-c5 .wf-box { background: linear-gradient(135deg, #fee2e2, #fff5f5); border: 1.5px solid #fca5a5; }
.wf-c5 .wf-box-title { color: #dc2626; }
.wf-c5 .wf-chip { background: #fee2e2; border-color: #fca5a5; color: #7f1d1d; }
.wf-c6 .wf-num { background: #16a34a; }
.wf-c6 .wf-box { background: linear-gradient(135deg, #dcfce7, #f0fdf4); border: 1.5px solid #86efac; }
.wf-c6 .wf-box-title { color: #15803d; }
.wf-c6 .wf-chip { background: #dcfce7; border-color: #86efac; color: #14532d; }
.wf-c7 .wf-num { background: #0f766e; }
.wf-c7 .wf-box { background: linear-gradient(135deg, #ccfbf1, #f0fdfa); border: 1.5px solid #5eead4; }
.wf-c7 .wf-box-title { color: #0f766e; }
.wf-c7 .wf-chip { background: #ccfbf1; border-color: #5eead4; color: #134e4a; }
.wf-arrow { text-align: center; color: #94a3b8; font-size: 13pt; height: 18px; display: flex; align-items: center; justify-content: center; margin: 2px 0; }
/* ===== FORMULA CARDS ===== */
.wf-formulas { margin: 28px 0; }
.wf-fcard { border: 2px solid; border-radius: 12px; overflow: hidden; margin: 14px 0; break-inside: avoid; }
.wf-fcard-head { padding: 10px 18px; display: flex; align-items: center; gap: 10px; }
.wf-fcard-head .icon { font-size: 20pt; }
.wf-fcard-head .title { font-size: 10.5pt; font-weight: 700; }
.wf-fcard-head .subtitle { font-size: 8pt; opacity: 0.75; margin-top: 2px; }
.wf-fcard-body { padding: 14px 18px; background: white; }
.wf-formula { font-family: 'Courier New', monospace; font-size: 9pt; background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; padding: 10px 14px; margin: 8px 0; line-height: 1.7; }
.wf-formula .highlight { background: #fef3c7; padding: 0 3px; border-radius: 3px; font-weight: 700; }
.wf-formula .result { color: #15803d; font-weight: 700; }
.wf-example-table { width: 100%; font-size: 8.5pt; margin: 8px 0; border-collapse: collapse; }
.wf-example-table td { padding: 5px 10px; border-bottom: 1px solid #f1f5f9; vertical-align: middle; }
.wf-example-table tr:last-child td { border-bottom: none; }
.wf-example-table .param { font-family: 'Courier New', monospace; color: #1e3a8a; font-size: 8pt; }
.wf-example-table .val { font-weight: 700; }
.wf-example-table .val.g { color: #15803d; }
.wf-example-table .val.r { color: #dc2626; }
.wf-example-table .val.a { color: #b45309; }
.wf-note { font-size: 8pt; color: #64748b; font-style: italic; margin-top: 6px; }
.wf-separator { border: none; border-top: 2px dashed #e2e8f0; margin: 14px 0; }
/* color themes for formula cards */
.wf-fcard.blue { border-color: #93c5fd; }
.wf-fcard.blue .wf-fcard-head { background: linear-gradient(135deg, #1d4ed8, #2563eb); color: white; }
.wf-fcard.purple { border-color: #a78bfa; }
.wf-fcard.purple .wf-fcard-head { background: linear-gradient(135deg, #7c3aed, #8b5cf6); color: white; }
.wf-fcard.amber { border-color: #fcd34d; }
.wf-fcard.amber .wf-fcard-head { background: linear-gradient(135deg, #d97706, #f59e0b); color: white; }
.wf-fcard.red { border-color: #fca5a5; }
.wf-fcard.red .wf-fcard-head { background: linear-gradient(135deg, #dc2626, #ef4444); color: white; }
.wf-fcard.green { border-color: #86efac; }
.wf-fcard.green .wf-fcard-head { background: linear-gradient(135deg, #16a34a, #22c55e); color: white; }
.wf-fcard.teal { border-color: #5eead4; }
.wf-fcard.teal .wf-fcard-head { background: linear-gradient(135deg, #0f766e, #0d9488); color: white; }
.wf-fcard.cyan { border-color: #67e8f9; }
.wf-fcard.cyan .wf-fcard-head { background: linear-gradient(135deg, #0891b2, #06b6d4); color: white; }
</style>
<div class="wf-pipeline">
<div class="wf-phase wf-c1">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">Collecte Parallèle des Données</div>
<div class="wf-box-sub">Fetch simultané sur 6 sources. ThreadPoolExecutor 20 workers pour les 50 tickers macro.</div>
<div class="wf-chips">
<span class="wf-chip">📰 RSS 7 flux</span>
<span class="wf-chip">📈 yfinance 50 signaux</span>
<span class="wf-chip">🏦 FRED (CPI/NFP/taux)</span>
<span class="wf-chip">📅 Calendrier économique</span>
<span class="wf-chip">📊 IV Watchlist + OI</span>
<span class="wf-chip">🏛️ IBKR portefeuille réel</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c2">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">Traitements &amp; Calculs Intermédiaires</div>
<div class="wf-box-sub">Formules déterministes — aucune IA impliquée à ce stade.</div>
<div class="wf-chips">
<span class="wf-chip">⏱ Decay news e^(λt)</span>
<span class="wf-chip">📐 IVR = (IVmin)/(maxmin)</span>
<span class="wf-chip">🎯 Régime macro 8 scénarios</span>
<span class="wf-chip">📉 Signaux blendés 1j/5j/10j</span>
<span class="wf-chip">🔍 Price Discovery multi-actifs</span>
<span class="wf-chip">⚡ Tech: RSI · BB · MAs</span>
<span class="wf-chip">🌐 Surface vol: SKEW/VVIX</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c3">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">Chargement Specialist Desks (7 desks)</div>
<div class="wf-box-sub">Fondamentaux + sensibilité macro + rapports à venir. Injecté dans les 2 prompts suivants.</div>
<div class="wf-chips">
<span class="wf-chip">💱 Forex</span>
<span class="wf-chip">🥇 Metals</span>
<span class="wf-chip">🌾 Agri</span>
<span class="wf-chip">⚡ Energy</span>
<span class="wf-chip">📊 Indices</span>
<span class="wf-chip">₿ Crypto</span>
<span class="wf-chip">📉 Bonds</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c4">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">GPT-4o — Suggestion de Nouveaux Patterns</div>
<div class="wf-box-sub">Méga-prompt injectant la totalité du contexte. Output : 46 patterns avec expected_move_pct et trades suggérés.</div>
<div class="wf-chips">
<span class="wf-chip">🤖 GPT-4o (1 appel)</span>
<span class="wf-chip">macro + geo + news_decayed</span>
<span class="wf-chip">7 desks injectés</span>
<span class="wf-chip">reliability_map</span>
<span class="wf-chip">trade_mandate €</span>
<span class="wf-chip">portfolio_lessons</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c4">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">GPT-4o — Scoring de Tous les Patterns (4 Piliers)</div>
<div class="wf-box-sub">Score 0100 = P1(News 30) + P2(Calendrier 20) + P3(Prix 35) + P4(R/R 15). Score delta par trade : eff_score = base + delta.</div>
<div class="wf-chips">
<span class="wf-chip">P1 — News &amp; Géo (30pts)</span>
<span class="wf-chip">P2 — Calendrier (20pts)</span>
<span class="wf-chip">P3 — Prix multi-actifs (35pts)</span>
<span class="wf-chip">P4 — Risk/Reward (15pts)</span>
<span class="wf-chip">contra-signal check</span>
<span class="wf-chip">macro_bias par asset class</span>
<span class="wf-chip">desks ciblés injectés</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c5">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">IV Gate — Filtre Dur Pré-Log</div>
<div class="wf-box-sub">Règles déterministes sur IVR, skew, term structure. Verdict OK/WARN → continue. ALERT → skipped_trades (bloqué).</div>
<div class="wf-chips">
<span class="wf-chip">IVR &lt; 30 → Longs autorisés</span>
<span class="wf-chip">IVR 3060 → Spreads préférés</span>
<span class="wf-chip">IVR 6080 → Spreads seulement</span>
<span class="wf-chip">IVR &gt; 80 → Vente vol uniquement</span>
<span class="wf-chip">Skew &gt; 8% → Bear Spread forcé</span>
<span class="wf-chip">Backwardation → no vol sell</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c6">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">Profil de Risque + Calcul EV + Log</div>
<div class="wf-box-sub">eff_score ≥ min_score ET exp_move ≥ min_gain → profil retenu → EV calculé → trade_entry_prices.</div>
<div class="wf-chips">
<span class="wf-chip">p = eff_score / 100</span>
<span class="wf-chip">G = calibrated_move / 100</span>
<span class="wf-chip">ev_net = p×G (1p)</span>
<span class="wf-chip">trade_score normalisé 0100</span>
<span class="wf-chip">matched_profile stocké</span>
<span class="wf-chip">→ IBKR ticket auto-calculé</span>
</div>
</div>
</div>
<div class="wf-arrow"></div>
<div class="wf-phase wf-c7">
<div class="wf-num"></div>
<div class="wf-box">
<div class="wf-box-title">Apprentissage Post-Cycle &amp; Calibration</div>
<div class="wf-box-sub">Mis à jour uniquement sur les trades "matures" (≥35% horizon écoulé) pour éviter de biaiser les stats avec des trades non résolus.</div>
<div class="wf-chips">
<span class="wf-chip">🎲 Bayésien Beta(1+w, 1+l)</span>
<span class="wf-chip">📊 Reliability = WR×log(n+1)</span>
<span class="wf-chip">🔬 Calibration w=n/(n+5)</span>
<span class="wf-chip">📈 Brier Score calibration IA</span>
<span class="wf-chip">🎯 K-Means clusters régimes</span>
<span class="wf-chip">🧬 Embeddings sémantiques</span>
</div>
</div>
</div>
</div>
<h3 id="s2c-formulas">2c.2 Démonstration des Calculs — Simulation Complète</h3>
<p>Simulation d'un trade <strong>Bull Call Spread WTI</strong> du cycle du 23 juin 2026. Chaque valeur est calculable à la main.</p>
<div class="wf-formulas">
<!-- CARD 1: NEWS DECAY -->
<div class="wf-fcard blue">
<div class="wf-fcard-head">
<span class="icon"></span>
<div>
<div class="title">① Decay Temporel des News</div>
<div class="subtitle">Atténuation exponentielle — demi-vie 12h</div>
</div>
</div>
<div class="wf-fcard-body">
<div class="wf-formula">
λ = ln(2) / 12 = <span class="highlight">0.0578 h⁻¹</span>
decayed_score = impact_score × e<sup>−λ × age_heures</sup>
Article OPEC — age : 8h | impact brut : 0.78
→ decayed = 0.78 × e<sup>0.0578 × 8</sup> = 0.78 × 0.630 = <span class="result">0.492</span>
</div>
<table class="wf-example-table">
<tr><td>Article âgé de 8h</td><td class="param">factor = 0.630</td><td class="val g">37% vs brut</td></tr>
<tr><td>Article âgé de 24h</td><td class="param">factor = 0.250</td><td class="val a">75%</td></tr>
<tr><td>Article âgé de 48h</td><td class="param">factor = 0.063</td><td class="val r">94% (plancher 0.30 appliqué)</td></tr>
</table>
<div class="wf-note">Le plancher de 0.30 évite qu'un article majeur ne disparaisse complètement des 72h suivantes.</div>
</div>
</div>
<!-- CARD 2: REGIME MACRO -->
<div class="wf-fcard purple">
<div class="wf-fcard-head">
<span class="icon">🎯</span>
<div>
<div class="title">② Régime Macro — 8 Scénarios (50 signaux)</div>
<div class="subtitle">Scoring règle-basé + lissage Bayésien 25 jours</div>
</div>
</div>
<div class="wf-fcard-body">
<div class="wf-formula">
Signal blend (anti-bruit) :
signal_brent = 0.20 × Δ1j + 0.50 × Δ5j + 0.30 × Δ10j
→ Ex : +3.2% | +0.8% | -0.4% → blend = <span class="result">+0.92%</span> (vs +3.2% brut)
Score régime brut (exemple Stagflation) :
Brent↑↑ (+30) + Courbe plate (+10) + Or↑ (+15) + Cuivre↓ (+15) + Défensifs&gt;Tech (+8) = <span class="result">78/100</span>
Lissage Bayésien (9 jours d'historique, w_prior=45%) :
score_lissé = 0.55 × 78 + 0.45 × 65 = <span class="result">72.35</span>
</div>
<table class="wf-example-table">
<tr><td><strong>Stagflation</strong></td><td class="val g">72 pts — DOMINANT ✓</td><td>Brent↑, Or↑, courbe plate, cuivre↓</td></tr>
<tr><td>Choc Inflationniste</td><td class="val a">58 pts</td><td>Écart &lt;15pts → résistance au switch</td></tr>
<tr><td>Récession</td><td>43 pts</td><td>Courbe inversée mais VIX encore modéré</td></tr>
<tr><td>Goldilocks</td><td class="val r">21 pts</td><td>S&amp;P200j OK mais VIX élevé</td></tr>
</table>
<div class="wf-note">8 régimes : Goldilocks · Désinflation · Soft Landing · Reflation · Stagflation · Choc Inflationniste · Récession · Crise de Liquidité</div>
</div>
</div>
<!-- CARD 3: IV RANK -->
<div class="wf-fcard cyan">
<div class="wf-fcard-head">
<span class="icon">📐</span>
<div>
<div class="title">③ IV Rank &amp; IV Gate</div>
<div class="subtitle">Positionnement de la vol actuelle dans sa plage annuelle → stratégie optimale</div>
</div>
</div>
<div class="wf-fcard-body">
<div class="wf-formula">
IVR = (IV_actuelle IV_min_52s) / (IV_max_52s IV_min_52s) × 100
WTI (OVX proxy) : IV=28%, min=18%, max=52%
IVR = (28 18) / (52 18) × 100 = 10/34 × 100 = <span class="result">29.4%</span>
IV Gate → stratégie Bull Call Spread WTI :
IVR = 29% → zone "spreads légèrement préférés" → <span class="result">OK ✓</span>
(IVR &gt; 60 → WARN | IVR &gt; 80 → ALERT ✗ bloqué)
</div>
<div class="wf-note">L'IVR mesure à quelle hauteur est la vol actuelle dans sa plage 52 semaines — pas sa valeur absolue. Un IVR=80 sur XLE (IV=35%) est plus "cher" qu'un IVR=30 sur VIX (IV=28%).</div>
</div>
</div>
<!-- CARD 4: SCORING 4 PILLARS -->
<div class="wf-fcard amber">
<div class="wf-fcard-head">
<span class="icon">🎯</span>
<div>
<div class="title">④ Scoring GPT-4o — 4 Piliers (0100)</div>
<div class="subtitle">Décomposition sur le pattern "Choc Offre Pétrolier WTI"</div>
</div>
</div>
<div class="wf-fcard-body">
<table class="wf-example-table">
<tr><td><strong>P1 — News &amp; Géo (max 30)</strong></td><td></td></tr>
<tr><td class="param" style="padding-left:20px">geo (max 12)</td><td class="val g">10 — 3 articles OPEC/Russie pertinents</td></tr>
<tr><td class="param" style="padding-left:20px">eco/macro (max 10)</td><td class="val g">8 — Stagflation bullish+ énergie</td></tr>
<tr><td class="param" style="padding-left:20px">volume/récence (max 8)</td><td class="val a">5 — 2 articles &gt;6h (decay actif)</td></tr>
<tr><td><strong>P1 Total → 23/30</strong></td><td class="val g"></td></tr>
<tr><td colspan="2"><hr style="border:none;border-top:1px dashed #e2e8f0;margin:4px 0;"/></td></tr>
<tr><td><strong>P2 — Calendrier (max 20)</strong></td><td></td></tr>
<tr><td class="param" style="padding-left:20px">banques centrales (max 10)</td><td class="val a">6 — BCE dans 8j</td></tr>
<tr><td class="param" style="padding-left:20px">macro releases (max 10)</td><td class="val g">7 — EIA dans 2j (catalyseur proche)</td></tr>
<tr><td><strong>P2 Total → 13/20</strong></td><td class="val g"></td></tr>
<tr><td colspan="2"><hr style="border:none;border-top:1px dashed #e2e8f0;margin:4px 0;"/></td></tr>
<tr><td><strong>P3 — Prix multi-actifs (max 35)</strong></td><td></td></tr>
<tr><td class="param" style="padding-left:20px">énergie/commod (max 7)</td><td class="val g">7 — WTI+2.3%, OVX=42 modéré</td></tr>
<tr><td class="param" style="padding-left:20px">taux &amp; bonds (max 7)</td><td>5 — TLT stable</td></tr>
<tr><td class="param" style="padding-left:20px">forex (max 7)</td><td>4 — DXY neutre</td></tr>
<tr><td class="param" style="padding-left:20px">indices (max 7)</td><td>4 — XLE+1.8%</td></tr>
<tr><td class="param" style="padding-left:20px">VIX/IV (max 7)</td><td class="val a">5 — VIX=18, SKEW=122</td></tr>
<tr><td><strong>P3 Total → 25/35</strong></td><td class="val g"></td></tr>
<tr><td colspan="2"><hr style="border:none;border-top:1px dashed #e2e8f0;margin:4px 0;"/></td></tr>
<tr><td><strong>P4 — Risk/Reward (max 15)</strong></td><td></td></tr>
<tr><td class="param" style="padding-left:20px">asymétrie R/R (max 10)</td><td class="val g">8 — spread risque défini</td></tr>
<tr><td class="param" style="padding-left:20px">timing (max 5)</td><td class="val g">4 — EIA dans 2j</td></tr>
<tr><td><strong>P4 Total → 12/15</strong></td><td class="val g"></td></tr>
</table>
<div class="wf-formula">
Score pattern = P1 + P2 + P3 + P4 = 23 + 13 + 25 + 12 = <span class="result">73/100</span>
score_delta (Bull Call Spread) = <span class="highlight">+7</span> [meilleur trade du pattern, IVR=29 optimal spreads]
eff_score = 73 + 7 = <span class="result">80/100</span>
</div>
</div>
</div>
<!-- CARD 5: EV CALCULATION -->
<div class="wf-fcard green">
<div class="wf-fcard-head">
<span class="icon">📊</span>
<div>
<div class="title">⑤ Calcul EV avec Calibration Progressive</div>
<div class="subtitle">Pattern avec 3 trades matures (2 gagnants, avg win = +82%)</div>
</div>
</div>
<div class="wf-fcard-body">
<div class="wf-formula">
<span class="highlight">CALIBRATION (crédibilité actuarielle)</span>
k = 5, n = 3 trades matures
w = 3 / (3+5) = <span class="result">0.375</span> [37.5% poids observé]
ai_estimate = 95% | observed_avg_win = 82%
calibrated_move = (10.375)×95% + 0.375×82%
= 59.4% + 30.8% = <span class="result">90.2%</span>
<span class="highlight">CALCUL EV</span>
p = eff_score / 100 = 80/100 = 0.80
G = calibrated_move / 100 = 0.902
ev_gross = p × G = 0.80 × 0.902 = <span class="result">0.722</span> (+72.2%)
ev_net = p × G (1p) = 0.722 0.20 = <span class="result">+0.522</span> ✓ positif
trade_score = 0.722/(0.722+0.20) × 100 = <span class="result">78.3 / 100</span>
</div>
<div class="wf-note">💡 Sans calibration (pattern nouveau, w=0) : G=0.95, ev_net = 0.80×0.950.20 = +0.56. Avec calibration : +0.52. La calibration a réduit l'optimisme de l'IA de 7% — ce qui est sain.</div>
</div>
</div>
<!-- CARD 6: BAYESIAN UPDATE -->
<div class="wf-fcard teal">
<div class="wf-fcard-head">
<span class="icon">🎲</span>
<div>
<div class="title">⑥ Mise à Jour Bayésienne Post-Maturation</div>
<div class="subtitle">Prior neutre de Laplace → les données prennent progressivement le dessus</div>
</div>
</div>
<div class="wf-fcard-body">
<div class="wf-formula">
Distribution Beta : α = 1 + wins | β = 1 + losses
État actuel : 3 trades matures, 2 gagnants
α = 1+2 = 3 | β = 1+1 = 2
bayesian_win_rate = α/(α+β) = 3/5 = <span class="result">60%</span>
IC95 ≈ ±0.196 → intervalle crédible [40.4% ; 79.6%] (large → encore peu de données)
Après 20 trades, 13 gagnants :
α=14, β=8 → WR = 14/22 = <span class="result">63.6%</span>
IC95 ≈ ±0.082 → [55.4% ; 71.8%] (serré → données consolidées)
reliability_score = win_rate × log(n+1)
n=3, WR=60% → 0.60 × log(4) = <span class="result">0.83</span> (insuffisant, seuil fiable = 1.5)
n=20, WR=64% → 0.64 × log(21) = <span class="result">1.95</span> (fiable ✓)
</div>
</div>
</div>
</div>
<div class="callout green">
<div class="label">Zéro boîte noire — Traçabilité complète</div>
Toutes les valeurs de ce workflow sont stockées en DB et consultables : le score 73/100 dans <code>pattern_score_history</code>, l'EV dans <code>trade_entry_prices</code>, les raisons du skipped dans <code>skipped_trades</code>, les traces GPT dans <code>ai_reasoning_traces</code>. La page <strong>Cycle Report</strong> restitue l'intégralité du raisonnement après chaque cycle.
</div>
<div class="page-break"></div>
<!-- SECTION 12 -->
<h2 id="s12">12. Specialist Desks — Configuration par Asset Class</h2>
<p>Les Specialist Desks modélisent la réalité d'un hedge fund multi-stratégies où chaque desk (forex, metals, agri, énergie, indices, crypto, obligations) a une culture, des drivers et des rapports critiques spécifiques que le trader généraliste ne connaît pas par défaut. En Phase 6 v2, chaque desk est enrichi de données de positionnement marché en temps réel : COT CFTC, Forward Curves, Surprise Index et scorer Hawk/Dove.</p>
<h3 id="s12-1">12.1 Architecture et Tables DB</h3>
<p>Cinq tables dédiées (Phase 6) :</p>
<table>
<thead><tr><th>Table</th><th>Rôle</th><th>Colonnes clés</th></tr></thead>
<tbody>
<tr><td><code>asset_class_configs</code></td><td>Configuration par desk (7 desks)</td><td>asset_class, display_name, icon, fundamentals (TEXT), macro_sensitivity (JSON), price_delta_thresholds (JSON)</td></tr>
<tr><td><code>specialist_reports</code></td><td>Catalogue rapports manuel + auto</td><td>id, name, source, cadence, next_date, importance (13), consensus_estimate, actual_value, surprise_score, text_sentiment_score, text_sentiment_label, text_sentiment_summary</td></tr>
<tr><td><code>report_desk_links</code></td><td>Liaison N:N reports ↔ desks</td><td>report_id, asset_class</td></tr>
<tr><td><code>cot_data</code></td><td>Positionnement COT CFTC hebdo</td><td>commodity, asset_class, report_date, mm_long, mm_short, open_interest, net_position, net_pct_oi, change_net · UNIQUE(commodity, report_date)</td></tr>
<tr><td><code>forward_curve_data</code></td><td>Structure terme futures</td><td>asset, asset_class, front_price, far_price, slope_pct, structure (contango/backwardation/flat), months_spread, fetch_date · UNIQUE(asset, fetch_date)</td></tr>
</tbody>
</table>
<p><strong>7 desks pré-configurés au démarrage :</strong></p>
<table>
<thead><tr><th>Desk</th><th>Drivers fondamentaux (exemples)</th><th>Rapports liés par défaut</th></tr></thead>
<tbody>
<tr><td>💱 Forex</td><td>Divergence politique monétaire, différentiel de taux, flux carry trade, balance des paiements</td><td>FOMC, ECB, BOJ, NFP, CPI</td></tr>
<tr><td>🥇 Metals</td><td>Dollar index, tensions géopolitiques, demande EM, production minière, inflation réelle</td><td>COT, CPI</td></tr>
<tr><td>🌾 Agri</td><td>Météo, USDA stocks, cycles de plantation, demande Chine, subventions gouvernementales</td><td>WASDE, COT, China PMI, USDA Export Inspections</td></tr>
<tr><td>⚡ Energy</td><td>OPEC+, inventaires pétrole, demande transport, géopolitique Moyen-Orient, USD</td><td>EIA Petroleum, Baker Hughes Rig Count, COT</td></tr>
<tr><td>📊 Indices</td><td>Earnings saison, Fed policy, rotation sectorielle, VIX, buybacks</td><td>FOMC, NFP, CPI, Earnings</td></tr>
<tr><td>₿ Crypto</td><td>Régulation, adoption institutionnelle, flux ETF, halving BTC, risque on/off</td><td>VIX (proxy risk-off)</td></tr>
<tr><td>📉 Bonds</td><td>Politique monétaire, inflation anticipée, pente de courbe, qualité de crédit</td><td>FOMC, ECB, BOJ, CPI, NFP</td></tr>
</tbody>
</table>
<div class="callout amber">
<div class="label">Rapports non-calendrier</div>
Contrairement à la page Institutional Reports (rapports auto-fetchés), les Specialist Desks accueillent des rapports <strong>entièrement manuels</strong> qui n'existent dans aucun calendrier économique standard. Exemple : le <em>Cocoa Grinding Report</em> (trimestriel, World Cocoa Foundation) n'est pas dans Bloomberg ni Reuters — il peut être ajouté manuellement avec une date prévisionnelle et lié au desk Agri.
</div>
<h3 id="s12-2">12.2 Injection dans les Prompts IA</h3>
<p>Le bloc Specialist Desks est injecté à <strong>deux endroits</strong> du pipeline :</p>
<table>
<thead><tr><th>Prompt</th><th>Asset classes injectées</th><th>Contenu par desk</th></tr></thead>
<tbody>
<tr><td><code>score_patterns_with_context</code></td><td>Uniquement les asset classes présentes dans les patterns scorés ce cycle</td><td>Fondamentaux, macro sensitivity, price thresholds, 5 prochains rapports, COT net% OI, forward curve structure, surprise scores récents</td></tr>
<tr><td><code>suggest_patterns_from_market_context</code></td><td><strong>Tous les 7 desks</strong> systématiquement</td><td>Identique — permet à l'IA de générer des suggestions sur tous les desks même si aucun pattern existant ne les couvre</td></tr>
</tbody>
</table>
<p>Format du bloc injecté dans le prompt (exemple desk Energy enrichi v2) :</p>
<div class="arch-box">## SPECIALIST DESK — ENERGY ⚡
Key drivers: OPEC+, inventaires pétrole, demande transport, géopolitique Moyen-Orient, USD
Regime sensitivity: Choc Inflationniste → bullish | Récession → bearish | Stagflation → bullish | Goldilocks → neutral
Price thresholds: significant_week=3% extreme_week=8%
COT positioning (2026-06-16):
• WTI Crude: net +6.2% OI (non-commercial) — moderately long
• Natural Gas: net 10.6% OI — short bias, squeeze risk if supply shock
Forward curves:
• WTI: backwardation (1.2% M+3) — marché physique tendu
• Natural Gas: flat
Upcoming reports:
• EIA Petroleum Status (EIA) — 2026-06-25 [weekly]
• Baker Hughes Rig Count — 2026-06-27 [weekly]</div>
<h3 id="s12-3">12.3 COT Positioning — CFTC Socrata</h3>
<p>L'onglet <strong>COT Positioning</strong> affiche le positionnement spéculatif (non-commercial) hebdomadaire de 19 marchés, extrait directement de l'API publique CFTC (Socrata) sans clé API. Mise à jour chaque mardi soir (délai CFTC standard : données de vendredi publiées le mardi).</p>
<table>
<thead><tr><th>Asset Class</th><th>Marchés couverts</th><th>Catégorie CFTC</th></tr></thead>
<tbody>
<tr><td>⚡ Energy</td><td>WTI Crude (067651), Natural Gas (023651)</td><td>Non-commercial long/short</td></tr>
<tr><td>🥇 Metals</td><td>Gold (088691), Silver (084691), Copper (085692)</td><td>Non-commercial long/short</td></tr>
<tr><td>🌾 Agri</td><td>Corn, Wheat SRW, Soybeans, Soybean Oil, Cocoa, Coffee</td><td>Non-commercial long/short</td></tr>
<tr><td>💱 Forex</td><td>Euro, Japanese Yen, British Pound, Swiss Franc, DXY Index</td><td>Non-commercial long/short</td></tr>
<tr><td>📉 Bonds</td><td>Fed Funds (045601), US T-Bonds (020601), 10Y T-Notes (043602)</td><td>Non-commercial long/short</td></tr>
</tbody>
</table>
<div class="callout blue">
<div class="label">Architecture robustesse : codes contrat</div>
La recherche par nom de marché (ex : <code>"CRUDE OIL, LIGHT SWEET - NYMEX"</code>) est fragile — le CFTC renomme les marchés à chaque rachat d'exchange (COMEX → "COMMODITY EXCHANGE INC.", CBOT → "CHICAGO BOARD OF TRADE"). La solution retenue utilise les <strong>codes contrat CFTC</strong> (ex : 067651 pour WTI), stables depuis des décennies et indépendants du nom de l'exchange. Une seule requête Socrata suffit pour tous les 19 marchés.
</div>
<p><strong>Métriques affichées par marché :</strong></p>
<ul>
<li><code>net_pct_oi</code> = (long short) / open_interest × 100 — barre de positionnement net en % OI</li>
<li>Badge <strong>LONG</strong> (>+5%), <strong>SHORT</strong> (&lt;5%), <strong>NEUTRAL</strong></li>
<li>Flèche directionnelle avec <code>change_net</code> hebdomadaire — détecte les rotations en cours</li>
</ul>
<p><strong>Interprétation opérationnelle :</strong></p>
<table>
<thead><tr><th>Signal COT</th><th>Lecture</th><th>Implication trading</th></tr></thead>
<tbody>
<tr><td>Net > +40% OI (ex : Gold +53%)</td><td>Positionnement spéculatif extrêmement long</td><td>Trade crowded — asymétrie baissière si catalyst négatif, short squeeze improbable</td></tr>
<tr><td>Net &lt; 30% OI (ex : JPY 29%)</td><td>Positionnement spéculatif extrêmement court</td><td>Short squeeze risk élevé si pivot hawkish BOJ</td></tr>
<tr><td>Change_net > +10k/semaine</td><td>Accumulation rapide</td><td>Momentum spéculatif en train de s'installer</td></tr>
<tr><td>Change_net inversé vs net</td><td>Rotation début de retournement</td><td>Surveiller confirmation technique</td></tr>
</tbody>
</table>
<h3 id="s12-4">12.4 Forward Curves</h3>
<p>L'onglet <strong>Forward Curves</strong> compare le prix front-month au contrat M+3 pour 8 commodities (énergie + métaux + agri), via yfinance. La structure de courbe révèle la tension physique sur le marché sous-jacent.</p>
<table>
<thead><tr><th>Structure</th><th>Condition</th><th>Lecture</th><th>Implication</th></tr></thead>
<tbody>
<tr><td><strong>Backwardation</strong></td><td>slope_pct &lt; 0.15%</td><td>Front &gt; Far — livraison immédiate prime</td><td>Marché physique tendu, stockages faibles — bullish spot</td></tr>
<tr><td><strong>Contango</strong></td><td>slope_pct &gt; +0.15%</td><td>Far &gt; Front — coût de portage positif</td><td>Abondance physique, storage play — pression baissière sur spot</td></tr>
<tr><td><strong>Flat</strong></td><td>±0.15%</td><td>Équilibre offre/demande</td><td>Pas de signal directionnel fort</td></tr>
</tbody>
</table>
<p><strong>Marchés couverts :</strong> WTI Crude (CL), Natural Gas (NG), Gold (GC), Silver (SI), Copper (HG), Corn (ZC), Wheat (ZW), Soybeans (ZS). Les tickers front-month et M+3 sont construits dynamiquement avec les codes mois CFTC (F=Jan, G=Feb, H=Mar, J=Apr, K=May, M=Jun, N=Jul, Q=Aug, U=Sep, V=Oct, X=Nov, Z=Dec).</p>
<h3 id="s12-5">12.5 Surprise Index</h3>
<p>Pour chaque rapport dans le catalogue Specialist Desks, le trader peut saisir la valeur de consensus avant publication et l'actual après. Le système calcule automatiquement le <strong>surprise score</strong> = actual consensus.</p>
<table>
<thead><tr><th>Champ</th><th>Saisie</th><th>Calcul</th></tr></thead>
<tbody>
<tr><td><code>consensus_estimate</code></td><td>Avant publication (Bloomberg/Reuters)</td><td></td></tr>
<tr><td><code>actual_value</code></td><td>Après publication</td><td></td></tr>
<tr><td><code>surprise_score</code></td><td>Auto</td><td>actual consensus, calculé côté serveur</td></tr>
</tbody>
</table>
<p>Endpoint : <code>PUT /api/specialist-desks/reports/{id}/result</code> — met à jour les trois colonnes atomiquement.</p>
<p>Les surprises récentes sont injectées dans le contexte IA de l'Étape 4b :</p>
<div class="arch-box">Recent surprises:
• NFP (2026-06-06): actual=139k vs consensus=185k → surprise=46k (miss massif)
• CPI (2026-06-11): actual=+0.2% vs consensus=+0.3% → surprise=0.1% (légèrement dovish)
Upcoming consensus estimates:
• EIA Petroleum (2026-06-25): consensus=1.2M bbls draw</div>
<h3 id="s12-6">12.6 Hawk/Dove Text Scorer (GPT-4o-mini)</h3>
<p>Disponible sur les desks Forex et Bonds, le scorer analyse le texte d'un rapport (discours de banquier central, communiqué Fed/ECB, minutes) et retourne une évaluation directionnelle sur l'axe <strong>Hawk / Dove</strong>. Pour les desks Energy/Metals/Agri, l'axe devient <strong>Bull / Bear</strong>.</p>
<table>
<thead><tr><th>Paramètre</th><th>Valeur</th></tr></thead>
<tbody>
<tr><td>Modèle</td><td>GPT-4o-mini (<code>response_format: json_object</code>)</td></tr>
<tr><td>Score output</td><td>Float 1.0 (Dovish/Bearish) … +1.0 (Hawkish/Bullish)</td></tr>
<tr><td>Label output</td><td>Hawkish / Slightly Hawkish / Neutral / Slightly Dovish / Dovish</td></tr>
<tr><td>Autres champs</td><td>summary (1 phrase), key_phrases (35 extraits), confidence (01)</td></tr>
<tr><td>Persistance</td><td>Colonnes <code>text_sentiment_score</code>, <code>text_sentiment_label</code>, <code>text_sentiment_summary</code> dans <code>specialist_reports</code></td></tr>
</tbody>
</table>
<div class="callout blue">
<div class="label">Logique de scoring</div>
Le prompt instruits GPT-4o-mini à ignorer le contexte de marché et à se concentrer uniquement sur le <em>contenu rhétorique</em> : mentions de resserrement/assouplissement futur, révisions de projections de taux, vocabulaire d'urgence vs d'attente. Le score est stocké sur le rapport et injecté dans le contexte IA au cycle suivant — permettant à l'IA de quantifier l'impact d'un discours Fed sur les patterns de taux et forex.
</div>
<p>Endpoint : <code>POST /api/specialist-desks/score-text</code> — accepte <code>{"text": "...", "report_name": "FOMC Minutes", "desk": "bonds"}</code></p>
<div class="page-break"></div>
<!-- SECTION 13 -->
<h2 id="s13">13. Bibliothèque Patterns — Find Similar &amp; Merge</h2>
<p>Après chaque cycle, l'IA peut ajouter des patterns qui recoupent des patterns existants. La feature Find Similar permet de détecter et fusionner ces doublons tout en préservant toutes les données associées.</p>
<h3 id="s13-1">13.1 Analyse de Similarité GPT-4o-mini</h3>
<p>Endpoint : <code>POST /api/patterns/find-similar</code></p>
<table>
<thead><tr><th>Recommandation</th><th>Condition</th><th>Action proposée</th></tr></thead>
<tbody>
<tr><td><code>merge_as_instance</code></td><td>Même régime + même instrument + <strong>même direction</strong></td><td>Bouton "Fusionner dans [X]" avec confirmation</td></tr>
<tr><td><code>counter_scenario</code></td><td>Même régime + même instrument + <strong>direction opposée</strong></td><td>Appliquer le regime_tag commun — les deux patterns restent</td></tr>
<tr><td><code>new_pattern</code></td><td>Régime ou instrument différent, pas de match structurel</td><td>Badge vert "Pattern unique" — rien à faire</td></tr>
</tbody>
</table>
<p><strong>Règle critique :</strong> ne jamais fusionner des directions opposées (bullish WTI + bearish WTI = deux scénarios valides du même régime, pas un doublon).</p>
<h3 id="s13-2">13.2 Fusion et Remapping Complet des Données</h3>
<p>Endpoint : <code>POST /api/patterns/merge</code> — transaction atomique SQLite :</p>
<div class="arch-box">1. Charger pattern_keep + pattern_discard
2. Fusionner historical_instances[] → union + dédup par (date, event)
3. merged_hits = keep.backtest_hits + discard.backtest_hits
merged_runs = keep.backtest_runs_count + discard.backtest_runs_count
4. merged_regime = keep.regime_tag OR discard.regime_tag
5. UPDATE pattern_score_history SET pattern_id = keep_id WHERE pattern_id = discard_id
UPDATE trade_entry_prices SET pattern_id = keep_id WHERE pattern_id = discard_id
UPDATE ai_reasoning_traces SET pattern_id = keep_id WHERE pattern_id = discard_id
UPDATE ai_call_logs SET pattern_id = keep_id WHERE pattern_id = discard_id
UPDATE skipped_trades SET pattern_id = keep_id WHERE pattern_id = discard_id
DELETE FROM pattern_embeddings WHERE pattern_id = discard_id (sera régénéré)
6. UPDATE custom_patterns SET ... WHERE id = keep_id (données fusionnées)
7. DELETE FROM custom_patterns WHERE id = discard_id</div>
<div class="callout green">
<div class="label">Intégrité garantie</div>
Toutes les tables liées par foreign key logicielle sont remappées avant la suppression. L'Analytics, la Calibration et le Journal continuent de voir les données du pattern discardé, maintenant consolidées sous le pattern conservé. La calibration recalculera le nouveau poids de crédibilité au prochain cycle.
</div>
<div class="page-break"></div>
<!-- SECTION 14 -->
<h2 id="s14">14. Calibration Progressive — IA vs Observé</h2>
<p>L'<code>expected_move_pct</code> est initialement une estimation de GPT-4o du rendement option (levier inclus) si la thèse est confirmée. Ce n'est pas un calcul de pricing options (pas de Black-Scholes). La calibration progressive remplace progressivement cette estimation par le rendement réellement observé sur les trades matures.</p>
<h3 id="s14-1">14.1 Formule de Crédibilité et Blending</h3>
<p>Modèle actuariel de crédibilité (Bühlmann-Straub simplifié) :</p>
<div class="formula-box">k = 5 [constante de crédibilité]
n = nombre de trades matures (≥35% de l'horizon écoulé)
w (poids observé) = n / (n + k)
observed_avg_win_pct = moyenne(pnl_pct) sur les trades gagnants matures
calibrated_expected_move = (1 w) × ai_estimate + w × observed_avg_win_pct
[seulement calculé si au moins 1 trade gagnant]</div>
<p><strong>Progression du poids observé :</strong></p>
<table>
<thead><tr><th>n trades matures</th><th>Poids observé (w)</th><th>Source label</th><th>Interprétation</th></tr></thead>
<tbody>
<tr><td>0</td><td>0%</td><td class="val-blue">Pure AI</td><td>100% estimation IA, aucune donnée réelle</td></tr>
<tr><td>1</td><td>17%</td><td class="val-blue">Early data</td><td>Légère influence des données — encore majoritairement IA</td></tr>
<tr><td>3</td><td>38%</td><td class="val-amber">Early data</td><td>Données commencent à corriger l'IA</td></tr>
<tr><td>5</td><td>50%</td><td class="val-amber">Mixed</td><td>Équilibre parfait IA / observé</td></tr>
<tr><td>10</td><td>67%</td><td class="val-amber">Mixed</td><td>Données majoritaires</td></tr>
<tr><td>20</td><td>80%</td><td class="val-green">Data-driven</td><td>IA en fond de correction seulement</td></tr>
<tr><td>50</td><td>91%</td><td class="val-green">Data-driven</td><td>Quasi-entièrement ancré dans le réel</td></tr>
</tbody>
</table>
<div class="callout blue">
<div class="label">Rôle dans l'EV</div>
Le <code>calibrated_expected_move</code> est le <strong>G</strong> dans <code>ev_net = p×G (1p)</code>. Un G trop optimiste (IA pure sur pattern nouveau) surévalue l'EV. Avec 10 trades gagnants observés à 65% en moyenne là où l'IA estimait 95%, le calibré vaut 0.67×65 + 0.33×95 ≈ 75% — l'EV recalculé est 11% plus conservateur. Cela peut faire passer un trade de "loggé" à "skipped" si le profil exige gain ≥ 80%.
</div>
<h3 id="s14-2">14.2 Affichage et Rapport de Cycle</h3>
<p><strong>Card PatternExplorer — MaturityBadge :</strong></p>
<ul>
<li>Badge source coloré : <em>Pure AI</em> (gris) / <em>Early data</em> (bleu) / <em>Mixed</em> (violet) / <em>Data-driven</em> (vert)</li>
<li>Barre dégradée slate→violet représentant le pourcentage de poids observé</li>
<li>Grille 3 cases : Win rate Bayésien | Estimation IA (%) | Calibré (%)</li>
</ul>
<p><strong>Section Calibration dans le Rapport de Cycle :</strong></p>
<ul>
<li>Barre globale avec le poids observé moyen sur tous les patterns actifs</li>
<li>4 compteurs (Pure AI / Early / Mixed / Data-driven)</li>
<li>Table per-pattern : n trades, win rate, AI estimate → Calibré, avec code couleur source</li>
</ul>
<p><strong>Mise à jour automatique :</strong> <code>update_bayesian_posteriors()</code> est appelé à la fin de chaque cycle. Il recalcule simultanément les posteriors Beta(α,β) et les valeurs de calibration pour tous les patterns ayant des trades matures.</p>
<table>
<thead><tr><th>Nouvelle colonne custom_patterns</th><th>Type</th><th>Description</th></tr></thead>
<tbody>
<tr><td><code>calibrated_expected_move</code></td><td>REAL</td><td>Valeur blendée utilisée comme G dans l'EV. NULL si aucun trade gagnant.</td></tr>
<tr><td><code>calibration_weight</code></td><td>REAL 01</td><td>w = n/(n+5). Stocké pour affichage frontend sans recalcul.</td></tr>
<tr><td><code>observed_avg_win_pct</code></td><td>REAL</td><td>Moyenne des pnl_pct &gt; 0 sur trades matures. NULL si aucun gain.</td></tr>
</tbody>
</table>
<hr>
<div class="footer-doc">
<p>Document généré le 23 juin 2026 · GeoOptions Intelligence v6.1</p>
<p>FastAPI + React + SQLite + GPT-4o · CFTC Socrata · yfinance · 25 pages · 6 phases · Usage interne trader</p>
<p>Sections : Architecture · Cycle complet simulé · Phase 5 Cycle Context Engine · Phase 1 IV/Structure + IV Gate + Watchlist · Phase 2 Fiabilité · Phase 3 Risk Engine · Pattern Convergence + IBKR Ticket · Phase 4 IA Probabiliste · 7 Prompts IA · 20+ Tables DB (incl. cot_data, forward_curve_data) · Guide 19 pages · 19 Décisions conception · Glossaire 50+ termes · Specialist Desks v2 (COT 19 marchés · Forward Curves · Surprise Index · Hawk/Dove Scorer) · Calibration Progressive · Find Similar+Merge · Workflow Calculs</p>
</div>
</body>
</html>