¿Cómo generar una gran gráfica financiera con patrones de lavado de dinero?

imagen

Hace un par de años, mi equipo (cumplimiento en uno de los bancos suizos) y yo teníamos una tarea interesante que implementar: tuvimos que generar un gran gráfico aleatorio de transacciones financieras entre clientes, empresas y cajeros automáticos. Además, queríamos que este gráfico contuviera algunos patrones de lavado de dinero y otros patrones de delitos financieros junto con la descripción de nodos, como nombres, direcciones, monedas, etc. Obviamente, todos los datos deben generarse aleatoriamente desde cero siempre que no podamos utilizar ningún dato real por razones obvias.

Como solución, escribimos un generador que me encantaría compartir con ustedes. Este artículo explica por qué lo necesitábamos y cómo funciona este generador, pero si no quieres leerlo y probarlo por tu cuenta, aquí está el código: https://github.com/MGrin/transactions-graph- generador Espero que nuestra experiencia sea útil para cualquiera de ustedes.

¿Por qué estábamos interesados ​​en tal generador?


Nuestro equipo decidió patrocinar el hackaton LauzHack. Una de las condiciones para los patrocinadores era proporcionar una tarea comercial real para los participantes, y por casualidad, al mismo tiempo, tuvimos un proyecto interesante relacionado con el descubrimiento del lavado de dinero entre el gráfico de la transacción. Por supuesto, decidimos dar la misma tarea a los participantes de hackaton.

Como dije antes, no podíamos usar datos reales, por lo que necesitábamos crearlos. Para hacer la tarea lo más cercana posible al mundo real, tenemos algunas estadísticas de nuestros datos y tratamos de hacer que los datos generados sigan distribuciones similares. Además, no queríamos tener un gráfico pequeño: diariamente trabajamos con miles de millones de transacciones entre millones de nodos, y queríamos dar a los participantes la posibilidad de probar sus ideas en la misma escala.

¿Qué obtuvimos como resultado?


¡Podríamos construir un generador de gráficos bastante rápido, interesante y configurable! Veamos más en detalle:

Tipos de nodos


Participantes de nuestro sistema financiero generado:

  • Cliente: una cuenta de un cliente bancario abstracto. Contiene campos como nombre, correo electrónico, edad, profesión, educación, nacionalidad y dirección.
  • Empresa: una entidad comercial en nuestro sistema financiero. Contiene campos como tipo, nombre y país.
  • ATM: un punto de salida para el dinero de nuestro gráfico financiero hacia el exterior donde ya no se puede rastrear. Contiene coordenadas GPS.
  • Transacción: registro de transferencia de dinero entre 2 nodos gráficos. Contiene punteros a los nodos de origen y destino, cantidad, moneda y fecha y hora de ejecución.

Para generar estos datos utilizamos Mimesis , una gran biblioteca para la generación de datos falsos.

Generación de grafos: entidades básicas


El generador comienza con la creación de entidades básicas: clientes, empresas y cajeros automáticos. La secuencia de comandos toma un número deseado de clientes como entrada y, en base a este número, calcula el número de empresas y cajeros automáticos a generar. Inferimos que el número de compañías es igual al 2.5% del número total de clientes, y el número de cajeros automáticos es igual al 0.05%. Estos parámetros son bastante promediados y están codificados dentro del propio generador.

Toda la información generada se guarda en archivos .csv. La escritura en estos archivos se realiza por lotes de k filas, siendo k un parámetro configurable. Además, cada tipo de nodo se genera en paralelo para acelerar todo el proceso.

Generación de gráficos: aristas entre entidades


Después de la creación de entidades básicas, comenzamos a conectarlas entre sí. En esta etapa todavía no estamos generando transacciones, sino solo el hecho de que dos nodos están conectados. Lo hicimos de esta manera para acelerar el proceso y funciona de la siguiente manera: si hay una ventaja entre dos nodos, habrá un cierto número de transacciones separadas en el tiempo. Sin ventaja: no hay transacciones en absoluto.

