大家好

几年前,我们的团队(一家瑞士银行的合规部门)面临着一项非常有趣的任务:有必要在客户,公司和ATM机之间生成大型交易图,在该图中添加类似于洗钱和其他犯罪活动的模式,并添加一个最小值有关此图的节点的信息-名称,地址,时间等。 当然,所有数据必须从头开始生成,而不使用现有的客户数据。
为了解决这个问题,我编写了一个生成器,我想与您分享。 在剪辑下,您会找到一个故事,解释了我们为什么需要它,以及对生成器的描述。 对于急躁的人, 这里是代码 。 如果有人将从我们的经验中受益,我将感到非常高兴。
我们为什么要胡说八道?
我们的团队决定以赞助商身份参加LauzHack 黑客马拉松
。 参加赞助者形式的条件之一是为参与者提供实际的业务任务。 就在那时,我们有一个非常有趣的项目,涉及在客户交易之间自动搜索金融犯罪和洗钱活动,我们毫不犹豫地决定为黑客马拉松参加者提供相同的任务。
由于明显的原因,我们无法使用真实数据,因此我们必须创建它们。 为了使任务尽可能接近现实,我们查看了真实数据的统计信息,并尽力使生成的数据更接近真实分布,也没有跳过数据的数量和复杂性-我们不需要在100个节点的图上工作的解决方案和200个连接,我们正在寻找一种解决方案,该解决方案能够处理数百万个节点和数十亿个连接的图形,并考虑到有关节点和连接的所有可用信息。
我们得到了什么
而且我们得到了相当快的(根据数据量进行了调整),有趣且可配置的生成器! 让我们详细了解
资料类型
我们希望分别有一个金融交易图,该图中可能的参与者是:
- 客户-您可以说银行的抽象客户的帐户。 通过姓名,电子邮件,年龄,工作,政治观点,国籍,教育程度和居住地址来描述
- 公司是金融系统中的业务实体。 它由公司类型,名称和国家/地区决定。
- ATM-粗略地说,货币从我们控制的图表中退出的点。 由地理坐标定义。
- 交易-将资金从图表的一个节点转移到另一个节点的事实。 由开始和结束节点,数量,货币和时间定义。
要创建此数据,我们使用Mimesis (一个用于创建假数据的出色库)。
创建图:基本实体
首先,您需要创建所有基本实体-客户,公司和ATM。 该脚本采用您要创建的客户数量,并以此为基础计算公司和ATM的数量。 根据我们的数据,与客户进行任何大量交易的公司数量大约是客户数量的2.5%,而ATM的数量则是客户数量的0.05%。 这些值非常笼统且不可配置(连接在生成器代码中)。
所有信息都保存在.csv文件中。 批量写入这些文件,一次写入k行。 此值由脚本参数配置。 另外,并行生成三种类型的节点。
创建图:实体之间的连接
创建基本实体后,我们开始将它们连接在一起。 在这一阶段,我们尚未生成事务本身,而仅仅是节点之间存在连接这一事实。 这样做是为了加快生成整个图的过程,其工作原理大致如下:如果连接了两个节点,则我们将在它们之间生成一定数量的事务,这些事务会分散在时间上。 如果未连接,则这些节点之间的事务不存在。
通过参数配置两个节点之间连接的可能性,下面列出了标准值。
可能的连接类型:
- 客户->客户(p = 0.4%)
- 客户->公司(p = 1%)
- 客户->自动柜员机(p = 3%)
- 公司->客户(p = 0.5%)
像节点一样,所有类型的连接都是并行生成的,并成批写入其文件中。
图创建:交易
使图的节点及其之间的连接处于所需的分布之下,我们可以开始生成事务。 该过程本身很简单,但是并行化却很困难。 因此,在此阶段,只有两个独立的流程-来自客户的交易和来自公司的交易。
在此阶段,没有什么特别有趣的事情:脚本运行在连接列表中,并为每个连接生成随机数量的事务。 它以相同的方式全部写入-通过包在.csv文件中。
计算创造:模式
这里有一些有趣的观点。 我们希望在最后一栏中获得的行为模式类型:
- 流-大量资金从一个节点流到另一个节点,这m个节点中的每一个都将钱转移到n个节点的下一个级别,依此类推,直到最后一个级别将所有钱都发送给一个接收者。
- 通函-金额成一个圈并返回到来源。
- 时间-一定数量的钱以某个固定的频率从一个节点到另一个节点。
让我们更详细地看一下每种模式:
流向
首先,选择货币必须经过的级别数。 在我们的实现中,此2到6之间的随机数是不可配置的,并且已连接到代码中。 接下来,选择图的两个节点-发送方和接收方。 还选择了一个随机数,发送者将发送给接收者(根据聪明的公式50000 * random() + 50000 * random()
)。
该网络的每个成员都为其服务收取某种费用。 在我们的实施中,通过网络转账的最高价格将是发件人转账金额的10%。
生成的交易具有上一个网络级别的相对交易的时移-也就是说,资金首先到达n-1级别,然后才到达n级别。 延误是在4-5天内随机选择的。 此外,生成的交易具有伪随机金额(受初始金额限制,并考虑了每个节点的费用)
通函
它是按照与Flow类似的原理生成的,但是钱不是绕着不同的发送者和接收者以及这种模式中的几个级别,而是绕了一圈然后返回到原始节点。 与Flow一样,所有中间节点都收费,并且交易也有时间偏移。
时间
最简单的模式。 从发送方向接收方发送一定数量的随机次数(从5到50,不可配置),并具有伪随机时移。
所有新事务都以相同的方式批量写入.csv文件。
图形随机化并在一个文件中收集所有交易
在此阶段,我们有几个.csv文件:
- 3个带有节点的文件(客户端,公司和ATM)
- 4个交易文件:1个用于常规交易,3个包含模式。
另一个脚本将模式事务与常规事务混合在一起,以便无法按照在文件中记录事务的顺序在图形中看到模式。
那怎么办呢?
最后,我们有4个漂亮的文件,其中包含图节点和它们之间的事务。 您可以导入Neo4J,可以通过REST进行分发,但是只要您有心想要,就可以使用它们。
对于我们而言,我们收到了黑客马拉松参与者的非常积极的反馈,以及一些非常有趣的解决方案,可用于在大量图形中查找模式。