
几年前,我的团队(一家瑞士银行的合规组织)要执行一项有趣的任务-我们必须生成客户,公司和ATM之间的金融交易的随机图。 此外,我们希望该图包含一些洗钱和其他金融犯罪模式以及节点描述,例如名称,地址,货币等。 显然,只要我们出于明显原因不能使用任何真实数据,就应该从头开始随机生成所有数据。
作为解决方案,我们编写了一个发电机,希望与您分享。 本文介绍了我们为什么需要它以及该生成器如何工作,但是如果您不想阅读并想自己尝试,则这里的代码是:
https :
//github.com/MGrin/transactions-graph-发电机 。 希望我们的经验对您有帮助。
我们为什么对这种发电机感兴趣?
我们的团队决定赞助
LauzHack hackaton。 发起人的条件之一是为参与者提供实际的业务任务,与此同时,我们偶然地有一个有趣的项目,涉及交易图表中的洗钱发现。 当然,我们决定将相同的任务交给hackaton参与者。
如前所述,我们无法使用真实数据,因此我们需要创建它。 为了使任务尽可能接近真实世界,我们从数据中获取了一些统计数据,并尝试使生成的数据遵循相似的分布。 此外,我们也不想有一个小图表-每天我们都在处理数百万个节点之间的数十亿笔交易,我们希望赋予参与者以相同规模尝试其想法的能力。
结果我们得到了什么?
我们可以构建一个非常快速,有趣且可配置的图形生成器! 让我们更详细地了解它:
节点类型
我们生成的财务系统的参与者:
- 客户-抽象银行客户的帐户。 包含姓名,电子邮件,年龄,专业,教育程度,国籍和地址等字段。
- 公司-我们财务系统中的业务实体。 包含字段,如类型,名称和国家。
- 自动柜员机-货币从我们的财务图表到无法再跟踪的外部的出口点。 包含GPS坐标。
- 交易-2个图形节点之间的转账记录。 包含指向源和目标节点,数量,货币以及执行日期和时间的指针。
为了生成这些数据,我们使用了
Mimesis (一个用于伪造数据的强大库)。
图生成:基本实体
生成器首先创建基本实体-客户,公司和ATM。 该脚本将所需的客户数量作为输入,并根据该数量计算要生成的公司和ATM的数量。 我们推断,公司数量等于客户总数的2.5%,而自动柜员机数量等于0.05%。 这些参数相当平均,并在生成器内部进行了硬编码。
所有生成的信息都保存到.csv文件中。 写入这些文件是通过分批处理k行来完成的,k是可配置的参数。 而且,每种类型的节点都是并行生成的,以加快整个过程。
图形生成:实体之间的边
创建基本实体后,我们开始将它们彼此连接。 在这一阶段,我们还没有生成事务,而只是生成两个节点已连接的事实。 我们这样做是为了加快过程,它的工作原理如下:如果两个节点之间存在一条边,那么一定数量的事务会在时间上分开。 没有优势-根本没有交易。
两个节点之间的if和edge以及可能的边缘类型的概率为:
- 客户->客户,p = 0.4%
- 客户->公司,p = 1%
- 客户-> ATM,p = 3%
- 公司->客户,p = 0.5%
可以使用生成器参数配置这些概率。
就像节点一样,所有边缘类型都是并行生成的,并成批写入文件中。
图生成:交易
通过具有所需分布的节点和边缘,我们可以开始生成事务。 该过程很容易实现,但是很难并行化。 因此,在此阶段,只有两个线程在工作-一个用于客户端采购交易生成,另一个用于公司采购交易生成。 边缘的事务处理数量是随机的,并且在时间上随机分开。
如上所述,生成的事务将成批写入.csv文件中。
图形生成:模式
这就是事情变得有趣的地方。 我们定义了我们希望在图形中具有的三种模式:
- 流-从源节点向N个节点发送大量资金,并且这N个节点中的任何一个都将资金发送给另一个K个节点,依此类推。 直到该网络的最后一层将所有收到的钱都发送到目标节点。
- 循环-大量资金流经不同的节点,然后又回到源节点。
- 时间-将一定数量的时间多次从节点A转移到节点B,并以伪随机时间分隔。
让我们一一发现这些模式。
流向
我们首先选择网络的多个层。 在我们的实现中,它是2到6之间的一个随机数,并且这些值是不可配置的。 然后,我们随机选择2个节点-源节点和目标节点。 同样,由源节点发出的数量将随机生成为50000 * random()+ 50000 * random()。
该网络的每个参与者都在为其服务付费。 在我们的实现中,整个网络使用的总付款将不超过来源金额的10%。
所有生成的事务在时间上都从一层延迟到另一层。 延迟是随机的,不超过5天。
通函
与流模式相似,除了源节点和目标节点相同,并且每个中间层只有一个节点。
时间
最简单的模式。 多次从节点A向节点B发送随机量(5到50之间的随机数,不可配置),并且在事务之间具有伪随机延迟。
最终交易随机化
在此阶段,我们有许多.csv文件:
- 3个包含节点信息的文件(客户,公司,ATM)
- 4个包含事务的文件:1个用于常规事务,3个用于生成模式的事务。
还有另一个脚本将所有交易随机化,并将它们合并在一个交易文件中。
该发生器的输出如何处理
最终,我们有4个漂亮的.csv文件,它们带有图形节点和事务。 我们可以将此图导入Neo4J或通过REST API提供服务-基本上,我们可以使用它做任何事! 图的大小可以随您想要的大小而定(我们最终生成了一个拥有20亿客户的图,而在我的MacBook 2014上花费了大约8个小时)。
我们得到了hackaton参与者的很多积极反馈,以及一些非常好的大型图形模式检测问题解决方案。
谢谢您的时间,这是生成器的链接:
https :
//github.com/MGrin/transactions-graph-generator