Großer Transaktionsgraphgenerator mit Mustern krimineller AktivitĂ€ten

Guten Tag.


Netzwerk

Vor einigen Jahren stand unser Team (Compliance bei einer Schweizer Bank) vor einer sehr interessanten Aufgabe: Es war notwendig, ein umfangreiches Diagramm der Transaktionen zwischen Kunden, Unternehmen und Geldautomaten zu erstellen, Muster Ă€hnlich denen der GeldwĂ€sche und anderer krimineller AktivitĂ€ten zu diesem Diagramm hinzuzufĂŒgen und auch ein Minimum hinzuzufĂŒgen Informationen zu den Knoten dieses Diagramms - Namen, Adressen, Zeit usw. NatĂŒrlich mussten alle Daten von Grund auf neu generiert werden, ohne vorhandene Kundendaten zu verwenden.

Um dieses Problem zu lösen, wurde ein Generator geschrieben, den ich mit Ihnen teilen möchte. Unter dem Schnitt finden Sie eine Geschichte, die erklĂ€rt, warum wir sie brauchten, und eine Beschreibung des Betriebs des Generators. FĂŒr ungeduldig - hier liegt der Code . Ich wĂŒrde mich freuen, wenn jemand von unserer Erfahrung profitieren wĂŒrde.


Warum machen wir so einen Unsinn?


Unser Team hat beschlossen, als Sponsor am LauzHack- Hackathon teilzunehmen

. Eine der Voraussetzungen fĂŒr die Teilnahme am Sponsorenformat war die Bereitstellung einer echten GeschĂ€ftsaufgabe fĂŒr die Teilnehmer. Zu diesem Zeitpunkt hatten wir ein sehr interessantes Projekt im Zusammenhang mit der Automatisierung der Suche nach Finanzverbrechen und GeldwĂ€sche bei den Transaktionen unserer Kunden, und ohne zu zögern beschlossen wir, den Hackathon-Teilnehmern dieselbe Aufgabe anzubieten.

Aus offensichtlichen GrĂŒnden konnten wir keine realen Daten verwenden, daher mussten wir sie erstellen. Um die Aufgabe so realitĂ€tsnah wie möglich zu gestalten, haben wir uns die Statistiken der realen Daten angesehen und versucht, die generierten Daten so nah wie möglich an die realen Verteilungen heranzufĂŒhren. Außerdem haben wir nicht an Menge und KomplexitĂ€t der Daten gespart - wir brauchten keine Lösung, die an einem Diagramm mit 100 Knoten arbeitet Bei 200 Verbindungen suchten wir nach einer Lösung, mit der Diagramme in der GrĂ¶ĂŸe von Millionen von Knoten und Milliarden von Verbindungen verarbeitet und alle verfĂŒgbaren Informationen zu Knoten und Verbindungen berĂŒcksichtigt werden können.


Was haben wir bekommen?


Und wir haben einen ziemlich schnellen (an die Datenmenge angepasst), interessanten und konfigurierbaren Generator! Lassen Sie uns im Detail verstehen


Datentypen


Wir möchten ein Diagramm der Finanztransaktionen haben. Mögliche Teilnehmer an diesem Diagramm sind:


  • Kunde - Sie können ein Konto eines abstrakten Kunden einer Bank sagen. Es wird nach Name, E-Mail-Adresse, Alter, Arbeit, politischen Ansichten, NationalitĂ€t, Bildung und Wohnadresse beschrieben
  • Ein Unternehmen ist eine GeschĂ€ftseinheit im Finanzsystem. Es wird durch die Art des Unternehmens, den Namen und das Land bestimmt.
  • Geldautomat - grob gesagt, die Ausstiegspunkte des Geldes aus der von uns kontrollierten Grafik. Durch geografische Koordinaten definiert.
  • Transaktion - Die Tatsache, dass Geld von einem Knoten des Diagramms zu einem anderen ĂŒbertragen wird. Definiert durch Start- und Endknoten, Betrag, WĂ€hrung und Zeit.

