Logo
Afbeelding

Transacties naar risicolanden analyseren (CAMT en FATF-lijst)

Geschreven door The Audit Analytics | 5 minuten

Ontdek met één simpele data-analyse welke betalingen jouw organisatie doet naar risicovolle landen. Deze controle helpt je mogelijke witwas- of frauderisico’s te signaleren, en maakt gebruik van de internationale FATF-lijst in combinatie met jouw bankmutaties (CAMT-053).

Betalingen risicovolle betaalstromingen

Bij elke financiële audit hoort een beoordeling van geldstromen. Niet alleen om te weten waar geld vandaan komt en naartoe gaat, maar ook om te toetsen of er geen betalingen plaatsvinden naar risicovolle landen. Zulke betalingen kunnen duiden op witwassen, fraude of financiering van terrorisme.

De FATF-lijst (Financial Action Task Force) bevat landen met een verhoogd risico op dit gebied. Organisaties die actief internationaal handelen – bijvoorbeeld importeurs, donatieplatforms of logistieke bedrijven – lopen extra risico op dergelijke betalingen.

Als auditor of controller kun je met data-analyse eenvoudig nagaan of er geldstromen zijn die extra aandacht verdienen. We gebruiken hiervoor de bankmutaties in het CAMT.053-formaat en analyseren deze met Python.

Benodigde data en packages

Voor deze analyse gebruiken we CAMT-bestanden. Dit zijn XML-bestanden die door banken worden gebruikt om transacties te rapporteren. Vrijwel alle Europese banken bieden vanaf 2025 een export in dit formaat aan.

Meer uitleg over het formaat vind je hier en in een ander artikel vind je een coverter naar Excel.

Daarnaast voeren we deze analyse uit in python. Hier hebben we nog wel een aanvullende package nodig ('pandas'). Deze kun je makkelijk installeren. Meer informatie over pandas in de audit vind je op de website.

Stap 1: Lijst van risicovolle landen

Allereerst definiëren we een lijst van risicovolle landen op basis van de FATF-lijst. Je kunt hier ook de lijst vinden: https://www.fatf-gafi.org/en/countries/black-and-grey-lists.html

# Lijst van risicovolle landen (voorbeeld)
risicovolle_landcodes = {"IR", "KP", "SY", "SD", "PK", "YE", "MM", "CU", "AF", "ZM"}

Stap 2: Inlezen van het CAMT.053-bestand

We lezen de bankmutaties in en halen de belangrijkste velden op: datum, bedrag, debiteur, crediteur en IBAN. In het script hieronder heb ik dat redelijk kort door de bocht gedaan. Meer informatie over deze CAMT-converter vind je in het andere artikel.

import xml.etree.ElementTree as ET
import pandas as pd

def parse_camt053(file_path):
    tree = ET.parse(file_path)
    root = tree.getroot()
    ns = {'ns': 'urn:iso:std:iso:20022:tech:xsd:camt.053.001.02'}

    transactions = []
    for entry in root.findall('.//ns:Ntry', ns):
        try:
            amount = float(entry.find('ns:Amt', ns).text)
        except (ValueError, AttributeError):
            amount = 0.0

        currency = entry.find('ns:Amt', ns).attrib.get('Ccy', 'N/A')
        date = entry.find('.//ns:BookgDt/ns:Dt', ns).text or '-'
        debtor = entry.find('.//ns:Dbtr/ns:Nm', ns).text or '-'
        debtor_iban = entry.find('.//ns:DbtrAcct/ns:Id/ns:IBAN', ns).text or '-'
        creditor = entry.find('.//ns:Cdtr/ns:Nm', ns).text or '-'
        creditor_iban = entry.find('.//ns:CdtrAcct/ns:Id/ns:IBAN', ns).text or '-'

        transactions.append({
            "Datum": date,
            "Debiteur": debtor,
            "Debiteur IBAN": debtor_iban,
            "Crediteur": creditor,
            "Crediteur IBAN": creditor_iban,
            "Bedrag": amount,
            "Munteenheid": currency
        })
    
    return pd.DataFrame(transactions)

