Generador de gráficos de transacciones grandes con patrones de actividad criminal.

Buen dia


Red

Hace un par de años, nuestro equipo (cumplimiento en un banco suizo) enfrentó una tarea muy interesante: era necesario generar un gran gráfico de transacciones entre clientes, empresas y cajeros automáticos, agregar patrones similares a los del lavado de dinero y otras actividades delictivas a este gráfico, y también agregar un mínimo información sobre los nodos de este gráfico: nombres, direcciones, hora, etc. Por supuesto, todos los datos tuvieron que ser generados desde cero, sin utilizar los datos existentes del cliente.

Para resolver este problema, se escribió un generador, que me gustaría compartir con ustedes. Debajo del corte, encontrará una historia que explica por qué la necesitábamos, y una descripción del funcionamiento del generador. Para impacientes: aquí está el código . Me alegraría que alguien se beneficie de nuestra experiencia.


¿Por qué estamos haciendo tales tonterías?


Nuestro equipo decidió participar como patrocinadores en el hackathon LauzHack

. Una de las condiciones para participar en el formato de patrocinador fue la provisión de una tarea comercial real para los participantes. Justo en ese momento, teníamos un proyecto muy interesante relacionado con la automatización de la búsqueda de delitos financieros y lavado de dinero entre las transacciones de nuestros clientes, y sin dudarlo, decidimos ofrecer la misma tarea a los participantes del hackathon.

Por razones obvias, no pudimos usar datos reales, por lo que tuvimos que crearlos. Para hacer la tarea lo más cercana posible a la realidad, observamos las estadísticas de los datos reales e intentamos, como pudimos, acercar los datos generados a las distribuciones reales, y tampoco escatimamos en la cantidad y complejidad de los datos; no necesitábamos una solución trabajando en un gráfico de 100 nodos y 200 conexiones, estábamos buscando una solución capaz de procesar gráficos del tamaño de millones de nodos y miles de millones de conexiones, y teniendo en cuenta toda la información disponible sobre nodos y conexiones.


Que conseguimos


¡Y obtuvimos un generador bastante rápido (ajustado por la cantidad de datos), interesante y configurable! Comprendamos en detalle


Tipos de datos


Queremos tener un gráfico de transacciones financieras, respectivamente, los posibles participantes en este gráfico son:


  • Cliente: puede decir una cuenta de un cliente abstracto de un banco. Se describe por nombre, correo electrónico, edad, trabajo, opiniones políticas, nacionalidad, educación y dirección de residencia.
  • Una empresa es una entidad comercial en el sistema financiero. Está determinado por el tipo de empresa, nombre y país.
  • ATM: en términos generales, los puntos de salida de dinero del gráfico controlado por nosotros. Definido por coordenadas geográficas.
  • Transacción: el hecho de transferir dinero de un nodo del gráfico a otro. Definido por el nodo inicial y final, cantidad, moneda y tiempo.

Para crear estos datos, utilizamos Mimesis , una gran biblioteca para crear datos falsos.


Crear un gráfico: entidades básicas


Primero debe crear todas las entidades básicas: clientes, empresas y cajeros automáticos. El script toma la cantidad de clientes que desea crear y, en función de esto, calcula la cantidad de empresas y cajeros automáticos. Según nuestros datos, el número de compañías que tienen una gran cantidad de transacciones con clientes es aproximadamente el 2.5% del número de clientes, y el número de cajeros automáticos es el 0.05% del número de clientes. Estos valores son muy generalizados y no configurables (conectados en el código del generador).


Toda la información se guarda en archivos .csv. La escritura en estos archivos ocurre en lotes, k líneas a la vez. Este valor se configura mediante argumentos de script. Además, se generan tres tipos de nodos en paralelo.


Crear un gráfico: conexiones entre entidades


Después de crear las entidades básicas, comenzamos a conectarlas. En esta etapa, todavía no estamos generando las transacciones, sino simplemente el hecho de que hay una conexión entre los nodos. Esto se hizo para acelerar el proceso de generar el gráfico completo y funciona aproximadamente de la siguiente manera: si dos nodos están conectados, entonces generamos un cierto número de transacciones entre ellos, dispersos en el tiempo. Si no está conectado, pero las transacciones entre estos nodos no existen.


