Comment FinSight produit ses analyses.
Aucun chiffre n'est inventé. Chaque calcul est déterministe. Chaque commentaire IA est cadré par une constitution écrite et vérifié par des agents observateurs. Cette page documente l'intégralité du pipeline, des sources de données jusqu'à la production des livrables, sans angles morts.
Dix nœuds orchestrés par LangGraph.
Le pipeline est implémenté avec LangGraph 0.6, une machine à états dirigée par un graphe. Chaque nœud est une fonction pure typée qui lit un état partagé FinSightState, produit un diff, et transmet au suivant. Les transitions conditionnelles permettent la tolérance aux pannes (fallback sources, retry LLM, court-circuit sur sortie invalide).
Détail des dix nœuds
| Nœud | Agent | Rôle | Sortie clé |
|---|---|---|---|
| fetch_node | AgentData | Récupère les données multi-sources (yfinance, Finnhub, FMP, Pappers, INPI, BODACC) et les normalise dans un DataSnapshot. | snapshot |
| fallback_node | AgentData (dégradé) | Déclenché si fetch primaire échoue. Réessaie avec les backups et signale la dégradation dans les méta-données. | snapshot (partial) |
| quant_node | AgentQuant | Calcule les ratios déterministes (P/E, EV/EBITDA, ROE, Altman Z, Piotroski F, Beneish M, WACC, DCF Monte Carlo). | ratios + dcf_result |
| synthesis_node | AgentSynthese | Appelle un LLM (Groq Llama 3.3 → Mistral → Anthropic Haiku en cascade) pour produire recommandation, conviction, targets bear/base/bull, thèse, catalyseurs. | synthesis |
| synthesis_retry | AgentSynthese | Retry si la sortie JSON est invalide ou si les garde-fous (price-anchor, conviction clamp) détectent une incohérence. | synthesis (retry) |
| qa_node | AgentQAPython + AgentQAHaiku | Double contrôle qualité : Python vérifie les règles déterministes (ratios cohérents, targets dans borne, conviction dans [0.25, 0.90]). Haiku relit le texte pour détecter les claims non étayés. | qa_result + flags |
| devil_node | AgentDevil | Devil's Advocate — génère une thèse inverse et calcule un conviction_delta (écart entre synthèse et thèse inverse). | devil_result |
| entry_zone_node | AgentEntryZone | Calcule le signal d'entrée : écart DCF Base vs cours, momentum, sentiment FinBERT. Retourne une zone entry favorable/neutre/défavorable. | entry_zone |
| output_node | Writers | Appelle ExcelWriter, PPTXWriter, PDFWriter, BriefingWriter en parallèle. Produit les 4 livrables téléchargeables. | files[] |
| blocked_node | (court-circuit) | Si synthesis_node échoue trois fois, bascule ici pour produire un livrable partiel plutôt que crasher. | fallback output |
Chaque nœud est wrappé dans un tracer qui logge latence, succès/erreur, provider LLM utilisé, et score de data quality dans Supabase (table analysis_log). Temps médian pipeline bout en bout sur société cotée : 45 secondes.
Constitution, agents observateurs, cascade LLM.
Un LLM non cadré hallucine, contredit les chiffres, surpromet. La production chez FinSight repose sur trois dispositifs complémentaires : une constitution écrite, une cascade de fallback entre providers, et quatre agents observateurs qui auditent chaque sortie.
Constitution — 7 articles
| Article 1 | Traçabilité absolue | Tout chiffre cité dans un commentaire IA doit figurer dans DataSnapshot ou être dérivé par quant_node. Pas d'invention. |
| Article 2 | Price-anchor | Les targets base/bull/bear doivent être dans [cours × 0,65 ; cours × 1,35]. Hors zone → retry ou rejet. |
| Article 3 | Conviction bornée | La conviction est forcée dans [0,25 ; 0,90]. En-deçà de 0,25 = erreur LLM reconstruite depuis recommandation + data_quality. |
| Article 4 | Budget mots strict | Chaque champ de sortie a un budget de mots (ex: thesis = 3 phrases × 12-18 mots). Dépassement = troncature contrôlée. |
| Article 5 | Typographie FR | Accents complets exigés (é è ê à ç ô), apostrophes droites, pas de points de suspension. restore_accents.py post-traite. |
| Article 6 | Spécificité secteur | Interdiction de généralités applicables à n'importe quel secteur. Le contenu doit nommer des drivers propres. |
| Article 7 | Honnêteté des limites | Ne jamais prétendre qu'une analyse est infaillible. Afficher un disclaimer explicite en footer. |
Quatre agents observateurs
En plus du pipeline principal, quatre agents secondaires auditent la production selon leur angle propre. Leurs sorties ne bloquent pas la livraison (pour ne pas casser l'UX en cas de faux-positif) mais alimentent un verdict compile dans la table sentinel_verdicts.
Cascade LLM providers
Aucun appel LLM ne dépend d'un seul provider. Chaque call traverse une cascade déterministe en cas d'échec :
1. Groq → llama-3.3-70b-versatile (principal, rapide, gratuit) 2. Mistral → mistral-small-latest (fallback 1 — quota Groq saturé ou 401) 3. Anthropic → claude-haiku-4-5 (fallback 2 — synthèses sensibles) 4. Gemini → gemini-2.0-flash (audit visuel PDF uniquement) Critères de bascule : - HTTP 5xx ou timeout > 30s → provider suivant - Quota journalier atteint → provider suivant - JSON output invalide 2 fois → synthesis_retry puis provider suivant - Violation d'article de la constitution → rejet et logging
Paramètres LLM
| Agent appelant | Température | Max tokens | Justification |
|---|---|---|---|
| AgentSynthese | 0.3 | 2 200 | Créativité modérée pour varier la prose, mais structure imposée par JSON schema. |
| AgentQAHaiku | 0.1 | 800 | Audit strict, aucune créativité souhaitée. |
| AgentDevil | 0.6 | 1 500 | Plus créatif pour explorer la thèse inverse. |
| Writers sectoriels | 0.25 | 700 | Commentaires factuels à variabilité limitée. |
| Gemini Vision | 0.1 | 1 500 | Audit visuel déterministe des PDF produits. |
Multi-sources avec cascade de fallback.
Aucune donnée financière n'est générée ou estimée. Toutes proviennent de sources tierces vérifiables, dans une logique de cascade avec fallback pour résister aux indisponibilités.
| Source | Type | Couverture | Usage FinSight |
|---|---|---|---|
| yfinance | Cotations / fondamentaux | Mondiale (cotées) | Source principale. Historique 5 ans, ratios LTM, dividendes. |
| Finnhub | News / sentiment | Mondiale | 10 articles ticker-spécifiques par analyse. FinBERT local calcule le sentiment. |
| FMP | Fundamentals | Surtout US | Fallback si yfinance manque des champs. Free plan limité, 401/403 fréquents sur EU. |
| FRED | Macro | US principalement | Taux directeur, inflation, indice confiance, spread haut rendement. |
| Pappers | Sociétés non cotées | France (3,5 M+ entreprises) | Source principale PME. Bilans, dirigeants, K-Bis, liens capitalistiques. |
| INPI RNE | Actes + comptes annuels | France | Complément Pappers. Dépôts de comptes officiels, statuts, évolutions. |
| BODACC | Procédures collectives | France | Redressements, liquidations, radiations. Signal d'alerte solvabilité. |
| DGCCRF | Sanctions LME | France | Amendes publiques pour retard de paiement > 60 jours (loi LME). |
| feedparser | RSS backup | Yahoo Finance | Backup news si Finnhub indisponible. |
Traçabilité
Chaque valeur affichée dans un livrable est traçable à sa source. L'objet DataSnapshot.metacontient les timestamps de fetch, la source utilisée pour chaque champ, et un score de qualité des données (confidence_score 0–100). Si la qualité descend sous 60, l'analyse est marquée comme dégradée dans le rapport.
Un score composite 4 dimensions, 5 profils investisseur.
Le Score FinSight v2 note chaque société de 0 à 100 sur quatre dimensions indépendantes, puis agrège selon cinq profils investisseur différenciés. Les bornes sont calibrées sur les quartiles réels observés par secteur (pas de bornes universelles qui désavantageraient systématiquement certains secteurs).
Les quatre dimensions
Pondération par profil
| Profil | Qualité | Valeur | Momentum | Risque |
|---|---|---|---|---|
| Conservateur LT | 35% | 20% | 10% | 35% |
| Balanced (équilibré) | 25% | 25% | 25% | 25% |
| Growth agressif | 15% | 10% | 50% | 25% |
| Value contrarian | 20% | 50% | 10% | 20% |
| Income dividendes | 25% | 30% | 15% | 30% |
Formule composite
composite = Σ (score_dim × weight_dim) pour dim ∈ {Q, V, M, R}
recommendation = BUY si composite ≥ 65
HOLD si 40 ≤ composite < 65
SELL si composite < 40
conviction = 0.55 + min(0.40, |composite − seuil| / 100) puis clamp [0.30, 0.90]Formules des indicateurs sous-jacents
Chaque sous-score des quatre dimensions est construit à partir d'indicateurs dont la formule est documentée et calculée de façon déterministe (pas d'estimation LLM).
WACC = (E / V) × Re + (D / V) × Rd × (1 − Tc) Re = Rf + β_levered × ERP + prime taille + prime pays β_levered = β_unlevered × (1 + (1 − Tc) × D/E) Rf : taux sans risque (OAT 10Y pour FR, Treasury 10Y pour US) via FRED ERP : Equity Risk Premium (Damodaran annuel, 5,5 % par défaut sur US) Tc : taux d'IS (25 % FR, 21 % US) D/E : leverage cible = médiane sectorielle (source Damodaran)
V0 = Σ(t=1..5) FCFt / (1+WACC)^t + TV / (1+WACC)^5 TV = FCF5 × (1+g) / (WACC − g) [Gordon terminal] g ∈ [1,5 % ; 2,5 %] [TGR borné, LT inflation] FCFt = EBITDA_t × (1 − taux_réinvestissement) Monte Carlo : 1 000 tirages - Croissance revenue : Normale(μ_histo, σ_histo) - Marge EBITDA : Normale(μ_LTM, σ / 3) - WACC : Uniforme(WACC_base − 0,5 pt, WACC_base + 0,5 pt) Output : distribution empirique V0 → percentiles bear(p10) / base(p50) / bull(p90)
Z = 1,2 × (WC / TA) + 1,4 × (RE / TA) + 3,3 × (EBIT / TA) + 0,6 × (MC / TL) + 1,0 × (Ventes / TA) WC : Working Capital (actif circulant − passif circulant) RE : Retained Earnings (réserves + report à nouveau) TA : Total Assets TL : Total Liabilities MC : Market Capitalisation (valeur boursière capitaux propres) Zones : - Z > 2,99 : zone saine (safe zone) - 1,81 < Z < 2,99 : zone grise (ambiguë) - Z < 1,81 : zone de détresse (distress zone, risque faillite)
F = Σ(i=1..9) 1{critère i vrai} → F ∈ {0, 1, ..., 9}
Profitabilité (4 points) :
1. Net Income > 0
2. ROA > 0
3. Operating Cash Flow > 0
4. OCF > Net Income (qualité des bénéfices)
Levier / liquidité (3 points) :
5. ND/EBITDA_t < ND/EBITDA_{t−1} (désendettement)
6. Current Ratio_t > Current Ratio_{t−1} (liquidité en hausse)
7. Pas d'émission nette d'actions
Efficience opérationnelle (2 points) :
8. Marge brute en hausse vs t−1
9. Asset Turnover en hausse vs t−1
Interprétation : F ≥ 7 = qualité fondamentale solide ;
F ≤ 3 = alerte sur la santé opérationnelle.M = −4,84 + 0,920·DSRI + 0,528·GMI + 0,404·AQI + 0,892·SGI
+ 0,115·DEPI − 0,172·SGAI + 4,679·TATA − 0,327·LVGI
DSRI : Days Sales Receivables Index
GMI : Gross Margin Index
AQI : Asset Quality Index
SGI : Sales Growth Index
DEPI : Depreciation Index
SGAI : SG&A Index
TATA : Total Accruals to Total Assets
LVGI : Leverage Index
Seuil : M > −1,78 = probabilité élevée de manipulation comptable.Pondérations internes par dimension
Chaque dimension agrège plusieurs sous-indicateurs. Les pondérations sont fixées empiriquement selon la littérature académique et testées par backtest :
| Piotroski F-Score | 35 % |
| ROIC | 25 % |
| ROE | 20 % |
| Marge EBITDA | 20 % |
| EV/EBITDA vs médiane sect. | 35 % |
| P/E Forward | 25 % |
| P/B | 20 % |
| FCF Yield | 20 % |
| Rendement 12 mois | 30 % |
| Rendement 6 mois | 25 % |
| Rendement 3 mois | 20 % |
| Écart vs MM200 | 15 % |
| Sentiment FinBERT | 10 % |
| Altman Z | 30 % |
| ND/EBITDA | 25 % |
| Beneish M | 20 % |
| Volatilité 1Y | 15 % |
| Beta | 10 % |
Chaque sous-indicateur est normalisé 0–100 par rank-percentile intra-sectoriel (une société au 75e percentile de son secteur sur un critère obtient 75 points sur ce critère). Cette normalisation neutralise les écarts structurels entre secteurs (ex : une marge de 10 % est excellente dans la distribution mais faible en tech).
Code source : core/finsight_score_v2.py (compute_scores_v2 + recommend_all_profiles).
Backtest walk-forward, benchmark intra-sectoriel.
Toute prétention commerciale sur la performance du Score FinSight s'appuie sur un protocole reproductible et documenté. Les chiffres ci-dessous sont issus du dataset parquet disponible dans outputs/backtest/backtest_latest.json.
Protocole
- Univers : 50 sociétés du top S&P 100 par capitalisation, rebalancé mensuellement sur 131 mois (juin 2015 → mars 2026).
- Observation mensuelle : pour chaque ticker × mois, calcul du Score FinSight v2 sur les quatre dimensions + application des cinq profils.
- Forward return 12 mois : mesure du rendement total 12 mois après la date d'observation (dividendes réinvestis).
- Benchmark : ETF sectoriel SPDR correspondant (XLK, XLV, XLF, XLY, XLC, XLI, XLP, XLE, XLB, XLRE, XLU). Permet un alpha intra-sectoriel, plus juste qu'un benchmark SPY global.
- Walk-forward : les bornes par quartile sectoriel utilisées pour le scoring à la date T sont calibrées uniquement sur les observations antérieures à T (pas de look-ahead bias).
- Test statistique : t-stat de Student sur les excès de rendement des observations filtrées BUY. Significativité à 95 % requiert |t| > 1,96.
Résultats principaux
| Profil | n BUY | Excès moyen | t-stat | Information Ratio | % positifs |
|---|---|---|---|---|---|
| Balanced | 57 | +8,9 % | +2,10 ★★ | +0,28 | 74 % |
| Growth agressif | 57 | +6,1 % | +1,89 ★ | +0,25 | 77 % |
| Conservateur | 220 | −2,6 % | −1,49 | −0,10 | 66 % |
| Value contrarian | 320 | −5,6 % | −4,15 ★★★ | −0,23 | 63 % |
| Income dividendes | 227 | −4,3 % | −2,33 ★★ | −0,15 | 64 % |
★ = significatif à 90 %, ★★ = 95 %, ★★★ = 99 %.
Métriques de validation — formules
IR = E[r_p − r_b] / σ(r_p − r_b) r_p : rendement du portefeuille FinSight (obs BUY) r_b : rendement du benchmark (ETF sectoriel correspondant) E : moyenne empirique de l'excès σ : écart-type de l'excès IR > 0,5 : signal robuste IR ∈ [0,2 ; 0,5] : signal exploitable avec rigueur IR < 0,2 : bruit
t = x̄ / (s / √n) x̄ : moyenne empirique de l'excès de rendement s : écart-type empirique de l'excès n : nombre d'observations BUY Seuils (n ≥ 30, approx. Normale) : - |t| > 1,65 → p < 0,10 (significatif à 90 %) - |t| > 1,96 → p < 0,05 (significatif à 95 %) - |t| > 2,58 → p < 0,01 (significatif à 99 %) Exemple Balanced : t = 8,9 / (32 / √57) = +2,10 → p ≈ 0,036
Résultat par secteur
Les profils Value, Conservateur et Income sous-performent en absolu sur 2015-2025 (bull tech), mais retrouvent leur signal sur les secteurs cycliques (Materials, Industrials, Financials) :
- Value contrarian / cycliques : +24,3 % d'alpha, cohérent avec la littérature Fama-French
- Conservateur LT / cycliques : +26,3 % d'alpha
- Income dividendes / cycliques : +25,4 % d'alpha
Ce que ces chiffres ne disent pas.
Taille d'échantillon limitée
Pour les profils Balanced et Growth, n BUY = 57 observations. C'est à la limite basse d'une inférence statistique robuste. Le t-stat de +2,10 passe tout juste le seuil 95 %. Un jury rigoureux exigerait n ≥ 100.
Régime unique dominant
La fenêtre 2015-2025 est dominée par un bull tech majeur. Les profils Value, Conservateur et Income y sont structurellement désavantagés, ce qui est cohérent avec la littérature Fama-French mais ne prouve pas que le score fonctionne en régime value (2000-2006) ou en crise (2008-2009).
Bornes sectorielles calibrées post-hoc
Les quartiles sectoriels utilisés par le scoring sont observés sur les données actuelles. Même si le protocole walk-forward élimine l'essentiel du look-ahead, la structure des quartiles peut avoir légèrement dérivé sur 10 ans.
Facteurs v1.1 non historisables
Cinq facteurs (Beneish M complet, EPS revisions consensus, short interest historique, insider transactions, institutional flow) sont exclus du backtest car non disponibles via yfinance sur 10 ans. Le score backtesté est donc v1.0 simplifié, pas la version production.
Univers biaisé survivorship
Le top 100 S&P actuel exclut les sociétés défaillantes ou sorties de l'indice. Le vrai test devrait intégrer les disparues (Lehman, GE avant sa sortie, etc.). C'est corrigé dans la version premium avec souscription EODHD.
Frais de transaction ignorés
Les excès de rendement présentés sont bruts. En rebalancement mensuel, les frais de courtage (0,05 %-0,15 %) et l'impôt sur plus-value réduiraient l'alpha net de 1 à 2 points de pourcentage.
Un scoring qui refuse l'uniformité.
Appliquer les mêmes ratios (EV/EBITDA, P/E, Marge EBITDA) à une banque et à une foncière cotée est une erreur grossière. Une banque n'a pas d'EBITDA significatif ; une REIT distribue par construction 90 % de son revenu locatif. FinSight détecte automatiquement le profil sectoriel via detect_profile(sector, industry) et adapte ratios, modèle de valorisation et prompts LLM.
Code source : core/sector_profiles.py (fonction detect_profile + dict _CONFIGS).
Infrastructure, langages, dépendances.
Back-end
- Python 3.14 (langage principal)
- LangGraph 0.6 — orchestration du pipeline
- yfinance — cotations et fondamentaux
- pandas / numpy / scipy — calculs quantitatifs
- ReportLab — génération PDF (9 pages par rapport)
- python-pptx — pitchbook PowerPoint (20 slides)
- openpyxl — modèle Excel financier (templates injectés)
- FinBERT (HuggingFace, local) — sentiment news
- FastAPI — backend HTTP (Railway)
Front-end
- Next.js 14 (App Router, Server Components)
- TypeScript 5 — typage strict
- Recharts — 25 composants graphiques interactifs
- Tailwind CSS — design system
- react-grid-layout — grille drag & drop modulable
Providers LLM
- Groq — Llama 3.3 70B (principal, gratuit, rapide)
- Mistral — mistral-small-latest (fallback et audit)
- Anthropic — Claude Haiku 4.5 (fallback synthèse)
- Google — Gemini 2.0 Flash Vision (audit visuel PDF)
Infrastructure
- Vercel — front-end (auto-deploy master)
- Railway — backend Python + FastAPI
- Supabase — base PostgreSQL + auth + storage
- Resend — emails transactionnels (DKIM signé)
- Namecheap — domaine finsight-ia.com
Volumétrie du code source
| Composant | Rôle | Lignes |
|---|---|---|
| outputs/ | Writers PDF / PPTX / Excel / Briefing | 46 846 |
| core/ | Pipeline, graph, scores, profils sectoriels | 17 372 |
| agents/ | 7 agents du pipeline + observateurs | 6 522 |
| backend/ | FastAPI + endpoints REST | 5 438 |
| cli_analyze.py | Orchestration CLI (société / secteur / indice / PME / cmp) | 3 038 |
| tools/ | Audits, migrations, backtest, générateurs | 29 714 |
| — Total Python | Back-end + outillage | 108 930 |
| frontend/src/ | Next.js 14 + TypeScript + composants dashboard | 27 093 |
| — Total général | Python + TypeScript | 136 023 |
Code source et historique des commits maintenus sur un dépôt Git privé (baptistejeh07-art/finsight-ia). Environ 1 200 commits, rythme de release continu, déploiement automatique sur push vers master.
Pourquoi ces technologies, pas d'autres.
Chaque brique est un arbitrage assumé entre performance, coût, dépendances et maintenabilité. Voici les principales décisions techniques et leur justification.
LangGraph plutôt que Celery, Airflow ou un orchestrateur maison
LangGraph exprime le pipeline comme un graphe typé avec état partagé, transitions conditionnelles natives et retry déclaratifs. Celery = file de tâches, pas un graphe. Airflow = lourd (DB + scheduler + workers) pour un pipeline court (45 s). LangGraph est compilé en statemachine légère, zéro service externe à maintenir.
Groq en LLM principal (pas OpenAI / Anthropic)
Groq Llama 3.3 70B est gratuit dans la limite de 14 400 requêtes/jour et 3 à 5× plus rapide qu'OpenAI sur un prompt équivalent (inférence sur puces LPU propriétaires). Le coût total d'une analyse passe de ~0,15 € (OpenAI gpt-4o-mini) à 0 € (Groq). Anthropic Claude Haiku reste en fallback pour les cas où la qualité de synthèse financière doit primer.
Monte Carlo DCF (1 000 tirages) plutôt qu'un DCF déterministe
Un DCF déterministe donne un prix cible unique qui surestime la précision. La distribution Monte Carlo sur croissance, marge et WACC produit naturellement les percentiles bear / base / bull (p10 / p50 / p90), bien plus honnête sur l'incertitude. Coût calcul : 200 ms vs 10 ms — négligeable face à la valeur informationnelle.
Supabase plutôt que Firebase ou PostgreSQL managé classique
Supabase fournit PostgreSQL (vs NoSQL Firebase — trop limitant pour du reporting financier), Auth intégrée, Row Level Security déclarative en SQL (gestion multi-tenant simple), Storage pour les livrables PDF/PPTX, REST auto-généré. Coût gratuit jusqu'à 500 Mo, puis 25 € / mois. Hébergement UE (Frankfurt) = compatible RGPD sans DPA.
Next.js 14 App Router plutôt que Pages Router ou Remix
App Router permet le Server Components, le streaming et le routing fichier-système avec layouts nested. La taille du bundle client est divisée par ~3 vs Pages Router pour les pages lourdes (dashboard). Remix = alternative viable mais Next.js a un écosystème Vercel intégré (deploy, analytics, edge functions).
Recharts plutôt que D3.js, Chart.js ou Visx
Recharts est assez haut niveau pour produire 25 visualisations de qualité (ligne, bar, area, scatter, radar, composed, treemap) sans écrire de SVG manuel. D3.js = flexibilité maximum mais 10× plus de code. Chart.js = canvas = pas de tooltip React idiomatique. Visx = D3 repackagé, overkill. Recharts fait 95 % du job pour 10 % du code.
FinBERT local plutôt qu'une API de sentiment (HuggingFace Inference, OpenAI)
FinBERT est un modèle BERT fine-tuné sur un corpus financier (Financial PhraseBank). Le télécharger une fois (440 Mo) et l'exécuter localement coûte 0 € par prédiction vs 0,0002 € par call HF Inference. Sur 10 articles × 100 analyses/jour = 1 000 inférences quotidiennes — gain annuel ≈ 75 €. Temps d'inférence local : 80 ms par article sur CPU.
ReportLab + python-pptx + openpyxl plutôt qu'un service externe (PDFKit, Carbone)
Les livrables sont le cœur de la proposition de valeur. Un service tiers (Carbone, PDFKit) génère une dépendance critique dont les limites d'utilisation et la latence (300-800 ms par document) sont subies. ReportLab + python-pptx donnent un contrôle total sur la mise en page et tournent en local (120 ms par PDF de 9 pages, 200 ms par PPTX de 20 slides).
Garanties opérationnelles.
- Authentification : Supabase Auth avec vérification email. Mots de passe hashés (bcrypt), pas d'accès direct à la base par l'équipe.
- Isolation des données utilisateur : Row Level Security (RLS) Supabase actif sur toutes les tables. Chaque utilisateur ne peut lire que ses propres analyses.
- Chiffrement en transit : TLS 1.3 imposé sur tous les endpoints (front, back, Supabase). HSTS activé sur finsight-ia.com.
- Chiffrement au repos : AES-256 sur Supabase et Vercel (gestion managée).
- Emails authentifiés : SPF + DKIM + DMARC via Resend. Domaine expéditeur vérifié.
- Pas de revente de données : les analyses des utilisateurs ne sont ni partagées ni revendues. Un projet futur (« FinSight Trends ») agrégerait des tendances anonymisées sur des données de type dataset uniquement avec consentement explicite et granulaire.
- Suppression de compte : effacement complet sous 72h sur demande, incluant historique d'analyses et logs applicatifs.
- Hébergement UE : Vercel (Frankfurt), Supabase (Francfort), Resend (Irlande). Aucun transfert hors UE pour les données utilisateur.
Ce qui est prévu pour renforcer la rigueur.
Court terme (1-3 mois)
- Score baromètre mauvais payeurs sur module PME (calcul DSO/DPO + agrégation DGCCRF + BODACC).
- Intégration FEC (Fichier des Écritures Comptables) pour cabinets comptables.
- Extension backtest à l'univers S&P 500 complet (500 tickers vs 50 actuels).
Moyen terme (3-6 mois)
- Souscription EODHD All-In-One (25 ans de fundamentals mondiaux) pour backtest 2000-2025.
- Couverture des régimes value (1999-2002, 2003-2007) et de la crise 2008-2009.
- Calibration des bornes sectorielles sur l'univers complet, cross-validation temporelle.
Long terme (6-12 mois)
- Publication d'un whitepaper institutionnel (20-30 pages) avec protocole, résultats, limites, review par tiers académique.
- Partenariat recherche avec une école ou une université (sciences de gestion).
- API Score FinSight publique avec metered billing — ouverture à des chercheurs pour validation indépendante.
Une question technique, une contestation ?
La documentation technique est maintenue en continu. Toute remarque sur la méthodologie, demande de justification, ou signalement d'une limite non listée est bienvenue.