# CAMT-bestand inladen
file_path = "camt053_dummy.xml"
df = parse_camt053(file_path)
print(df.head())

Stap 3: Landcodes uit IBAN halen

De eerste twee letters van een IBAN vormen de landcode. Zo kun je bepalen in welk land de rekening wordt gehouden.

def get_country_from_iban(iban):
    return iban[:2]

df["Crediteur Landcode"] = df["Crediteur IBAN"].apply(get_country_from_iban)
df["Debiteur Landcode"] = df["Debiteur IBAN"].apply(get_country_from_iban)

Stap 4: Filteren op risicovolle landen

We filteren nu de transacties waarbij de betaler of ontvanger uit een risicoland komt.

df_risicovol = df[
    df["Crediteur Landcode"].isin(risicovolle_landcodes) |
    df["Debiteur Landcode"].isin(risicovolle_landcodes)
]

Stap 5: Samenvatten van resultaten

Tot slot geven we inzicht in hoeveel betalingen er zijn en welke bedragen ermee gemoeid zijn.

df_analyse = df_risicovol.groupby(["Crediteur Landcode"]).agg(
    Aantal_Transacties=("Bedrag", "count"),
    Totaal_Bedrag=("Bedrag", "sum")
).reset_index()

print(df_analyse)
Crediteur LandcodeAantal_TransactiesTotaal_Bedrag
IR512500
PK37600
YE718100
CU23200

Interpretatie en vervolgstappen

De analyse laat zien naar welke landen betalingen zijn gedaan en hoe vaak dat voorkomt. Als auditor kijk je vervolgens verder:

  • Zijn deze betalingen legitiem (bijv. reguliere leveranciers)?
  • Zijn er opvallende namen, nieuwe rekeningen of ongebruikelijke bedragen?
  • Zijn er transacties naar landen die niet passen bij de bedrijfsactiviteiten?

Zo krijg je snel inzicht in mogelijke risico’s op witwastransacties of ongeautoriseerde betalingen.

Nadelen IBAN landcodes & BIC

Niet elk land werkt met IBAN-nummers. Het International Bank Account Number (IBAN) is vooral in gebruik binnen Europa en bij landen die deelnemen aan de SEPA-standaard (Single Euro Payments Area). Daarbuiten gebruiken banken vaak eigen rekeningformaten of nationale codes.

Bij het analyseren van CAMT-bestanden of andere betalingsdata is het belangrijk om hier rekening mee te houden:

  • Controleer of het veld ‘IBAN’ daadwerkelijk gevuld is. Ontbrekende waarden kunnen betekenen dat de transactie afkomstig is uit een niet-IBAN-land.

  • Gebruik in zulke gevallen aanvullende velden zoals BIC (Bank Identifier Code) om het land van herkomst of bestemming te bepalen.

  • Bij internationale betalingen via SWIFT kun je vaak de BIC of de country code in de transactie gebruiken om het land alsnog te herleiden.

Let op dat sommige banken buitenlandse betalingen via tussenrekeningen laten lopen. De oorspronkelijke landcode kan dan ontbreken in het IBAN-veld, waardoor de analyse vertekening kan geven.

Kortom: hoewel IBAN een betrouwbare indicator is binnen Europa, moet je bij betalingen buiten het SEPA-gebied alternatieve velden gebruiken of extra controles uitvoeren om de herkomst van transacties correct te identificeren.

Toolkit

Wil je dieper graven? Overweeg dan eens de CAMT Analytics Toolkit. Deze toolkit bevat uitgebreide scripts, documentatie en dummy data om deze en soortgelijke analyses uit te voeren. Hierin is bijvoorbeeld ook een analyse met behulp van de BIC opgenomen om een nog sterkere analyse op de herkomst te kunnen uitvoeren. Meer informatie over deze toolkits vind je op deze pagina.