Un analyste financier IA exécuté localement permet d’analyser vos relevés bancaires sans envoyer de données au cloud, en combinant Python, preprocessing robuste, modèles ML légers et LLMs locaux (ex. ollama/gpt4all). Poursuivez pour un plan concret, snippets et choix techniques vérifiés.
Pourquoi créer un analyste financier IA privé
Pour garder le contrôle de vos données financières tout en obtenant des insights automatisés et détecter des anomalies sans dépendre d’un service cloud.
Les applications financières classiques présentent trois limites majeures. Premièrement, elles dépendent du cloud pour le stockage et le calcul, ce qui introduit une surface d’attaque supplémentaire et des flux de données hors de votre contrôle. Deuxièmement, les risques de fuite existent via les API, les logs ou les mauvaises configurations d’hébergement. Troisièmement, le verrouillage propriétaire empêche l’audit des modèles et la portabilité des données.
Le cadre réglementaire impose des obligations claires sur la protection des données personnelles. La CNIL rappelle que la sécurité des données personnelles doit être garantie et adaptée au risque (voir CNIL — La sécurité des données personnelles : https://www.cnil.fr/fr/la-securite-des-donnees-personnelles). Le traitement local est pertinent pour les données bancaires car il réduit les transferts externes, facilite les audits et limite l’exposition en cas de compromission d’un tiers.
Exigences essentielles (explication courte : ce que doit assurer l’analyste IA).
- Chargement local instantané : Les fichiers bancaires et connexions doivent rester sur la machine ou le réseau privé sans upload.
- Traitement entièrement local : Toutes les inférences et logs doivent s’exécuter hors cloud, y compris les modèles ML/LLM compressés.
- Génération d’insights en langage naturel : Résumés compréhensibles par un non-expert, conseils actionnables.
- Détection d’anomalies : Algorithmes temps réel ou batch pour repérer fraudes, doublons et dépenses inhabituelles.
- Modularité et portabilité : Composants échangeables et export des données au format ouvert (CSV/JSON).
Usages concrets (courte introduction : cas quotidiens pour un utilisateur).
- Budget mensuel : Calcul automatique des écarts par poste et alertes de dépassement.
- Identification de transactions inhabituelles : Détection de paiements anormaux et suggestions d’action.
- Catégorisation automatique : Attribution de catégories aux transactions et apprentissage personnalisé.
- Résumé mensuel en langage clair : Synthèse des revenus, dépenses et recommandations.
| Critère | Cloud | Local |
| Confidentialité | Plus faible (transferts externes) | Plus élevée (données restent chez vous) |
| Latence | Variable, dépend du réseau | Faible, quasi instantanée |
| Coût | Abonnements récurrents | Investissement initial, coûts infra maîtrisés |
| Maintenance | Externalisée mais dépendante du fournisseur | Interne, nécessite compétences mais contrôle total |
La protection réglementaire et les exigences opérationnelles rendent le traitement local souvent préférable pour des données bancaires sensibles ; poursuivons maintenant vers l’architecture technique de cet analyste IA privé.
Quelle architecture pour le projet
Projet orienté analyste financier IA privé local, privilégiez une architecture modulaire Python en couches (UI Streamlit, prétraitement, ML, visualisations, intégration LLM) pour faciliter maintenance et sécurité.
- Arborescence recommandée :
- app.py (Streamlit UI).
- config.py (paramètres, endpoints Ollama/gpt4all, chemins locaux).
- preprocessing.py (détection automatique et normalisation CSV).
- ml_models.py (classifieur de transactions, IsolationForest pour anomalies).
- visualizations.py (graphes Plotly, composants réutilisables).
- llm_integration.py (API locale LLM avec streaming et gestion de prompts).
- requirements.txt, README.md, .env.example, sample_data/.
- Séparation en couches et responsabilités :
- Couche Interface : Fournit l’UI Streamlit, appels asynchrones vers les autres modules et orchestration des workflows.
- Couche Prétraitement : Produit un pandas.DataFrame standardisé, gère typage, normalisation des devises et imputations basiques.
- Couche ML : Expose fit/predict/score pour modèles scikit-learn, pipeline réutilisable et sauvegarde des artefacts (joblib).
- Couche Visualisation : Fournit fonctions Plotly prêtes à l’emploi et abstractions pour dashboards.
- Couche LLM : Encapsule prompts, templates, streaming de tokens et post-traitement sécurisé des réponses.
- Isolation des secrets et gestion des données :
- Stockez clés et secrets dans un fichier .env local jamais commité et documenté avec .env.example.
- Appliquez permissions POSIX restreintes (chmod 600) et accès limité utilisateur.
- Chiffrez les sauvegardes locales (AES-256) et appliquez règles de rétention (30–90 jours selon sensibilité).
| Déploiement local | Contraintes matérielles minimales |
| Poste personnel ou mini-serveur (NAS/Intel NUC). | CPU Quad-core, 16 Go RAM, 50 Go disque. Pour LLM léger (quantifié), 8–16 Go VRAM ou CPU optimisé. |
Bibliothèques clés :
- Pandas, Numpy : Traitement et manipulation des données.
- Scikit-learn : Modèles ML classiques (classification, IsolationForest).
- Plotly : Visualisations interactives.
- Streamlit : Interface utilisateur rapide.
- Ollama/GPT4All client : Intégration LLM locale et streaming.
Checklist pour démarrer :
- Initialiser repo avec .gitignore et .env.example.
- Créer virtualenv et installer requirements.txt.
- Préparer sample_data/ et scripts de normalisation dans preprocessing.py.
- Déployer un LLM local léger et configurer config.py.
- Valider flux end-to-end via app.py sur votre machine.
Comment construire un pipeline de prétraitement robuste
Construire un pipeline de prétraitement robuste commence par détecter automatiquement le format CSV, mapper les colonnes via des regex, normaliser les montants (fusion débit/crédit) et produire un schéma unifié.
Les CSV bancaires sont hétérogènes : noms de colonnes variés, formats de date dissemblables, séparateurs et encodages différents, montants signés ou répartis en colonnes Débit/Crédit.
- Stratégie d’auto-détection : Utiliser des motifs regex sur les en-têtes pour repérer date, description, amount, debit, credit.
- Exemples de patterns sûrs : Date : (?:date|datum|fecha|datum) ; Description : (?:desc|libell|description|concept) ; Amount : (?:montant|amount|importe|valor) ; Debit : (?:debit|debit[o]?) ; Credit : (?:credit|crédit|abono).
- Multilingue : Prévoir accents et variantes (« crédit », « credito »), utiliser re.IGNORECASE et normaliser les espaces/underscores.
Extrait Python pour détecter le mapping (imports et gestion d’encodage inclus) :
import re
import pandas as pd
def detect_column_mapping(df):
patterns = {
"date": [r"\bdate\b", r"\bdatum\b", r"\bfecha\b"],
"descr": [r"\bdesc(?:ription)?\b", r"\blibell?\b", r"\bconcept\b"],
"amount": [r"\bmontant\b", r"\bamount\b", r"\bimporte\b"],
"debit": [r"\bdebit\b", r"\bdebit[o]?\b"],
"credit": [r"\bcredit\b", r"\bcr[eé]dit\b", r"\babono\b"]
}
cols = {c: c for c in df.columns}
mapping = {}
for target, pats in patterns.items():
for col in df.columns:
n = re.sub(r"[^\w]", " ", col.lower())
if any(re.search(p, n, re.IGNORECASE) for p in pats):
mapping[target] = col
break
return mapping
Normalisation des montants : fusion Débit/Crédit en colonne amount signée et parsing sécurisé :
import re
def parse_number(s):
if pd.isna(s):
return 0.0
s = str(s).strip()
s = s.replace(" ", "")
if "," in s and "." in s:
if s.rfind(",") > s.rfind("."):
s = s.replace(".", "").replace(",", ".")
else:
s = s.replace(",", "")
elif "," in s:
parts = s.split(",")
s = ".".join(parts[:-1]) + "." + parts[-1] if len(parts[-1]) != 3 else s.replace(",", "")
s = re.sub(r"[^\d\.-]", "", s)
try:
return float(s)
except:
return 0.0
def normalize_amounts(df, mapping):
if "amount" in mapping:
df["amount"] = df[mapping["amount"]].apply(parse_number)
else:
debit = mapping.get("debit")
credit = mapping.get("credit")
df["amount"] = 0.0
if debit:
df.loc[df[debit].notna(), "amount"] -= df[debit].apply(parse_number)
if credit:
df.loc[df[credit].notna(), "amount"] += df[credit].apply(parse_number)
return df
Normaliser les dates avec pandas.to_datetime(…, dayfirst=True) puis .dt.strftime(‘%Y-%m-%dT%H:%M:%S’) pour ISO. Identifier les transactions récurrentes via motifs dans la description (ex. « ABONNEMENT », « SUBSCRIPTION ») et créer des features : catégorie brute par mots-clés, jour de la semaine, montant absolu et rolling sum 30j (groupby compte si besoin).
- Tests unitaires recommandés : Cas encodage (UTF-8/ISO-8859-1), colonnes manquantes, formats exotiques de nombre/date, colonnes debit/credit présentes séparément.
- Logging : Logger les lignes échouées au parsing, le mapping non trouvé et les heuristiques appliquées avec niveaux INFO/WARNING/ERROR.
Tableau synthétique de mapping :
| Exemple colonne | Schéma unifié |
| Transaction Date | date |
| Libellé | descr |
| Débit | debit |
| Crédit | credit |
| Montant | amount |
Comment intégrer modèles ML, détection d’anomalies et LLM local
Assembler ML classique, détection d’anomalies et un LLM local permet d’avoir un analyste financier privé, explicable et actionnable directement sur votre poste.
- Choix des modèles. LogisticRegression ou RandomForest léger conviennent pour petits jeux de données : complexité contrôlée, besoins en données modestes, explicabilité (coefficients / feature importances). IsolationForest reste un bon choix non supervisé pour anomalies : sensibilité faible aux outliers, besoin réduit d’étiquettes.
- Snippet d’entraînement (scikit-learn). Exemple minimal :
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import train_test_split, cross_val_score
import joblib
# Chargement
df = pd.read_csv("transactions.csv") # colonnes: amount, date, description, label
# Features simples
df['day'] = pd.to_datetime(df['date']).dt.day
tf = TfidfVectorizer(max_features=200)
desc_vec = tf.fit_transform(df['description']).toarray()
X = np.hstack([df[['amount','day']].values, desc_vec])
y = df['label']
# Classifieur léger
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)
clf = LogisticRegression(max_iter=200)
clf.fit(X_tr, y_tr)
# IsolationForest pour anomalies
iso = IsolationForest(contamination=0.01, random_state=42)
iso.fit(X) # non supervisé
# Sauvegarde
joblib.dump({'clf': clf, 'iso': iso, 'tf': tf}, 'models.pkl')
- Étiquetage & validation. Quelques centaines d’exemples suffisent pour démarrer. Priorisez l’étiquetage des catégories critiques. Utilisez apprentissage actif simple : corrigez erreurs, ajoutez exemples mal classés, ré-entraînez périodiquement. Validez avec cross-validation et métriques : précision/recall par catégorie importante.
- Prompt template pour LLM local. Injecter top anomalies, catégories et trends, puis demander résumé et actions :
Contexte: {summary_metrics} Top anomalies: {top_anomalies} Catégories récentes: {category_counts} Tâche: Rédigez un résumé clair (3 phrases), explique pourquoi anomalies pertinentes et propose 3 actions concrètes. - Intégration LLM en streaming (pseudo-code). Exemple générique pour API locale (Ollama/GPT4All) :
import requests, json
# Limiter taille et anonymiser avant d'envoyer
payload = {"model":"local-model","messages":[{"role":"user","content":prompt}]}
with requests.post("http://localhost:11434/api/chat", json=payload, stream=True) as r:
for chunk in r.iter_lines():
if chunk:
print(json.loads(chunk.decode())['delta']['content'], end='')
- Safety. Limiter la taille des passages envoyés, anonymiser PII, garder tout en local (pas d’API cloud).
- Visualisation interactive. Utiliser Plotly + Streamlit pour rolling sum et scatter anomalies vs montant :
import streamlit as st
import plotly.express as px
df['rolling'] = df['amount'].rolling(30).sum()
fig1 = px.line(df, x='date', y='rolling', title='Rolling 30 jours')
fig2 = px.scatter(df, x='amount', y='iso_score', color='is_anomaly', title='Anomalies vs Montant')
st.plotly_chart(fig1)
st.plotly_chart(fig2)
- Checklist mise en production locale.
- Tests unitaires et end-to-end.
- Sauvegarde chiffrée des modèles (AES) et des données.
- Plan de mise à jour (retraining hebdo/mensuel selon drift).
- Monitorage local : distribution des features, AUC/precision/recall en shadow mode.
Prêt à déployer votre analyste financier IA privé local ?
Vous avez désormais un plan concret : raisons de privilégier le local, architecture modulaire, pipeline de preprocessing robuste, modèles ML légers pour catégorisation et IsolationForest pour anomalies, et intégration d’un LLM local pour générer insights en langage naturel. En appliquant ces étapes vous réduisez le risque de fuite de données, conservez le contrôle et obtenez des analyses exploitables. Le bénéfice pour vous : décisions financières plus rapides, privées et fiables grâce à une solution que vous contrôlez.
FAQ
A propos de l’auteur
Franck Scandolera — expert & formateur en Tracking avancé server-side, Analytics Engineering, Automatisation No/Low Code (n8n) et intégration IA en entreprise. Responsable de l’agence webAnalyste et de l’organisme de formation « Formations Analytics ». Références : Logis Hôtel, Yelloh Village, BazarChic, Fédération Française de Football, Texdecor. Disponible pour aider les entreprises => contactez moi.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.





