FinSight IA
Documentation technique

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.

01 · Architecture du pipeline

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).

fetch_nodeAgent Data — yfinance, Finnhub, FMP, Pappers,INPIfallback_nodeBackup multi-API si fetch primaire échouequant_nodeAgent Quant — WACC, DCF, ratios déterministessynthesis_nodeAgent Synthèse — LLM Groq/Mistral (reco,conviction, targets)synthesis_retryRetry LLM si sortie JSON invalideqa_nodeAgent QA Python + QA Haiku — validation ratioset cohérencedevil_nodeDevil's Advocate — thèse inverse (parallèle QA)entry_zone_nodeAgent Entry Zone — signal d'entrée (DCF vscours)output_nodeWriters PDF / PPTX / Excel / Briefingblocked_nodeCourt-circuit si synthesis invalide → livrablespartielsFetch / DonnéesCalcul déterministeAppel LLMContrôle qualitéProduction livrablesFallback / dégradé
Pipeline compilé avec LangGraph 0.6. Chaque nœud est wrappé dans un tracer pour instrumentation niveau 3 (latence, erreurs, provider LLM utilisé). Les flèches pointillées représentent des chemins conditionnels (échec fetch, retry LLM, court-circuit).

Détail des dix nœuds

NœudAgentRôleSortie clé
fetch_nodeAgentDataRécupère les données multi-sources (yfinance, Finnhub, FMP, Pappers, INPI, BODACC) et les normalise dans un DataSnapshot.snapshot
fallback_nodeAgentData (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_nodeAgentQuantCalcule les ratios déterministes (P/E, EV/EBITDA, ROE, Altman Z, Piotroski F, Beneish M, WACC, DCF Monte Carlo).ratios + dcf_result
synthesis_nodeAgentSyntheseAppelle un LLM (Groq Llama 3.3 → Mistral → Anthropic Haiku en cascade) pour produire recommandation, conviction, targets bear/base/bull, thèse, catalyseurs.synthesis
synthesis_retryAgentSyntheseRetry si la sortie JSON est invalide ou si les garde-fous (price-anchor, conviction clamp) détectent une incohérence.synthesis (retry)
qa_nodeAgentQAPython + AgentQAHaikuDouble 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_nodeAgentDevilDevil'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_nodeAgentEntryZoneCalcule le signal d'entrée : écart DCF Base vs cours, momentum, sentiment FinBERT. Retourne une zone entry favorable/neutre/défavorable.entry_zone
output_nodeWritersAppelle 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.

02 · Gouvernance IA

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 1Traçabilité absolueTout chiffre cité dans un commentaire IA doit figurer dans DataSnapshot ou être dérivé par quant_node. Pas d'invention.
Article 2Price-anchorLes targets base/bull/bear doivent être dans [cours × 0,65 ; cours × 1,35]. Hors zone → retry ou rejet.
Article 3Conviction bornéeLa conviction est forcée dans [0,25 ; 0,90]. En-deçà de 0,25 = erreur LLM reconstruite depuis recommandation + data_quality.
Article 4Budget mots strictChaque champ de sortie a un budget de mots (ex: thesis = 3 phrases × 12-18 mots). Dépassement = troncature contrôlée.
Article 5Typographie FRAccents complets exigés (é è ê à ç ô), apostrophes droites, pas de points de suspension. restore_accents.py post-traite.
Article 6Spécificité secteurInterdiction de généralités applicables à n'importe quel secteur. Le contenu doit nommer des drivers propres.
Article 7Honnêteté des limitesNe 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.

AgentJustice
Contrôle la conformité à la constitution. Détecte les violations d'articles et les flag.
AgentEnquete
Vérifie les chiffres cités dans les commentaires contre DataSnapshot (non-invention).
AgentJournaliste
Évalue la lisibilité : structure, concision, absence de jargon gratuit, accroche.
AgentSociologue
Contrôle les biais socio-économiques et la neutralité politique des analyses.

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 appelantTempératureMax tokensJustification
AgentSynthese0.32 200Créativité modérée pour varier la prose, mais structure imposée par JSON schema.
AgentQAHaiku0.1800Audit strict, aucune créativité souhaitée.
AgentDevil0.61 500Plus créatif pour explorer la thèse inverse.
Writers sectoriels0.25700Commentaires factuels à variabilité limitée.
Gemini Vision0.11 500Audit visuel déterministe des PDF produits.
03 · Sources de données

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.

SourceTypeCouvertureUsage FinSight
yfinanceCotations / fondamentauxMondiale (cotées)Source principale. Historique 5 ans, ratios LTM, dividendes.
FinnhubNews / sentimentMondiale10 articles ticker-spécifiques par analyse. FinBERT local calcule le sentiment.
FMPFundamentalsSurtout USFallback si yfinance manque des champs. Free plan limité, 401/403 fréquents sur EU.
FREDMacroUS principalementTaux directeur, inflation, indice confiance, spread haut rendement.
PappersSociétés non cotéesFrance (3,5 M+ entreprises)Source principale PME. Bilans, dirigeants, K-Bis, liens capitalistiques.
INPI RNEActes + comptes annuelsFranceComplément Pappers. Dépôts de comptes officiels, statuts, évolutions.
BODACCProcédures collectivesFranceRedressements, liquidations, radiations. Signal d'alerte solvabilité.
DGCCRFSanctions LMEFranceAmendes publiques pour retard de paiement > 60 jours (loi LME).
feedparserRSS backupYahoo FinanceBackup 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.

04 · Score FinSight propriétaire

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

Qualité
Piotroski F-Score (9 points), ROE, ROIC, marge EBITDA. Détecte la capacité à générer un return on capital supérieur au coût.
Valeur
EV/EBITDA, P/E forward, P/B, FCF yield. Bornes calibrées par secteur (médianes et quartiles du même univers).
Momentum
Rendement 3/6/12 mois, écart vs MM200, sentiment FinBERT sur news récentes.
Risque (inversé)
Altman Z, Beneish M, ND/EBITDA, volatilité 1Y, beta. Plus le score est haut, plus le risque est maîtrisé.

Pondération par profil

ProfilQualitéValeurMomentumRisque
Conservateur LT35%20%10%35%
Balanced (équilibré)25%25%25%25%
Growth agressif15%10%50%25%
Value contrarian20%50%10%20%
Income dividendes25%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 — Weighted Average Cost of Capital
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)
DCF — Discounted Cash Flow Monte Carlo
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)
Altman Z-Score
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)
Piotroski F-Score (9 critères binaires)
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.
Beneish M-Score (8 facteurs)
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 :

