Comment générer un énorme graphique financier avec des schémas de blanchiment d'argent?

image

Il y a quelques annĂ©es, mon Ă©quipe (conformitĂ© dans l'une des banques suisses) et moi avions une tĂąche intĂ©ressante Ă  mettre en Ɠuvre - nous avons dĂ» gĂ©nĂ©rer un Ă©norme graphique alĂ©atoire des transactions financiĂšres entre les clients, les entreprises et les distributeurs automatiques de billets. De plus, nous voulions que ce graphique contienne des schĂ©mas de blanchiment d'argent et d'autres dĂ©lits financiers ainsi qu'une description des nƓuds tels que les noms, adresses, devises, etc. De toute Ă©vidence, toutes les donnĂ©es doivent ĂȘtre gĂ©nĂ©rĂ©es de maniĂšre alĂ©atoire Ă  partir de zĂ©ro tant que nous ne pouvons pas utiliser de donnĂ©es rĂ©elles pour des raisons Ă©videntes.

Comme solution, nous avons Ă©crit un gĂ©nĂ©rateur que j'aimerais partager avec vous. Cet article explique pourquoi nous en avions besoin et comment ce gĂ©nĂ©rateur fonctionne, mais si vous ne voulez pas lire et que vous voulez l'essayer par vous-mĂȘme, voici le code: https://github.com/MGrin/transactions-graph- gĂ©nĂ©rateur . J'espĂšre que notre expĂ©rience sera utile Ă  chacun d'entre vous.

Pourquoi étions-nous intéressés par un tel générateur?


Notre Ă©quipe a dĂ©cidĂ© de parrainer le hackaton LauzHack . L'une des conditions pour les sponsors Ă©tait de fournir une vĂ©ritable tĂąche commerciale aux participants, et par hasard, en mĂȘme temps, nous avions un projet intĂ©ressant liĂ© Ă  la dĂ©couverte du blanchiment d'argent dans le graphique de la transaction. Bien sĂ»r, nous avons dĂ©cidĂ© de confier la mĂȘme tĂąche aux participants au hackaton.

Comme je l'ai dit plus tĂŽt, nous ne pouvions pas utiliser de vraies donnĂ©es, nous devions donc les crĂ©er. Afin de rendre la tĂąche aussi proche que possible du monde rĂ©el, nous avons obtenu des statistiques Ă  partir de nos donnĂ©es et essayĂ© de crĂ©er des donnĂ©es gĂ©nĂ©rĂ©es pour suivre des distributions similaires. De plus, nous ne voulions pas avoir un petit graphique - nous travaillons quotidiennement avec des milliards de transactions entre des millions de nƓuds, et nous voulions donner aux participants la possibilitĂ© d'essayer leurs idĂ©es Ă  la mĂȘme Ă©chelle.

Qu'avons-nous obtenu en conséquence?


Nous pourrions construire un générateur de graphes assez rapide, intéressant et configurable! Voyons cela plus en détail:

Types de nƓuds


Participants de notre systÚme financier généré:

  • Client - un compte d'un client bancaire abstrait. Contient des champs comme le nom, l'adresse e-mail, l'Ăąge, la profession, l'Ă©ducation, la nationalitĂ© et l'adresse.
  • SociĂ©tĂ© - une entitĂ© commerciale dans notre systĂšme financier. Contient des champs comme le type, le nom et le pays.
  • ATM - un point de sortie pour l'argent de notre graphique financier vers l'extĂ©rieur oĂč il ne peut plus ĂȘtre suivi. Contient des coordonnĂ©es GPS.
  • Transaction - enregistrement du transfert d'argent entre 2 nƓuds de graphique. Contient des pointeurs vers les nƓuds source et cible, le montant, la devise et la date et l'heure d'exĂ©cution.

Pour générer ces données, nous avons utilisé Mimesis , une excellente bibliothÚque pour la génération de fausses données.

Génération de graphes: entités de base


Le gĂ©nĂ©rateur commence par la crĂ©ation d'entitĂ©s de base - clients, entreprises et distributeurs automatiques de billets. Le script prend en entrĂ©e un nombre souhaitĂ© de clients et, sur la base de ce nombre, calcule le nombre d'entreprises et de distributeurs automatiques de billets Ă  gĂ©nĂ©rer. Nous avons dĂ©duit que le nombre d'entreprises est Ă©gal Ă  2,5% du nombre total de clients et le nombre de distributeurs automatiques de billets est Ă©gal Ă  0,05%. Ces paramĂštres sont assez moyennĂ©s et sont codĂ©s en dur Ă  l'intĂ©rieur du gĂ©nĂ©rateur lui-mĂȘme.

Toutes les informations gĂ©nĂ©rĂ©es sont enregistrĂ©es dans des fichiers .csv. L'Ă©criture dans ces fichiers se fait par lots de k lignes, k Ă©tant un paramĂštre configurable. De plus, chaque type de nƓud est gĂ©nĂ©rĂ© en parallĂšle pour accĂ©lĂ©rer l'ensemble du processus.

GĂ©nĂ©ration de graphe: arĂȘtes entre entitĂ©s


AprĂšs la crĂ©ation des entitĂ©s de base, nous commençons Ă  les connecter entre elles. À ce stade, nous ne gĂ©nĂ©rons pas encore de transactions, mais uniquement le fait que deux nƓuds sont connectĂ©s. Nous l'avons fait de cette façon pour accĂ©lĂ©rer le processus et cela fonctionne comme suit: s'il y a un bord entre deux nƓuds, il y aura un certain nombre de transactions sĂ©parĂ©es dans le temps. Aucun avantage - aucune transaction du tout.

La probabilitĂ© si et le bord entre deux nƓuds et les types de bords possibles sont:

  • Client -> Client, p = 0,4%
  • Client -> Entreprise, p = 1%
  • Client -> ATM, p = 3%
  • Entreprise -> Client, p = 0,5%

Ces probabilitĂ©s peuvent ĂȘtre configurĂ©es Ă  l'aide des paramĂštres du gĂ©nĂ©rateur.

Tout comme les nƓuds, tous les types de bords sont gĂ©nĂ©rĂ©s en parallĂšle et sont Ă©crits dans des fichiers par lots.

Génération de graphiques: transactions


Ayant des nƓuds et des bords ayant une distribution souhaitĂ©e, nous pouvons commencer la gĂ©nĂ©ration de transactions. Le processus est simple Ă  mettre en Ɠuvre mais est assez difficile Ă  mettre en parallĂšle. De ce fait, Ă  ce stade, seuls deux threads fonctionnent - un pour la gĂ©nĂ©ration de transactions de sourcing client, un autre - pour la gĂ©nĂ©ration de transactions de sourcing d'entreprise. Le nombre de transactions pour un bord est alĂ©atoire et sĂ©parĂ© alĂ©atoirement dans le temps.

Comme ci-dessus, les transactions générées sont écrites dans des fichiers .csv par lots.

Génération de graphes: motifs


C'est là que les choses deviennent intéressantes. Nous avons défini trois modÚles que nous voulions avoir dans notre graphique:

  • Flux - une grande quantitĂ© d'argent est envoyĂ©e du nƓud source Ă  N nƓuds, et eux l'un de ces N nƓuds envoie de l'argent Ă  un autre K nƓuds, etc. jusqu'Ă  ce que la derniĂšre couche de ce rĂ©seau envoie tout l'argent reçu Ă  un nƓud cible.
  • Circulaire - une grande somme d'argent passe par diffĂ©rents nƓuds et revient au nƓud source.
  • Temps - une certaine quantitĂ© est transfĂ©rĂ©e du nƓud A au nƓud B plusieurs fois, sĂ©parĂ©es par un temps pseudo-alĂ©atoire.

Découvrons ces motifs un par un.

Débit


Nous commençons par sĂ©lectionner un certain nombre de couches du rĂ©seau. Dans notre rĂ©alisation, il s'agit d'un nombre alĂ©atoire compris entre 2 et 6, et ces valeurs ne sont pas configurables. Ensuite, nous choisissons au hasard 2 nƓuds - source et cible. De plus, le montant qui sera Ă©mis par un nƓud source est gĂ©nĂ©rĂ© alĂ©atoirement comme 50000 * random () + 50000 * random ().

Chaque participant de ce réseau prend un paiement pour son service. Dans notre réalisation, le paiement total pour l'ensemble de l'utilisation du réseau ne dépassera pas 10% du montant de la source.

Toutes les transactions générées sont retardées dans le temps d'une couche à l'autre. Les délais sont aléatoires et ne dépassent pas 5 jours.

Circulaire


Est similaire au modĂšle Flow, sauf que les nƓuds source et cible sont identiques et qu'il n'y a qu'un seul nƓud par couche intermĂ©diaire.

Le temps


Le modĂšle le plus simple. Une quantitĂ© alĂ©atoire est envoyĂ©e du nƓud A au nƓud B plusieurs fois (nombre alĂ©atoire entre 5 et 50, non configurable) avec des retards pseudo-alĂ©atoires entre les transactions.

Randomisation des transactions finales


À ce stade, nous avons un certain nombre de fichiers .csv:

  • 3 fichiers avec informations sur les nƓuds (clients, entreprises, distributeurs automatiques de billets)
  • 4 fichiers avec transactions: un pour les transactions habituelles et 3 pour les transactions Ă  partir des modĂšles gĂ©nĂ©rĂ©s.

Il existe un autre script qui randomise toutes les transactions et les encapsule dans un fichier de transactions.

Que faire avec la sortie de ce générateur


À la fin de la journĂ©e, nous avons 4 beaux fichiers .csv avec des nƓuds de graphique et des transactions. Nous pouvons importer ce graphique dans Neo4J ou le servir via l'API REST - fondamentalement, nous pouvons tout faire avec! La taille du graphique peut ĂȘtre aussi grande que vous le souhaitez (nous avons fini par gĂ©nĂ©rer un graphique avec 2 milliards de clients et cela a pris environ 8 heures sur mon MacBook 2014).

Nous avons beaucoup de retours positifs de la part des participants au hackaton ainsi que quelques trÚs bonnes solutions de problÚme de détection de modÚle dans les grands graphiques.

Merci pour votre temps, et voici le lien vers le générateur: https://github.com/MGrin/transactions-graph-generator

Source: https://habr.com/ru/post/fr447798/


All Articles