Como gerar um enorme gráfico financeiro com padrões de lavagem de dinheiro?

imagem

Há alguns anos, minha equipe (conformidade em um dos bancos suíços) e eu tínhamos uma tarefa interessante a implementar - tivemos que gerar um enorme gráfico aleatório de transações financeiras entre clientes, empresas e caixas eletrônicos. Além disso, queríamos que este gráfico contivesse alguns padrões de lavagem de dinheiro e outros crimes financeiros, juntamente com a descrição dos nós, como nomes, endereços, moedas, etc. Obviamente, todos os dados devem ser gerados aleatoriamente do zero, desde que não possamos usar dados reais por razões óbvias.

Como solução, escrevemos um gerador que eu adoraria compartilhar com você. Este artigo explica por que precisamos dele e como esse gerador está funcionando, mas se você não quiser ler e experimentar por conta própria, aqui está o código: https://github.com/MGrin/transactions-graph- gerador . Espero que nossa experiência seja útil para qualquer um de vocês.

Por que estávamos interessados ​​em tal gerador?


Nossa equipe decidiu patrocinar o hauzaton LauzHack. Uma das condições para os patrocinadores era fornecer uma tarefa de negócios real para os participantes e, por acaso, tivemos um projeto interessante relacionado à descoberta de lavagem de dinheiro entre o gráfico da transação. Obviamente, decidimos dar a mesma tarefa aos participantes do hackaton.

Como eu disse anteriormente, não podíamos usar dados reais, então precisamos criá-los. Para tornar a tarefa o mais próxima possível do mundo real, obtivemos algumas estatísticas de nossos dados e tentamos gerar dados para seguir distribuições semelhantes. Também não queríamos ter um gráfico pequeno - diariamente trabalhamos com bilhões de transações entre milhões de nós, e queríamos dar aos participantes a capacidade de experimentar suas idéias na mesma escala.

O que conseguimos como resultado?


Poderíamos construir um gerador de gráficos bastante rápido, interessante e configurável! Vamos ver mais em detalhes:

Tipos de nós


Participantes do nosso sistema financeiro gerado:

  • Cliente - uma conta de um cliente bancário abstrato. Contém campos como nome, email, idade, profissão, educação, nacionalidade e endereço.
  • Empresa - uma entidade comercial em nosso sistema financeiro. Contém campos como tipo, nome e país.
  • ATM - um ponto de saída do dinheiro do nosso gráfico financeiro para o exterior, onde não pode mais ser rastreado. Contém coordenadas GPS.
  • Transação - registro de transferência de dinheiro entre 2 nós do gráfico. Contém indicadores para nós de origem e destino, quantidade, moeda e data e hora da execução.

Para gerar esses dados, usamos o Mimesis , uma ótima biblioteca para geração de dados falsos.

Geração de gráficos: entidades básicas


O gerador começa com a criação de entidades básicas - clientes, empresas e caixas eletrônicos. O script usa como entrada um número desejado de clientes e, com base nesse número, calcula o número de empresas e caixas eletrônicos a serem gerados. Inferimos que o número de empresas é igual a 2,5% do número total de clientes e o número de caixas eletrônicos é igual a 0,05%. Esses parâmetros são bastante médios e são codificados no interior do próprio gerador.

Todas as informações geradas são salvas em arquivos .csv. A gravação nesses arquivos é feita por lotes de k linhas, sendo um parâmetro configurável. Além disso, todo tipo de nó é gerado em paralelo para acelerar todo o processo.

Geração de gráfico: arestas entre entidades


Após a criação das entidades básicas, começamos a conectá-las entre si. Nesta fase, ainda não estamos gerando transações, mas apenas o fato de dois nós estarem conectados. Fizemos dessa maneira para acelerar o processo e funciona da seguinte maneira: se houver uma borda entre dois nós, haverá um certo número de transações separadas no tempo. Sem margem - sem transações.

A probabilidade se e borda entre dois nós e os possíveis tipos de borda são:

  • Cliente -> Cliente, p = 0,4%
  • Cliente -> Empresa, p = 1%
  • Cliente -> ATM, p = 3%
  • Empresa -> Cliente, p = 0,5%

Essas probabilidades podem ser configuradas usando parâmetros do gerador.

Assim como nós, todos os tipos de arestas são gerados em paralelo e gravados em arquivos em lotes.

Geração de gráfico: transações


Tendo nós e arestas tendo uma distribuição desejada, podemos iniciar a geração de transações. O processo é simples de implementar, mas é bastante difícil de ser paralelizado. Por esse motivo, neste estágio, apenas dois threads estão funcionando - um para geração de transações de sourcing de clientes, outro - para geração de transações de sourcing de empresas. O número de transações para uma borda é aleatório e separado aleatoriamente no tempo.

Como acima, as transações geradas são gravadas em arquivos .csv em lotes.

Geração de gráficos: padrões


É aqui que as coisas estão ficando interessantes. Definimos três padrões que queríamos ter em nosso gráfico:

  • Fluxo - uma grande quantia de dinheiro é enviada do nó de origem para os nós N e qualquer um desses nós envia dinheiro para outros K nós etc. até a última camada desta rede enviar todo o dinheiro recebido para um nó de destino.
  • Circular - uma grande quantidade de dinheiro passa por diferentes nós e volta ao nó de origem.
  • Tempo - alguma quantidade é transferida do nó A para o nó B várias vezes, separadas pelo tempo pseudo-aleatório.

Vamos descobrir esses padrões um por um.

Flow


Começamos selecionando um número de camadas da rede. Em nossa realização, é um número aleatório entre 2 e 6, e esses valores não são configuráveis. Em seguida, escolhemos aleatoriamente 2 nós - origem e destino. Além disso, a quantidade que será emitida por um nó de origem é gerada aleatoriamente como 50000 * random () + 50000 * random ().

Todo participante desta rede está recebendo um pagamento por seu serviço. Em nossa realização, o pagamento total por todo o uso da rede não excederá 10% do valor da fonte.

Todas as transações geradas são atrasadas no tempo de uma camada para outra. Os atrasos são aleatórios e não excedem 5 dias.

Circular


É semelhante ao padrão Fluxo, exceto que os nós de origem e de destino são os mesmos e há apenas um nó por camada intermediária.

Tempo


O padrão mais fácil. Uma quantidade aleatória é enviada do nó A para o nó B várias vezes (número aleatório entre 5 e 50, não configurável) com atrasos pseudo-aleatórios entre transações.

Randomização final de transações


Nesta fase, temos vários arquivos .csv:

  • 3 arquivos com informações de nós (clientes, empresas, caixas eletrônicos)
  • 4 arquivos com transações: um para transações usuais e 3 para transações de padrões gerados.

Há outro script que aleatoriamente todas as transações e as concatena em um arquivo de transações.

O que fazer com a saída deste gerador


No final do dia, temos 4 belos arquivos .csv com nós e transações de gráficos. Podemos importar esse gráfico para o Neo4J ou servi-lo pela API REST - basicamente, podemos fazer qualquer coisa com ele! O tamanho do gráfico pode ser do tamanho que você deseja (acabamos gerando um gráfico com 2 bilhões de clientes e levou cerca de 8 horas no meu MacBook 2014).

Recebemos muitos comentários positivos dos participantes do hackaton, bem como algumas soluções realmente boas para o problema de detecção de padrões em grandes gráficos.

Obrigado pelo seu tempo, e aqui está o link para o gerador: https://github.com/MGrin/transactions-graph-generator

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


All Articles