La probabilidad if y edge entre dos nodos y posibles tipos de edge son:

  • Cliente -> Cliente, p = 0.4%
  • Cliente -> Empresa, p = 1%
  • Cliente -> ATM, p = 3%
  • Empresa -> Cliente, p = 0.5%

Estas probabilidades se pueden configurar utilizando parámetros del generador.

Al igual que los nodos, todos los tipos de borde se generan en paralelo y se escriben en archivos en lotes.

Generación de gráficos: transacciones


Al tener nodos y aristas con una distribución deseada, podemos comenzar la generación de transacciones. El proceso es sencillo de implementar, pero es bastante difícil ponerlo en paralelo. Debido a esto, en esta etapa solo funcionan dos subprocesos, uno para la generación de transacciones de abastecimiento de clientes, otro para la generación de transacciones de abastecimiento de la compañía. El número de transacciones para un borde es aleatorio y se separa aleatoriamente en el tiempo.

Como todo lo anterior, las transacciones generadas se escriben en archivos .csv en lotes.

Generación de gráficos: patrones


Aquí es donde las cosas se ponen interesantes. Definimos tres patrones que queríamos tener en nuestro gráfico:

  • Flujo: se envía una gran cantidad de dinero desde el nodo fuente a N nodos, y cualquiera de estos N nodos envía dinero a otros K nodos, etc. hasta que la última capa de esta red envíe todo el dinero recibido a un nodo objetivo.
  • Circular: una gran cantidad de dinero pasa por diferentes nodos y regresa al nodo de origen.
  • Tiempo: cierta cantidad se transfiere del nodo A al nodo B varias veces, separadas por tiempo pseudoaleatorio.

Descubramos estos patrones uno por uno.

Flujo


Comenzamos seleccionando una serie de capas de la red. En nuestra realización, es un número aleatorio entre 2 y 6, y estos valores no son configurables. Luego elegimos al azar 2 nodos: fuente y destino. Además, la cantidad que emitirá un nodo fuente se genera aleatoriamente como 50000 * random () + 50000 * random ().

Cada participante de esta red está tomando un pago por su servicio. En nuestra realización, el pago total por el uso de toda la red no excederá el 10% del monto de origen.

Todas las transacciones generadas se retrasan en el tiempo de una capa a otra. Los retrasos son aleatorios y no exceden los 5 días.

Circular


Es similar al patrón de flujo, excepto que los nodos de origen y destino son los mismos, y solo hay un nodo por capa intermedia.

Tiempo


El patrón más fácil. Se envía una cantidad aleatoria desde el nodo A al nodo B varias veces (número aleatorio entre 5 y 50, no configurable) con retrasos pseudoaleatorios entre transacciones.

Aleatorización de transacciones finales


En esta etapa tenemos una serie de archivos .csv:

  • 3 archivos con información de nodos (clientes, empresas, cajeros automáticos)
  • 4 archivos con transacciones: uno para transacciones habituales y 3 para transacciones de patrones generados.

Hay otro script que aleatoriza todas las transacciones y las concatena en un archivo de transacciones.

¿Qué hacer con la salida de este generador?


Al final del día, tenemos 4 hermosos archivos .csv con nodos gráficos y transacciones. Podemos importar este gráfico en Neo4J o servirlo a través de REST API, ¡básicamente podemos hacer cualquier cosa con él! El tamaño del gráfico puede ser tan grande como desee (terminamos generando un gráfico con 2 mil millones de clientes y me tomó alrededor de 8 horas en mi MacBook 2014).

Recibimos muchos comentarios positivos de los participantes del hackaton, así como un par de soluciones realmente buenas del problema de detección de patrones en grandes gráficos.

Gracias por su tiempo, y aquí está el enlace al generador: https://github.com/MGrin/transactions-graph-generator

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


All Articles