889 lines
43 KiB
HTML
889 lines
43 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>OpenFin Intelligence — Documentation Système</title>
|
||
<style>
|
||
/* ── Base ── */
|
||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||
|
||
body {
|
||
font-family: 'Georgia', 'Times New Roman', serif;
|
||
font-size: 11pt;
|
||
line-height: 1.7;
|
||
color: #1a1a2e;
|
||
background: #fff;
|
||
max-width: 900px;
|
||
margin: 0 auto;
|
||
padding: 40px 48px;
|
||
}
|
||
|
||
/* ── Typography ── */
|
||
h1 { font-size: 24pt; font-weight: 700; color: #0f2d6b; margin-bottom: 6px; letter-spacing: -0.5px; }
|
||
h2 { font-size: 15pt; font-weight: 700; color: #0f2d6b; margin: 36px 0 12px; border-bottom: 2.5px solid #0f2d6b; padding-bottom: 6px; }
|
||
h3 { font-size: 12pt; font-weight: 700; color: #1a3a7c; margin: 24px 0 8px; }
|
||
h4 { font-size: 10.5pt; font-weight: 700; color: #2d5a9e; margin: 16px 0 6px; }
|
||
p { margin-bottom: 10px; }
|
||
|
||
/* ── Cover ── */
|
||
.cover {
|
||
text-align: center;
|
||
padding: 60px 0 48px;
|
||
border-bottom: 3px solid #0f2d6b;
|
||
margin-bottom: 48px;
|
||
}
|
||
.cover .subtitle { font-size: 13pt; color: #4a6fa5; margin-top: 8px; font-style: italic; }
|
||
.cover .meta { font-size: 9.5pt; color: #7a8aaa; margin-top: 24px; font-family: 'Courier New', monospace; }
|
||
.cover .logo { font-size: 36pt; margin-bottom: 16px; }
|
||
|
||
/* ── Callout boxes ── */
|
||
.callout {
|
||
border-left: 4px solid;
|
||
padding: 12px 16px;
|
||
margin: 18px 0;
|
||
border-radius: 0 6px 6px 0;
|
||
}
|
||
.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: 9pt; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 4px; }
|
||
.callout.blue .label { color: #2d6be4; }
|
||
.callout.green .label { color: #16a34a; }
|
||
.callout.amber .label { color: #d97706; }
|
||
.callout.red .label { color: #dc2626; }
|
||
|
||
/* ── Tables ── */
|
||
table { width: 100%; border-collapse: collapse; margin: 16px 0 24px; font-size: 10pt; }
|
||
th { background: #0f2d6b; color: #fff; padding: 9px 12px; text-align: left; font-size: 9pt; text-transform: uppercase; letter-spacing: 0.5px; }
|
||
td { padding: 8px 12px; border-bottom: 1px solid #e2e8f0; vertical-align: top; }
|
||
tr:nth-child(even) td { background: #f8fafc; }
|
||
tr:hover td { background: #eef2ff; }
|
||
|
||
/* ── Flow diagram ── */
|
||
.flow { display: flex; flex-direction: column; gap: 2px; margin: 20px 0; }
|
||
.flow-step {
|
||
display: flex;
|
||
align-items: flex-start;
|
||
gap: 14px;
|
||
padding: 12px 16px;
|
||
border-radius: 6px;
|
||
}
|
||
.flow-step.ai { background: #eef4ff; border: 1px solid #bfd1f5; }
|
||
.flow-step.data { background: #f0fdf4; border: 1px solid #bbf7d0; }
|
||
.flow-step.db { background: #fafafa; border: 1px solid #e2e8f0; }
|
||
.flow-step.bg { background: #fefce8; border: 1px solid #fde68a; }
|
||
.flow-num {
|
||
width: 26px; height: 26px; border-radius: 50%;
|
||
display: flex; align-items: center; justify-content: center;
|
||
font-size: 9pt; font-weight: 700; flex-shrink: 0; margin-top: 2px;
|
||
}
|
||
.flow-step.ai .flow-num { background: #2d6be4; color: #fff; }
|
||
.flow-step.data .flow-num { background: #16a34a; color: #fff; }
|
||
.flow-step.db .flow-num { background: #64748b; color: #fff; }
|
||
.flow-step.bg .flow-num { background: #d97706; color: #fff; }
|
||
.flow-title { font-weight: 700; font-size: 10.5pt; margin-bottom: 2px; }
|
||
.flow-step.ai .flow-title { color: #1e3a8a; }
|
||
.flow-step.data .flow-title { color: #14532d; }
|
||
.flow-step.db .flow-title { color: #334155; }
|
||
.flow-step.bg .flow-title { color: #92400e; }
|
||
.flow-desc { font-size: 9.5pt; color: #475569; }
|
||
.flow-arrow { text-align: center; color: #94a3b8; font-size: 14pt; line-height: 1; }
|
||
|
||
.badge {
|
||
display: inline-block;
|
||
padding: 1px 8px;
|
||
border-radius: 20px;
|
||
font-size: 8.5pt;
|
||
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-bg { background: #fef9c3; color: #854d0e; }
|
||
|
||
ul { margin: 8px 0 12px 20px; }
|
||
li { margin-bottom: 4px; }
|
||
li::marker { color: #2d6be4; }
|
||
|
||
code {
|
||
font-family: 'Courier New', monospace;
|
||
font-size: 9pt;
|
||
background: #f1f5f9;
|
||
padding: 1px 5px;
|
||
border-radius: 3px;
|
||
color: #1e3a8a;
|
||
}
|
||
|
||
.section-intro { font-size: 10.5pt; color: #475569; font-style: italic; margin-bottom: 20px; }
|
||
|
||
/* ── Prompt anatomy cards ── */
|
||
.prompt-card {
|
||
border: 1.5px solid #bfd1f5;
|
||
border-radius: 8px;
|
||
margin: 20px 0;
|
||
overflow: hidden;
|
||
}
|
||
.prompt-card-header {
|
||
background: #0f2d6b;
|
||
color: #fff;
|
||
padding: 10px 16px;
|
||
font-weight: 700;
|
||
font-size: 10pt;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
.prompt-card-body { padding: 14px 16px; }
|
||
.prompt-section { margin-bottom: 12px; }
|
||
.prompt-section-title { font-weight: 700; font-size: 9pt; text-transform: uppercase; letter-spacing: 0.8px; color: #2d6be4; margin-bottom: 4px; }
|
||
.included { color: #15803d; }
|
||
.excluded { color: #dc2626; }
|
||
.check::before { content: "✓ "; font-weight: 700; }
|
||
.cross::before { content: "✗ "; font-weight: 700; }
|
||
|
||
/* ── Maturity viz ── */
|
||
.maturity-bar { display: flex; height: 24px; border-radius: 4px; overflow: hidden; margin: 12px 0 6px; }
|
||
.mat-seg { display: flex; align-items: center; justify-content: center; font-size: 8pt; font-weight: 700; color: #fff; }
|
||
.mat-trop-tot { background: #94a3b8; flex: 10; }
|
||
.mat-debut { background: #f59e0b; flex: 25; }
|
||
.mat-mature { background: #22c55e; flex: 40; }
|
||
.mat-fin { background: #3b82f6; flex: 25; }
|
||
.mat-legend { display: flex; gap: 16px; flex-wrap: wrap; font-size: 8.5pt; margin-top: 4px; }
|
||
.mat-legend span { display: flex; align-items: center; gap: 5px; }
|
||
.mat-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
|
||
|
||
.page-break { page-break-before: always; }
|
||
hr { border: none; border-top: 1px solid #e2e8f0; margin: 32px 0; }
|
||
|
||
/* ── Print ── */
|
||
@media print {
|
||
body { padding: 20px 28px; font-size: 10pt; }
|
||
h1 { font-size: 20pt; }
|
||
h2 { font-size: 13pt; }
|
||
.cover { padding: 30px 0 30px; }
|
||
.callout, .prompt-card { break-inside: avoid; }
|
||
.flow-step { break-inside: avoid; }
|
||
a { text-decoration: none; color: inherit; }
|
||
@page { margin: 1.5cm 1.8cm; size: A4; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
COVER
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<div class="cover">
|
||
<div class="logo">⚡</div>
|
||
<h1>OpenFin Intelligence</h1>
|
||
<div class="subtitle">Architecture du Système & Logique des Prompts IA</div>
|
||
<div class="meta">
|
||
Version 2.0 · Juin 2026 · FastAPI + React + GPT-4o
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
1. CONCEPT GÉNÉRAL
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<h2>1. Concept Général</h2>
|
||
|
||
<p class="section-intro">
|
||
OpenFin Intelligence est un cockpit de trading d'options dont l'intelligence centrale repose sur un cycle itératif : collecter les signaux macro-géopolitiques, identifier les patterns d'opportunité, scorer leur pertinence en temps réel, puis apprendre des performances passées pour affiner les cycles suivants.
|
||
</p>
|
||
|
||
<h3>1.1 Philosophie fondamentale</h3>
|
||
|
||
<p>
|
||
Le système est construit autour d'une idée simple : <strong>les options sur dérivés géopolitiques suivent des patterns répétables</strong>. Une escalade tarifaire US-Chine génère systématiquement de la volatilité sur les semi-conducteurs. Un choc pétrolier bénéficie aux stratégies long sur l'énergie. Le défi n'est pas de <em>créer</em> ces patterns, mais de les <em>détecter</em> assez tôt pour agir avant le consensus.
|
||
</p>
|
||
|
||
<p>
|
||
L'IA (GPT-4o) joue le rôle d'un <strong>stratège senior externe</strong> qui lit les news, connaît les régimes macro, et enrichit la base de patterns — mais ce sont des règles humaines explicites qui décident si un trade est logué, si une analyse est valide, et si les leçons passées sont fiables.
|
||
</p>
|
||
|
||
<div class="callout blue">
|
||
<div class="label">Principe directeur</div>
|
||
L'IA propose, les règles quantitatives filtrent, l'historique de performance valide. Le cycle répète et apprend.
|
||
</div>
|
||
|
||
<h3>1.2 Les trois mémoires du système</h3>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Mémoire</th>
|
||
<th>Contenu</th>
|
||
<th>Durée de vie</th>
|
||
<th>Usage</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Rapport Portfolio</strong></td>
|
||
<td>Analyse post-mortem des trades matures : gagnants, perdants, leçons clés</td>
|
||
<td>~7–30 jours (jusqu'au prochain rapport)</td>
|
||
<td>Injecté dans les prompts de suggestion et scoring du cycle suivant</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Super Contexte</strong></td>
|
||
<td>Synthèse évolutive : régimes, patterns récurrents, erreurs, corrélations macro</td>
|
||
<td>Permanent — s'enrichit à chaque cycle (max 1×/6h)</td>
|
||
<td>Contexte de fond pour tout le raisonnement IA</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Base de Connaissances (KB)</strong></td>
|
||
<td>Entrées structurées par catégorie (régimes, patterns, erreurs) avec score de confiance</td>
|
||
<td>Permanent — géré manuellement ou auto-ajouté par synthèse</td>
|
||
<td>Consulté lors de la synthèse du Super Contexte</td>
|
||
</tr>
|
||
</table>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
2. WORKFLOW D'UN CYCLE
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<div class="page-break"></div>
|
||
<h2>2. Workflow d'un Cycle Complet</h2>
|
||
|
||
<p class="section-intro">
|
||
Un cycle se déclenche automatiquement (toutes les N heures) ou manuellement. La durée typique est de 2 à 5 minutes pour les étapes synchrones, plus 1 à 3 minutes en background selon la disponibilité des données.
|
||
</p>
|
||
|
||
<div class="flow">
|
||
|
||
<div class="flow-step db">
|
||
<div class="flow-num">0</div>
|
||
<div>
|
||
<div class="flow-title">Chargement du contexte mémoriel <span class="badge badge-db">DB</span></div>
|
||
<div class="flow-desc">Charge le dernier Rapport Portfolio et le Super Contexte depuis la base de données. Ces données enrichiront <em>tous</em> les prompts IA du cycle courant.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step data">
|
||
<div class="flow-num">1</div>
|
||
<div>
|
||
<div class="flow-title">Collecte des données de marché <span class="badge badge-mini">GPT-4o-mini</span></div>
|
||
<div class="flow-desc">
|
||
Récupère les news géopolitiques (RSS, GDELT), les prix de marché (yfinance), les indicateurs macro (VIX, pente de courbe, DXY, Brent, or, cuivre, S&P vs moyenne 200j) et le calendrier économique.
|
||
<br>→ <strong>Appel IA :</strong> GPT-4o-mini score chaque news (impact 0–100, classification géopolitique) en batch.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step ai">
|
||
<div class="flow-num">2</div>
|
||
<div>
|
||
<div class="flow-title">Suggestion de nouveaux patterns <span class="badge badge-ai">GPT-4o</span></div>
|
||
<div class="flow-desc">
|
||
GPT-4o reçoit le contexte complet (news + prix + macro + calendrier + Super Contexte + leçons portfolio) et propose des nouvelles thèses de trading structurées.
|
||
<br>Retourne : nom, description, thèse macro, trades suggérés, keywords, probabilité, horizon cible.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step db">
|
||
<div class="flow-num">3</div>
|
||
<div>
|
||
<div class="flow-title">Filtre anti-doublons (Jaccard) <span class="badge badge-db">Règle</span></div>
|
||
<div class="flow-desc">
|
||
Chaque pattern suggéré est comparé aux patterns existants par similarité de keywords (distance de Jaccard). Si la similarité dépasse le seuil configuré (défaut : 30%), le pattern est rejeté comme doublon. Seuls les patterns vraiment nouveaux sont sauvegardés.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step ai">
|
||
<div class="flow-num">4</div>
|
||
<div>
|
||
<div class="flow-title">Scoring de TOUS les patterns <span class="badge badge-ai">GPT-4o</span></div>
|
||
<div class="flow-desc">
|
||
GPT-4o score l'ensemble des patterns (nouveaux + existants) en les confrontant au contexte marché actuel. Retourne pour chaque pattern : score de pertinence (0–100), niveau de confiance, catalyseur clé, résumé, trade recommandé avec stratégie (call spread, put, straddle...).
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step db">
|
||
<div class="flow-num">5</div>
|
||
<div>
|
||
<div class="flow-title">Logging et journal <span class="badge badge-db">DB</span></div>
|
||
<div class="flow-desc">
|
||
Sauvegarde les scores en historique, log les prix d'entrée des trades passant les filtres EV/score, enregistre l'alerte géo et le régime macro. Traces de raisonnement (input/output de chaque appel IA) persistées pour audit.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step ai">
|
||
<div class="flow-num">6</div>
|
||
<div>
|
||
<div class="flow-title">Commentaire de cycle <span class="badge badge-ai">GPT-4o</span></div>
|
||
<div class="flow-desc">
|
||
Synthèse narrative courte (4–6 phrases) expliquant pourquoi les patterns scorent ainsi aujourd'hui, quel est le risque principal, et quelle recommandation tactique pour le prochain cycle. Affiché dans l'interface.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓ <em style="font-size:9pt;color:#94a3b8">Thread background (non-bloquant)</em></div>
|
||
|
||
<div class="flow-step bg">
|
||
<div class="flow-num">7</div>
|
||
<div>
|
||
<div class="flow-title">Rapport Portfolio automatique <span class="badge badge-ai">GPT-4o</span> <span class="badge badge-bg">Background</span></div>
|
||
<div class="flow-desc">
|
||
Déclenché seulement si ≥ 2 trades matures avec |P&L| > 0.1% sont disponibles. GPT-4o analyse les performances réelles des trades matures et génère un rapport structuré (headline, analyse gagnants/perdants, leçons clés, angles morts). Ce rapport sera injecté au cycle suivant.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="flow-arrow">↓</div>
|
||
|
||
<div class="flow-step bg">
|
||
<div class="flow-num">8</div>
|
||
<div>
|
||
<div class="flow-title">Mise à jour du Super Contexte <span class="badge badge-ai">GPT-4o</span> <span class="badge badge-bg">Background</span></div>
|
||
<div class="flow-desc">
|
||
Déclenché seulement si le dernier Super Contexte a plus de 6 heures. GPT-4o agrège tous les rapports portfolio, tous les trades (90j) et la base de connaissances pour produire une synthèse évolutive riche. Nouvelles entrées KB auto-ajoutées.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="callout green">
|
||
<div class="label">Résumé des appels IA par cycle</div>
|
||
<strong>Synchrones (systématiques) :</strong> 1× GPT-4o-mini (scoring news) + 3× GPT-4o (suggestion patterns, scoring patterns, commentaire)<br>
|
||
<strong>Background (conditionnels) :</strong> 0–2× GPT-4o selon la disponibilité de trades matures et la fraîcheur du Super Contexte
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
3. ANATOMIE DES PROMPTS
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<div class="page-break"></div>
|
||
<h2>3. Anatomie des Prompts IA — Ce qu'on Inclut et Pourquoi</h2>
|
||
|
||
<p class="section-intro">
|
||
Chaque prompt est construit pour donner à GPT-4o exactement ce dont il a besoin pour être pertinent — sans surcharge inutile qui diluerait le signal ou augmenterait le coût.
|
||
</p>
|
||
|
||
<!-- ── 3.1 Scoring des news ── -->
|
||
<h3>3.1 Scoring des news (GPT-4o-mini)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Classification et scoring d'impact des news</span>
|
||
<span class="badge badge-mini">GPT-4o-mini</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>Titre + source + date de chaque news</strong> — le minimum nécessaire pour scorer l'impact</li>
|
||
<li><strong>Liste des catégories cibles</strong> (énergie, métaux, indices, forex, agriculture) — ancre le scoring sur nos actifs réels</li>
|
||
<li><strong>Schéma de sortie strict</strong> (score 0–100, catégorie, keywords) — pour être parsé de manière fiable</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>Corps complet des articles</strong> — le titre suffit pour scorer l'impact géopolitique ; le corps alourdit le contexte sans gain mesurable</li>
|
||
<li><strong>Historique des scores passés</strong> — scorer une news est une tâche stateless ; l'historique n'apporterait rien</li>
|
||
<li><strong>Données de marché</strong> — inutiles pour déterminer l'impact géopolitique d'une news</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="callout amber">
|
||
<div class="label">Pourquoi GPT-4o-mini ici ?</div>
|
||
Le scoring des news est une tâche de classification répétitive sur des centaines d'items. GPT-4o-mini est 10× moins cher que GPT-4o pour une qualité de classification identique sur des tâches structurées courtes. On garde GPT-4o pour le raisonnement stratégique complexe.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── 3.2 Suggestion de patterns ── -->
|
||
<h3>3.2 Suggestion de nouveaux patterns (GPT-4o)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Identification de nouvelles thèses de trading</span>
|
||
<span class="badge badge-ai">GPT-4o</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>Top N news scorées avec leur impact</strong> — les signaux géopolitiques qui motivent les thèses</li>
|
||
<li><strong>Régime macro dominant</strong> (stagflation, crise géo, expansion...) + scores de tous les scénarios — ancre les suggestions dans la réalité macro du moment</li>
|
||
<li><strong>Prix clés</strong> (VIX, DXY, Brent, or, cuivre) — oriente vers des actifs avec momentum</li>
|
||
<li><strong>Calendrier économique à venir</strong> — évite de suggérer des thèses juste avant un catalyseur qui les invaliderait</li>
|
||
<li><strong>Super Contexte</strong> (narrative + priorités stratégiques + erreurs récurrentes) — le "cerveau" accumulé qui guide le style de suggestions</li>
|
||
<li><strong>Leçons du dernier rapport portfolio</strong> (headline + leçons clés) — ancre dans ce qui a marché ou échoué récemment</li>
|
||
<li><strong>Schéma de sortie complet</strong> (nom, description, thèse macro, keywords, trades suggérés, horizon, probabilité)</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>Liste des patterns existants</strong> — le filtre Jaccard (étape 3) gère les doublons algorithmiquement ; l'inclure dans le prompt créerait du bruit et biaiserait GPT-4o vers des variations des patterns actuels</li>
|
||
<li><strong>Historique complet des scores</strong> — on injecte seulement le résumé des leçons (rapport portfolio) pas les données brutes ; plus compact, plus signal</li>
|
||
<li><strong>Données de trades individuels</strong> — trop granulaires pour la suggestion ; les leçons agrégées suffisent</li>
|
||
<li><strong>Prix d'entrée et P&L des positions ouvertes</strong> — crée un biais d'ancrage ; on veut des suggestions basées sur le marché actuel, pas sur nos positions</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── 3.3 Scoring des patterns ── -->
|
||
<h3>3.3 Scoring des patterns (GPT-4o)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Évaluation de pertinence de chaque pattern dans le contexte actuel</span>
|
||
<span class="badge badge-ai">GPT-4o</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>Tous les patterns</strong> (nom, description, thèse, keywords, trades suggérés) — GPT-4o doit évaluer chacun dans le même appel pour maintenir une cohérence relative des scores</li>
|
||
<li><strong>Contexte marché complet</strong> (régime macro, prix, news) — le même contexte que la suggestion, pour cohérence</li>
|
||
<li><strong>Super Contexte</strong> — les erreurs récurrentes et priorités stratégiques permettent de pénaliser les patterns qui répètent des patterns d'échec connus</li>
|
||
<li><strong>Biais par classe d'actif</strong> (calculé depuis le régime dominant) — oriente les scores vers les classes qui profitent du régime</li>
|
||
<li><strong>Score de risque géopolitique global</strong> — affecte les scores des patterns directionnels risqués</li>
|
||
<li><strong>Schéma de sortie structuré</strong> (score, confiance, buckets d'évaluation, trade recommandé avec détails option)</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>Scores historiques de chaque pattern</strong> — créerait un biais d'ancrage ; un pattern qui scorait 80 il y a 3 semaines ne devrait pas nécessairement scorer 80 aujourd'hui si le régime a changé</li>
|
||
<li><strong>P&L réel des trades logués</strong> — même raison : GPT-4o doit évaluer le marché aujourd'hui, pas être influencé par nos performances passées</li>
|
||
<li><strong>Identité des traders</strong> — non pertinent pour l'évaluation macro</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── 3.4 Commentaire de cycle ── -->
|
||
<h3>3.4 Commentaire de cycle (GPT-4o)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Narration du cycle pour le trader</span>
|
||
<span class="badge badge-ai">GPT-4o</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>Top 5 patterns scorés</strong> (nom, score, résumé) — ce que le cycle a retenu comme pertinent maintenant</li>
|
||
<li><strong>Régime dominant + scores macro</strong> — pour expliquer pourquoi ces patterns scorent ainsi</li>
|
||
<li><strong>Indicateurs macro clés</strong> (VIX, pente de courbe, DXY, Brent, or, cuivre) — les chiffres bruts pour ancrer la narration</li>
|
||
<li><strong>Top 5 news à fort impact</strong> — les catalyseurs qui expliquent le contexte du cycle</li>
|
||
<li><strong>Trades logués ces 7 derniers jours</strong> (pattern, underlying, stratégie) — pour commenter l'alignement positions/contexte</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>P&L des trades</strong> — le commentaire doit rester sur le <em>contexte marché</em>, pas sur les performances (risque de biais confirmationiste)</li>
|
||
<li><strong>Toutes les news</strong> — seules les top 5 à fort impact sont pertinentes pour une synthèse narrative</li>
|
||
<li><strong>Super Contexte complet</strong> — le commentaire est une analyse ponctuelle du cycle actuel, pas une synthèse mémorielle</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── 3.5 Rapport portfolio ── -->
|
||
<h3>3.5 Rapport Portfolio automatique (GPT-4o)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Post-mortem de performance sur trades matures</span>
|
||
<span class="badge badge-ai">GPT-4o</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>Uniquement les trades MATURES</strong> avec P&L réel — seule source fiable d'apprentissage (voir section 4)</li>
|
||
<li><strong>Classification explicite</strong> (matures gagnants / matures perdants / immatures à ne pas juger)</li>
|
||
<li><strong>Score d'entrée de chaque trade</strong> — permet de corréler "le système a bien scoré ET le trade a marché" vs les faux positifs</li>
|
||
<li><strong>Indicateur de maturité</strong> de chaque trade (% de l'horizon écoulé) — contexte pour interpréter le P&L</li>
|
||
<li><strong>Règle de timing explicite dans le system prompt</strong> — interdit de tirer des conclusions sur les trades immatures</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>Trades immatures comme base d'apprentissage</strong> — un trade ouvert depuis 2 jours sur un horizon de 60 jours ne dit rien de fiable sur la qualité de la thèse</li>
|
||
<li><strong>Contexte macro actuel</strong> — le rapport analyse le passé (pourquoi les matures ont marché), pas le présent</li>
|
||
<li><strong>Données de marché en temps réel</strong> — hors sujet pour un post-mortem</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── 3.6 Super Contexte ── -->
|
||
<h3>3.6 Synthèse Super Contexte (GPT-4o)</h3>
|
||
|
||
<div class="prompt-card">
|
||
<div class="prompt-card-header">
|
||
<span>Prompt : Mise à jour de la base de raisonnement évolutive</span>
|
||
<span class="badge badge-ai">GPT-4o</span>
|
||
</div>
|
||
<div class="prompt-card-body">
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title included">✓ Ce qui est inclus</div>
|
||
<ul>
|
||
<li><strong>10 derniers rapports portfolio</strong> (headline, stats, analyse gagnants/perdants, leçons) — la matière première de l'apprentissage</li>
|
||
<li><strong>Tous les trades (90j)</strong> classés par maturité avec P&L — la base empirique</li>
|
||
<li><strong>Base de connaissances existante</strong> (par catégorie : régimes, patterns, erreurs) — évite de repartir de zéro et préserve les insights validés</li>
|
||
<li><strong>Règle de timing dans le system prompt</strong> — même garde-fou que pour le rapport portfolio</li>
|
||
<li><strong>Instruction de conservation des insights existants</strong> si peu de matures disponibles — évite que la synthèse "oublie" les leçons validées à cause d'un manque de données récentes</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="prompt-section">
|
||
<div class="prompt-section-title excluded">✗ Ce qui est exclu</div>
|
||
<ul>
|
||
<li><strong>News du jour</strong> — le Super Contexte est une mémoire long terme, pas une analyse quotidienne</li>
|
||
<li><strong>Prix de marché actuels</strong> — même raison ; les régimes et corrélations sont déduits des performances, pas des prix instantanés</li>
|
||
<li><strong>Plus de 10 rapports</strong> — au-delà de 10 rapports, le prompt dépasserait la fenêtre utile ; les rapports les plus anciens ont aussi moins de pertinence dans un marché qui évolue</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
4. LA MATURITÉ DES TRADES
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<div class="page-break"></div>
|
||
<h2>4. La Maturité des Trades — Pourquoi C'est Central</h2>
|
||
|
||
<p class="section-intro">
|
||
C'est l'une des décisions d'architecture les plus importantes du système. Un P&L observé sur une option après 3 jours est du bruit statistique. Après 70% de son horizon, c'est un signal. Mélanger les deux dans les prompts IA pollue l'apprentissage.
|
||
</p>
|
||
|
||
<h3>4.1 Définition des stades</h3>
|
||
|
||
<div class="maturity-bar">
|
||
<div class="mat-seg mat-trop-tot">0–10%</div>
|
||
<div class="mat-seg mat-debut">10–35%</div>
|
||
<div class="mat-seg mat-mature">35–75%</div>
|
||
<div class="mat-seg mat-fin">>75%</div>
|
||
</div>
|
||
<div class="mat-legend">
|
||
<span><span class="mat-dot" style="background:#94a3b8"></span><strong>Trop tôt</strong> (0–10%) — Signal nul, ne pas analyser</span>
|
||
<span><span class="mat-dot" style="background:#f59e0b"></span><strong>Début</strong> (10–35%) — Signal faible, surveiller</span>
|
||
<span><span class="mat-dot" style="background:#22c55e"></span><strong>Mature</strong> (35–75%) — Signal fiable, apprendre</span>
|
||
<span><span class="mat-dot" style="background:#3b82f6"></span><strong>Fin d'horizon</strong> (>75%) — Signal fort, leçons définitives</span>
|
||
</div>
|
||
|
||
<h3>4.2 Impact sur chaque étape du système</h3>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Composant</th>
|
||
<th>Traitement des immatures</th>
|
||
<th>Traitement des matures</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Rapport Portfolio</strong></td>
|
||
<td>Listés pour transparence, étiquetés "ne pas juger", pas dans les calculs P&L</td>
|
||
<td>Base exclusive des analyses, leçons et statistiques</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Super Contexte</strong></td>
|
||
<td>Listés avec étiquette, exclus des insights de performance</td>
|
||
<td>Matures gagnants et perdants analysés pour régimes et patterns</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Journal de Bord</strong></td>
|
||
<td>Badge gris/orange + barre de progression courte</td>
|
||
<td>Badge vert/bleu + P&L affiché comme signal fiable</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Gate rapport portfolio</strong></td>
|
||
<td colspan="2">Au moins 2 trades matures avec |P&L| > 0,1% requis pour déclencher la génération GPT-4o</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<div class="callout red">
|
||
<div class="label">Risque évité</div>
|
||
Sans ce filtre de maturité, GPT-4o pourrait tirer des leçons d'un trade ouvert depuis 2 heures qui montre −5% (normal sur une option). Il conclurait "la stratégie straddle est mauvaise sur le secteur énergie" et dégraderait les cycles suivants. Le filtre de maturité protège l'intégrité de l'apprentissage.
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
5. RÈGLES DE FILTRAGE DES TRADES LOGUÉS
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<h2>5. Règles de Filtrage des Trades Logués</h2>
|
||
|
||
<p class="section-intro">
|
||
Tous les patterns scorés ne génèrent pas un trade dans le Journal de Bord. Deux filtres quantitatifs contrôlent l'entrée.
|
||
</p>
|
||
|
||
<h3>5.1 Les deux filtres</h3>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Filtre</th>
|
||
<th>Formule</th>
|
||
<th>Paramètre</th>
|
||
<th>Logique</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Score minimum</strong></td>
|
||
<td><code>score ≥ min_score</code></td>
|
||
<td>Configurable (défaut : 0)</td>
|
||
<td>Rejette les patterns jugés peu pertinents par GPT-4o dans le contexte actuel</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>EV nette minimum</strong></td>
|
||
<td><code>p × G − (1−p) ≥ min_ev</code></td>
|
||
<td>Configurable (défaut : 0.0)</td>
|
||
<td>Filtre les trades à espérance mathématique négative (p = probabilité, G = gain/perte max)</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<h3>5.2 Les profils de risque</h3>
|
||
|
||
<p>
|
||
Les profils de risque définissent des <em>frontières d'acceptation</em> nommées (Conservateur, Standard, Agressif...). Un trade est logué s'il passe <strong>au moins un</strong> profil activé. Chaque profil définit un score minimum et un gain minimum attendu, et affiche la formule EV nette à la frontière pour vérifier la cohérence mathématique.
|
||
</p>
|
||
|
||
<div class="callout green">
|
||
<div class="label">Intérêt de l'approche multi-profil</div>
|
||
Un même pattern peut être rejeté par le profil Conservateur (score 60, gain 50% requis) mais accepté par le profil Agressif (score 40, gain 200% requis). Cela permet de logger des opportunités à fort potentiel sans abaisser la barre globale.
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
6. GATE 6H DU SUPER CONTEXTE
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<h2>6. La Gate de 6 Heures du Super Contexte</h2>
|
||
|
||
<p>
|
||
Le Super Contexte est une synthèse mémorielle fondée sur des performances de trades à 30–90 jours. Le relancer toutes les 3 heures (à chaque cycle) serait non seulement coûteux, mais contre-productif : un nouveau trade immature ne devrait jamais remettre en cause des conclusions issues de mois d'observations.
|
||
</p>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Scénario</th>
|
||
<th>Comportement</th>
|
||
<th>Raison</th>
|
||
</tr>
|
||
<tr>
|
||
<td>Dernier Super Contexte < 6h</td>
|
||
<td>Synthèse ignorée, le SC existant est utilisé</td>
|
||
<td>Préserve les insights solides, évite le bruit des trades immatures</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Dernier Super Contexte > 6h</td>
|
||
<td>Nouvelle synthèse GPT-4o déclenchée</td>
|
||
<td>Intègre les nouvelles données de performance accumulées</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Trigger manuel avec <code>?force=true</code></td>
|
||
<td>Synthèse forcée quelle que soit l'ancienneté</td>
|
||
<td>Permet une mise à jour immédiate si l'utilisateur le décide</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<div class="callout amber">
|
||
<div class="label">Analogie</div>
|
||
Le Super Contexte est comme un livre de règles qui s'enrichit après chaque trimestre d'opérations. On ne réécrit pas le livre parce qu'un trade ouvert ce matin montre −2%.
|
||
</div>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
7. DÉDUPLICATION PAR JACCARD
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<h2>7. Filtre Anti-doublon par Distance de Jaccard</h2>
|
||
|
||
<p>
|
||
GPT-4o, s'il reçoit les mêmes news deux cycles de suite, risque de suggérer des patterns très proches. La distance de Jaccard mesure le chevauchement entre les <em>keywords</em> de deux patterns.
|
||
</p>
|
||
|
||
<div class="callout blue">
|
||
<div class="label">Formule</div>
|
||
<code>Jaccard(A, B) = |A ∩ B| / |A ∪ B|</code>
|
||
<br>Où A et B sont les ensembles de keywords (en minuscules) de deux patterns.
|
||
<br><br>
|
||
Si la similarité maximale entre le candidat et <em>n'importe quel</em> pattern existant dépasse le seuil (défaut 30%), le candidat est rejeté.
|
||
</div>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Seuil configuré</th>
|
||
<th>Comportement</th>
|
||
<th>Usage recommandé</th>
|
||
</tr>
|
||
<tr>
|
||
<td>10% (strict)</td>
|
||
<td>Presque tout passe, peu de déduplications</td>
|
||
<td>Base de données de patterns vide ou très petite</td>
|
||
</tr>
|
||
<tr>
|
||
<td>30% (défaut)</td>
|
||
<td>Équilibre entre nouveauté et redondance</td>
|
||
<td>Usage normal avec >20 patterns existants</td>
|
||
</tr>
|
||
<tr>
|
||
<td>60–80% (permissif)</td>
|
||
<td>Seuls les quasi-doublons exacts sont rejetés</td>
|
||
<td>Veut maximiser le volume de patterns générés</td>
|
||
</tr>
|
||
</table>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
8. ARCHITECTURE DES DONNÉES
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<div class="page-break"></div>
|
||
<h2>8. Architecture des Données</h2>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Table / Collection</th>
|
||
<th>Contenu</th>
|
||
<th>Consulté par</th>
|
||
</tr>
|
||
<tr>
|
||
<td><code>custom_patterns</code></td>
|
||
<td>Patterns créés manuellement ou par l'IA (nom, thèse, keywords, trades suggérés)</td>
|
||
<td>Scoring, suggestion (filtre Jaccard)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>pattern_scores</code></td>
|
||
<td>Historique de chaque scoring run (score, confiance, catalyseur, trade recommandé)</td>
|
||
<td>Cockpit, Rapport IA, Journal</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>trade_entry_prices</code></td>
|
||
<td>Un enregistrement par trade logué : prix d'entrée, score à l'entrée, P&L courant</td>
|
||
<td>Journal de Bord, Rapport Portfolio, Super Contexte</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>ai_reports</code></td>
|
||
<td>Rapports portfolio générés par GPT-4o (JSON + stats + winners/losers)</td>
|
||
<td>Super Contexte (10 derniers), Rapport IA page</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>reasoning_states</code></td>
|
||
<td>Versions successives du Super Contexte (narrative + synthesis JSON)</td>
|
||
<td>Cycle (contexte mémoriel), Super Contexte page</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>kb_entries</code></td>
|
||
<td>Base de connaissances : entrées par catégorie avec confiance (0–100)</td>
|
||
<td>Synthèse Super Contexte, Super Contexte page</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>reasoning_traces</code></td>
|
||
<td>Input/output de chaque appel IA (suggestion + scoring) — audit complet</td>
|
||
<td>Débogage, traçabilité des décisions</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>cycle_runs</code></td>
|
||
<td>Métadonnées de chaque cycle (statut, patterns added/scored, commentary, régime)</td>
|
||
<td>Page Config, historique cycles</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>config</code></td>
|
||
<td>Clés API, paramètres auto-cycle, seuils EV/score</td>
|
||
<td>Startup, chaque cycle</td>
|
||
</tr>
|
||
</table>
|
||
|
||
|
||
<!-- ══════════════════════════════════════════════════════════════════════════
|
||
9. SYNTHÈSE DES CHOIX DE CONCEPTION
|
||
══════════════════════════════════════════════════════════════════════════ -->
|
||
<h2>9. Synthèse des Choix de Conception</h2>
|
||
|
||
<table>
|
||
<tr>
|
||
<th>Choix</th>
|
||
<th>Alternative rejetée</th>
|
||
<th>Raison</th>
|
||
</tr>
|
||
<tr>
|
||
<td>GPT-4o-mini pour le scoring des news</td>
|
||
<td>GPT-4o pour tout</td>
|
||
<td>Classification répétitive → coût 10× réduit sans perte qualité</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Filtre Jaccard pour déduplier (pas GPT-4o)</td>
|
||
<td>Demander à GPT-4o si un pattern est un doublon</td>
|
||
<td>Algorithmique = déterministe, gratuit, rapide</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Gate 6h sur le Super Contexte</td>
|
||
<td>Resynthétiser à chaque cycle</td>
|
||
<td>Protège l'intégrité mémorielle du bruit court terme</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Rapport portfolio en background thread</td>
|
||
<td>Bloquer le cycle jusqu'à la fin du rapport</td>
|
||
<td>Le rapport sert au cycle <em>suivant</em> — pas besoin qu'il soit prêt maintenant</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Filtres EV et score configurables par profil</td>
|
||
<td>Un seul seuil global fixe</td>
|
||
<td>Permet plusieurs appétits de risque sans modifier le code</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Injecter Super Contexte dans la suggestion</td>
|
||
<td>Laisser GPT-4o repartir de zéro</td>
|
||
<td>Le SC contient des mois d'apprentissage validé ; en partir sans le contexte serait un gaspillage</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Exclure les P&L du prompt de scoring</td>
|
||
<td>Donner à GPT-4o les performances passées pour scorer</td>
|
||
<td>Évite le biais d'ancrage et la circularité (un pattern qui a bien scoré dans le passé ne mérite pas nécessairement un bon score aujourd'hui)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Cleanup des cycles "running" au démarrage</td>
|
||
<td>Laisser l'état incohérent</td>
|
||
<td>Un kill du processus laisse la DB en état "running" pour toujours ; le cleanup au startup garantit la cohérence</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<hr>
|
||
|
||
<div class="callout blue">
|
||
<div class="label">En résumé</div>
|
||
Le système applique un principe de <strong>séparation claire entre signal et bruit</strong> : l'IA reçoit ce qui lui permet de raisonner (contexte actuel + mémoire validée), pas ce qui peut la biaiser (performances récentes non matures, historique de scores bruts). Les règles quantitatives (Jaccard, maturité, EV, gate 6h) protègent la qualité des outputs IA en amont et en aval de chaque appel.
|
||
</div>
|
||
|
||
<p style="margin-top:40px; font-size:9pt; color:#94a3b8; text-align:center;">
|
||
OpenFin Intelligence v2.0 · Document généré le 17 juin 2026 · FastAPI + React + SQLite + GPT-4o
|
||
</p>
|
||
|
||
</body>
|
||
</html>
|