Um diese Daten zu erstellen, verwenden wir Mimesis , eine großartige Bibliothek zum Erstellen gefĂ€lschter Daten.


Erstellen eines Diagramms: grundlegende EntitÀten


Zuerst mĂŒssen Sie alle grundlegenden EntitĂ€ten erstellen - Kunden, Unternehmen und Geldautomaten. Das Skript verwendet die Anzahl der Kunden, die Sie erstellen möchten, und berechnet auf dieser Grundlage die Anzahl der Unternehmen und Geldautomaten. Nach unseren Daten betrĂ€gt die Anzahl der Unternehmen mit einer großen Anzahl von Transaktionen mit Kunden ungefĂ€hr 2,5% der Anzahl der Kunden, und die Anzahl der Geldautomaten betrĂ€gt 0,05% der Anzahl der Kunden. Diese Werte sind sehr verallgemeinert und nicht konfigurierbar (im Generatorcode verkabelt).


Alle Informationen werden in CSV-Dateien gespeichert. Das Schreiben in diese Dateien erfolgt in Stapeln, jeweils k Zeilen. Dieser Wert wird durch Skriptargumente konfiguriert. Außerdem werden drei Knotentypen parallel generiert.


Erstellen eines Diagramms: Verbindungen zwischen EntitÀten


Nachdem wir die grundlegenden EntitĂ€ten erstellt haben, beginnen wir, sie miteinander zu verbinden. Zu diesem Zeitpunkt generieren wir die Transaktionen noch nicht selbst, sondern lediglich die Tatsache, dass eine Verbindung zwischen den Knoten besteht. Dies wurde durchgefĂŒhrt, um den Prozess des Generierens des gesamten Diagramms zu beschleunigen, und funktioniert ungefĂ€hr wie folgt: Wenn zwei Knoten verbunden sind, generieren wir eine bestimmte Anzahl von Transaktionen zwischen ihnen, die zeitlich verstreut sind. Wenn keine Verbindung besteht, existieren jedoch keine Transaktionen zwischen diesen Knoten.


Die Wahrscheinlichkeit einer Verbindung zwischen den beiden Knoten wird durch Argumente konfiguriert. Die Standardwerte sind unten aufgefĂŒhrt.


Mögliche Verbindungstypen:


  • Kunde -> Kunde (p = 0,4%)
  • Kunde -> Unternehmen (p = 1%)
  • Kunde -> Geldautomat (p = 3%)
  • Firma -> Kunde (p = 0,5%)

Wie bei Knoten werden alle Arten von Verbindungen parallel generiert und stapelweise in ihre Dateien geschrieben.


Diagrammerstellung: Transaktionen


Wenn die Knoten des Diagramms und die Verbindungen zwischen ihnen unter die gewĂŒnschte Verteilung fallen, können wir mit der Generierung von Transaktionen beginnen. Der Prozess ist an sich recht einfach, aber eine Parallelisierung ist ziemlich schwierig. Daher gibt es zu diesem Zeitpunkt nur zwei unabhĂ€ngige AblĂ€ufe - Transaktionen, die vom Kunden stammen, und Transaktionen, die vom Unternehmen stammen.


In dieser Phase passiert nichts besonders Interessantes: Das Skript durchlĂ€uft die Liste der Verbindungen und generiert eine zufĂ€llige Anzahl von Transaktionen fĂŒr jede Verbindung. Es wird alles auf die gleiche Weise geschrieben - in CSV-Dateien von Paketen.


Anzahl Kreationen: Muster


Und hier gibt es interessante Punkte. Die Arten von Verhaltensmustern, die wir in der letzten Spalte erhalten wollten:


  • Fluss - Ein großer Betrag fließt von einem Knoten zu m zum anderen. Jeder dieser m Knoten ĂŒbertrĂ€gt Geld auf die nĂ€chste Ebene von n Knoten usw., bis die letzte Ebene das gesamte Geld an einen EmpfĂ€nger sendet.
  • Rundschreiben - Der Geldbetrag bewegt sich im Kreis und kehrt zur Quelle zurĂŒck.
  • Zeit - Ein bestimmter Geldbetrag fließt mit einer festgelegten HĂ€ufigkeit von einem Knoten zum anderen.

