Vai al contenuto

Banche, assicurazioni e finanzaBI, AI e ML per l'azienda

Frodi nei pagamenti con carta

Ogni pagamento con carta lascia una riga: importo, esercente, paese, ora. In Muvia una funzione Python scritta dal vostro team confronta ogni pagamento con le abitudini del cliente e gli dà un punteggio che dice perché, e un allarme avvisa l'antifrode quando i casi sospetti si addensano.

Scenario illustrativo: descrive un caso tipo, non il progetto di un cliente.

Una frode da sola si nota. Un'ondata notturna, spesso, solo al mattino.

I controlli in autorizzazione fermano i casi evidenti. Restano i pagamenti plausibili uno per uno ma strani per quel cliente: un orario mai visto, un paese nuovo, una categoria in cui non compra mai. Quando arrivano a decine nella stessa notte, sono un attacco.

Per vederlo servono le abitudini di ogni cliente accanto a ogni pagamento, un punteggio che dica perché un pagamento è sospetto e un allarme che guardi l'insieme, non il singolo caso.

Per chi
Antifrode e monitoraggio delle transazioni, data scientist della banca, risk management e operations delle carte.
I pagamenti con carta in file orari via SFTP, clienti e carte dal core banking su Oracle, i disconoscimenti da un'API REST e le categorie degli esercenti in Excel entrano in Muvia, dove una funzione del team calcola un punteggio per ogni pagamento; escono una tabella dei punteggi, un cruscotto delle anomalie, un allarme sull'ondata e il resoconto della settimana.

In Muvia, passo per passo

Schermate vere del prodotto, registrate su un progetto con dati di esempio.

1 di 5

Il video · Ogni pagamento con carta lascia una riga: importo, esercente, paese, ora. In Muvia una funzione Python scritta dal vostro team confronta ogni pagamento con le abitudini del cliente e gli dà un punteggio che dice perché, e un allarme avvisa l'antifrode quando i casi sospetti si addensano.

Cosa ottieni

Un punteggio che si spiega
Ogni pagamento sospetto porta con sé i motivi: chi lo guarda sa perché è stato segnalato, senza aprire il codice.
L'ondata, non solo il caso
L'allarme guarda quanti pagamenti sospetti arrivano insieme, così un attacco notturno si vede come tale.
Il modello resta del team
Segnali, pesi e soglie li decide la banca; un modello nuovo è una nuova versione della funzione, provata prima di andare in produzione.
Ogni decisione resta scritta
Chi ha preso in carico l'episodio, cosa ha bloccato e perché resta nel registro allarmi.

Per il team tecnico

Come si costruisce in Muvia

  1. 1

    Porta in Muvia i pagamenti

    Un file ogni ora via SFTP aggiunge le nuove transazioni alla tabella dei pagamenti; core banking e disconoscimenti sono copiati su programma. Ogni sorgente diventa una tabella interrogabile.

  2. 2

    Ricava le abitudini del cliente

    Una query calcola per ogni cliente orari, paesi, categorie e importo tipico degli ultimi mesi e li salva come dataset con campi stabili.

  3. 3

    Scrivi il punteggio in Python

    Una funzione confronta ogni pagamento con quelle abitudini e somma cinque segnali in un punteggio, con i motivi scritti accanto. Il team può sostituirla con un modello scikit-learn o ONNX addestrato altrove; prima la provi in un'esecuzione di prova, che non scrive nulla.

  4. 4

    Guarda l'ondata

    Un cruscotto mostra i pagamenti sospetti per ora e categoria in una mappa di calore e il punteggio contro l'importo: un attacco notturno si riconosce a colpo d'occhio.

  5. 5

    Metti un allarme sull'insieme

    Un flusso apre un episodio quando i pagamenti sopra soglia superano un numero in un'ora. Nel registro l'antifrode lo prende in carico e annota cosa ha bloccato; il resoconto della settimana è un notebook.

Funzione Python

import numpy as np

def transform(inputs, params, ctx):
    df = inputs["rows"]
    segnali = {
        "ora insolita": df["quota_ora_cliente"] < 0.02,
        "paese nuovo": df["paese"] != df["paese_abituale"],
        "categoria nuova": df["quota_categoria_cliente"] == 0,
        "importo alto": df["importo"] > 3 * df["importo_mediano_cliente"],
        "raffica": df["pagamenti_ultima_ora"] >= params["raffica"],
    }
    pesi = params["pesi"]
    out = df[["id_pagamento", "id_carta", "data_ora", "importo"]].copy()
    out["punteggio"] = sum(pesi[k] * s.astype(int) for k, s in segnali.items())
    nomi = np.array(list(segnali))
    accesi = np.column_stack([s.to_numpy(dtype=bool) for s in segnali.values()])
    out["motivi"] = [", ".join(nomi[riga]) for riga in accesi]
    out["sospetto"] = out["punteggio"] >= params["soglia"]
    ctx.logger.info("pagamenti valutati: %d", len(out))
    return {"rows": out}
Cinque segnali contro le abitudini del cliente, pesati dal team: ogni pagamento esce con un punteggio e i motivi che lo spiegano.
I dati che servono
  • Pagamenti con carta con importo, esercente, categoria, paese e canale, in file orari ricevuti via SFTP
  • Clienti e carte dal core banking su Oracle
  • Disconoscimenti e segnalazioni dei clienti, letti da un'API REST
  • Categorie degli esercenti e livelli di rischio, da un file Excel
Le parti di Muvia usate

Portaci una domanda a cui oggi non sai rispondere.

Partiamo da una domanda vera della tua azienda e ti mostriamo il percorso dalla fonte al cruscotto, con i tuoi sistemi e non con quelli di una demo.