Guten Tag.

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.