Quality (0–100)
Piotroski F-Score35 %
ROIC25 %
ROE20 %
Marge EBITDA20 %
Value (0–100)
EV/EBITDA vs médiane sect.35 %
P/E Forward25 %
P/B20 %
FCF Yield20 %
Momentum (0–100)
Rendement 12 mois30 %
Rendement 6 mois25 %
Rendement 3 mois20 %
Écart vs MM20015 %
Sentiment FinBERT10 %
Risque inversé (0–100)
Altman Z30 %
ND/EBITDA25 %
Beneish M20 %
Volatilité 1Y15 %
Beta10 %

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).

05 · Validation empirique

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

Profiln BUYExcès moyent-statInformation Ratio% positifs
Balanced57+8,9 %+2,10 ★★+0,2874 %
Growth agressif57+6,1 %+1,89 ★+0,2577 %
Conservateur220−2,6 %−1,49−0,1066 %
Value contrarian320−5,6 %−4,15 ★★★−0,2363 %
Income dividendes227−4,3 %−2,33 ★★−0,1564 %

★ = significatif à 90 %, ★★ = 95 %, ★★★ = 99 %.

Métriques de validation — formules

Information Ratio
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-statistique de Student
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
06 · Limites et biais assumés

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.

07 · Profils sectoriels adaptatifs

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.