La probabilidad de una conexión entre los dos nodos se configura a través de argumentos, los valores estándar se enumeran a continuación.


Posibles tipos de conexión:


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

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


Creación de gráficos: transacciones


Teniendo los nodos del gráfico y las conexiones entre ellos que caen bajo la distribución deseada, podemos comenzar a generar transacciones. El proceso es bastante simple en sí mismo, pero paralelizarlo es bastante difícil. Por lo tanto, en esta etapa, solo hay dos flujos independientes: transacciones que se originan en el cliente y transacciones que se originan en la empresa.


No sucede nada particularmente interesante en esta etapa: el script se ejecuta a través de la lista de conexiones y genera un número aleatorio de transacciones para cada conexión. Está escrito de la misma manera: en archivos .csv por paquetes.


Contar creaciones: patrones


Y aquí hay puntos interesantes. Los tipos de patrones de comportamiento que queríamos obtener en la columna final:


  • Flujo: una gran cantidad va de un nodo a otro, cada uno de estos m nodos transfiere dinero al siguiente nivel de n nodos, y así sucesivamente, hasta que el último nivel envía todo el dinero a un destinatario.
  • Circular: la cantidad de dinero va en un círculo y vuelve a la fuente.
  • Tiempo: una cierta cantidad de dinero va de un nodo a otro con cierta frecuencia fija.

Veamos cada uno de estos patrones con más detalle:


Flujo


Para empezar, se selecciona el número de niveles a través de los cuales tendrá que ir el dinero. En nuestra implementación, este número aleatorio entre 2 y 6 no es configurable y está conectado en el código. A continuación, se seleccionan dos nodos del gráfico: el remitente y el destinatario. También se selecciona una cantidad aleatoria, que el remitente enviará al destinatario (de acuerdo con la fórmula inteligente 50000 * random() + 50000 * random() ).


Cada miembro de esta red cobra algún tipo de tarifa por sus servicios. En nuestra implementación, el precio máximo por transferir dinero a través de la red será del 10% del monto transferido por el remitente.


Las transacciones generadas tienen un cambio en el tiempo de las transacciones relativas del nivel de red anterior, es decir, el dinero primero llega al nivel n-1, y solo luego pasa al nivel n. Los retrasos se seleccionan al azar dentro de 4-5 días. Además, las transacciones generadas tienen montos seudoaleatorios (limitados por el monto inicial y teniendo en cuenta las tarifas para cada nodo)


Circular


Se genera de acuerdo con un principio similar a Flow, pero en lugar de diferentes emisores y receptores y varios niveles en este patrón, el dinero va en un círculo y regresa al nodo original. Todos los nodos intermedios cobran una tarifa, como es el caso de Flow, y las transacciones también tienen una compensación de tiempo.


Tiempo


El patrón más simple. Se envía una cantidad determinada del remitente al destinatario un número aleatorio de veces (de 5 a 50, no configurable) con cambios de tiempo pseudoaleatorios.


Todas las transacciones nuevas se escriben de la misma manera en archivos .csv en lotes.


Graficar la aleatorización y recopilar todas las transacciones en un archivo


En esta etapa, tenemos varios archivos .csv:


  • 3 archivos con nodos (clientes, empresas y cajeros automáticos)
  • 4 archivos de transacciones: uno para transacciones regulares y 3 que contienen patrones.

Un script adicional mezcla transacciones de patrones junto con transacciones regulares para que no sea posible ver patrones en un gráfico en el orden en que se registran las transacciones en un archivo.


¿Y qué hacer con todo esto?


Al final, tenemos 4 hermosos archivos con nodos gráficos y transacciones entre ellos. Puede importar a Neo4J, puede distribuir a través de REST, pero lo que su corazón desee, puede hacerlo con ellos.


En cuanto a nosotros, recibimos una respuesta muy positiva de los participantes del hackathon y algunas soluciones muy interesantes para encontrar patrones en gráficos masivos.

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


All Articles