Schauen wir uns jedes dieser Muster genauer an:


Flow


ZunĂ€chst wird die Anzahl der Ebenen ausgewĂ€hlt, durch die Geld gehen muss. In unserer Implementierung ist diese Zufallszahl zwischen 2 und 6 nicht konfigurierbar und im Code verdrahtet. Als nĂ€chstes werden zwei Knoten des Diagramms ausgewĂ€hlt - der Absender und der EmpfĂ€nger. Es wird auch ein zufĂ€lliger Betrag ausgewĂ€hlt, den der Absender an den EmpfĂ€nger sendet (gemĂ€ĂŸ der cleveren Formel 50000 * random() + 50000 * random() ).


Jedes Mitglied dieses Netzwerks erhebt eine GebĂŒhr fĂŒr seine Dienste. In unserer Implementierung betrĂ€gt der Höchstpreis fĂŒr die Weiterleitung von Geld ĂŒber das Netzwerk 10% des vom Absender ĂŒberwiesenen Betrags.


Generierte Transaktionen haben eine zeitliche Verschiebung der relativen Transaktionen der vorherigen Netzwerkebene - das heißt, Geld kommt zuerst auf Ebene n-1 und erst dann auf Ebene n. Verzögerungen werden innerhalb von 4-5 Tagen zufĂ€llig ausgewĂ€hlt. Außerdem haben generierte Transaktionen pseudozufĂ€llige BetrĂ€ge (begrenzt durch den ursprĂŒnglichen Betrag und unter BerĂŒcksichtigung der GebĂŒhren fĂŒr jeden Knoten).


Rundschreiben


Es wird nach einem Ă€hnlichen Prinzip wie Flow generiert, nur dass anstelle eines unterschiedlichen Senders und EmpfĂ€ngers und mehrerer Ebenen in diesem Muster das Geld in einem Kreis verlĂ€uft und zum ursprĂŒnglichen Knoten zurĂŒckkehrt. Alle Zwischenknoten erheben eine GebĂŒhr, wie dies bei Flow der Fall ist, und Transaktionen haben auch einen Zeitversatz.


Zeit


Das einfachste Muster. Ein bestimmter Betrag wird vom Absender zufÀllig an den EmpfÀnger gesendet (von 5 bis 50, nicht konfigurierbar), wobei pseudozufÀllige Zeitverschiebungen auftreten.


Alle neuen Transaktionen werden auf die gleiche Weise stapelweise in CSV-Dateien geschrieben.


Stellen Sie die Randomisierung grafisch dar und sammeln Sie alle Transaktionen in einer Datei


Zu diesem Zeitpunkt haben wir mehrere CSV-Dateien:


  • 3 Dateien mit Knoten (Kunden, Unternehmen und Geldautomaten)
  • 4 Transaktionsdateien: eine fĂŒr regulĂ€re Transaktionen und 3 mit Mustern.

Ein zusÀtzliches Skript mischt Mustertransaktionen mit regulÀren Transaktionen, sodass Muster in einem Diagramm nicht in der Reihenfolge angezeigt werden können, in der Transaktionen in einer Datei aufgezeichnet werden.


Und was tun mit all dem?


Am Ende haben wir 4 schöne Dateien mit Grafikknoten und Transaktionen zwischen ihnen. Sie können in Neo4J importieren, Sie können ĂŒber REST verteilen, aber was auch immer Ihr Herz begehrt, Sie können damit tun.


Wir erhielten ein sehr positives Feedback von den Hackathon-Teilnehmern und einige sehr interessante Lösungen, um Muster in massiven Grafiken zu finden.

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


All Articles