Home » AI » Comment créer un analyste financier IA privé local ?

Comment créer un analyste financier IA privé local ?

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

Comment garantir que mes relevés ne quittent jamais ma machine ?
En exécutant tout le pipeline localement (prétraitement, ML, LLM) et en évitant les API cloud. Stockez les données chiffrées localement, utilisez .env pour les secrets, et ne synchronisez pas les dossiers contenant les données vers des services externes.
Quel LLM local choisir pour générer des résumés ?
Privilégiez des modèles optimisés pour exécution locale (ex. distributions compatibles avec ollama ou gpt4all/llama.cpp selon licence et ressources). Choisissez un modèle léger pour un laptop et gardez les prompts courts pour limiter la charge.
Comment détecter les anomalies bancaires de façon fiable ?
Combinez un score d’anomalie non supervisé (IsolationForest) et règles métier (montants > seuils, doublons, changements soudains). Vérifiez avec un étiquetage minimal et boucle d’apprentissage (corriger puis réentraîner) pour améliorer la précision.
Quels formats CSV bancaires posent le plus de problèmes ?
Les variations de nommage des colonnes, encodages (ISO-8859-1 vs UTF-8), séparateurs décimaux/thousands différents et colonnes débit/crédit séparées. Une détection par regex et normalisation précoce résout la plupart des cas.
Puis-je intégrer cette solution à mon application existante ?
Oui, l’approche modulaire (preprocessing, ml_models, llm_integration) facilite l’intégration. Exposez des API locales internes ou modules importables et adaptez l’UI (Streamlit ou autre) selon vos besoins.

 

 

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.

Retour en haut
ClickAIpro