STANDARDCorporate génériqueTech, conso, healthcare, industrials, materials, comm. services
Modèle de valorisation : DCF Monte Carlo
Ratios sectoriels : EV/EBITDA, P/E, EV/Revenue, marges brute/EBITDA/nette, ROE, ROIC, Altman Z
Hint LLM injecté : Ratios classiques. Mention FCF et qualité du bilan.
BANKBanque commercialeFinancial Services + industry contient « Bank »
Modèle de valorisation : P/TBV + ROE vs coût du capital
Ratios sectoriels : P/TBV, ROE, ROTE, CET1, NPL, Cost/Income, NIM, Provisions
Hint LLM injecté : Pas d'EBITDA. Revenue = NII + commissions + trading. Focus levier réglementaire (CET1 > 12 %), qualité actifs (NPL < 3 %), rentabilité capital (ROE > coût du capital 8-10 %).
INSURANCEAssuranceFinancial Services + industry Insurance
Modèle de valorisation : Embedded Value / P/EV
Ratios sectoriels : P/EV, Combined Ratio, Loss Ratio, ROE, Solvency II, Investment Yield
Hint LLM injecté : Revenue = Primes Brutes Acquises. EBITDA = Résultat opérationnel avant taxes. Combined Ratio < 100 % = souscription profitable. Gross margin ≈ (1 − Loss Ratio).
REITFoncière cotéeReal Estate + industry REIT
Modèle de valorisation : NAV (Net Asset Value) + P/NAV
Ratios sectoriels : P/NAV, FFO/share, AFFO/share, Dividend Yield, Debt/Equity, Occupancy Rate, Cap Rate
Hint LLM injecté : Revenue = Rental Income. EBITDA ≈ NOI (Net Operating Income). Marge NOI typique 70-90 %. Net margin souvent <10 % (dépréciations). Valorisation par NAV plutôt que DCF.
UTILITYUtility réguléeUtilities (électricité, gaz, eau régulés)
Modèle de valorisation : RAB (Regulated Asset Base) × rendement réglementé
Ratios sectoriels : P/B, Regulated ROE, Dividend Yield, Debt/EBITDA, Payout Ratio
Hint LLM injecté : Modèle économique = base d'actifs régulés rémunérée. Croissance liée aux CapEx autorisés par le régulateur. Dividende = variable clé pour l'investisseur.
OIL_GASE&P pétrole/gazEnergy + industry E&P ou Integrated (hors downstream pur)
Modèle de valorisation : NAV par réserves + sensibilité prix baril
Ratios sectoriels : EV/EBITDA, EV/Reserves, EV/Production, Free Cash Flow Breakeven Price, Debt/EBITDA
Hint LLM injecté : Cyclicalité extrême tied au prix du baril. Valorisation inclut NAV des réserves P1 + P2. Break-even price FCF = indicateur clé (survie si prix brut < break-even).

Code source : core/sector_profiles.py (fonction detect_profile + dict _CONFIGS).

08 · Stack technique

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

ComposantRôleLignes
outputs/Writers PDF / PPTX / Excel / Briefing46 846
core/Pipeline, graph, scores, profils sectoriels17 372
agents/7 agents du pipeline + observateurs6 522
backend/FastAPI + endpoints REST5 438
cli_analyze.pyOrchestration CLI (société / secteur / indice / PME / cmp)3 038
tools/Audits, migrations, backtest, générateurs29 714
— Total PythonBack-end + outillage108 930
frontend/src/Next.js 14 + TypeScript + composants dashboard27 093
— Total généralPython + TypeScript136 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.

09 · Choix de conception

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).

10 · Sécurité et RGPD

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.
11 · Roadmap scientifique

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.