如何绘制控股,所有权链和计算CFC份额

在公司律师的法律业务中,相对较新(数年前),有必要根据《美国商法典》起草并提交有关受控外国公司(CFC)的通知。俄罗斯联邦税法第25.13条。这项义务的实质是起草并提交一份文件,该文件将反映该公司从俄罗斯联邦当前的有限责任公司(JSC)到俄罗斯联邦CFC的所有者纳税居民沿链持有的所有联系。简而言之,如果离岸公司是俄罗斯人(俄罗斯联邦的税收居民)所有,而俄罗斯有限责任公司的离岸公司(甚至通过中间有限责任公司的篱笆)超过25%-将会有通知。最重要的一点是,有必要向所有出现这种情况的有限责任公司(JSC)提交信息,并及时提交有关25%以上所有权的信息以及所有权份额随后发生的变化,否则将处以罚款(每家连锁公司100,000卢布-第129.6条)俄罗斯联邦税法)。由于控股(一套法人实体)是生物体,所有权份额的不断变化是不可避免的,因此有必要对所有这些进行监控以免罚款。本文致力于如何简化朝着这个方向的工作,使其自动化。从相关结构(例如社交)的图形表示的角度来看,这篇文章也将很有趣。网络。







在本文中,我们将不讨论提交的有关CFC的通知的法律方面,关于参与CFC的法律方面,我们将考虑该问题的技术方面。



毫无疑问,如果所涉及的控股公司将自己表示为LLC-> KIK-> Russian类型的简单结构,那么在机器的参与下在此处建造一些东西是不切实际的,如果结构分支,翻倍并且没有这些交织的数量,则是另一回事。



让我们看一下几种现有的图形解决方案,它们可以使您的工作变得更轻松。

为了方便可视化,将使用jupyter笔记本和python环境。



Networkx



该解决方案是提出的解决方案中最早的,并且不能吹嘘其交互性。在哈布雷(Habré)上也有关于此包裹的同一篇古代文章



但是,旧的并不意味着不好,并且此选项在绘图和计算方面是最成功的选项之一。



通过jupyter安装和导入模块:



!pip install networkx
import networkx as nx


我们还导入其他添加。可以帮助您绘制形状的模块:



from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams.update({
    'figure.figsize': (7.5, 7.5),
    'axes.spines.right': False,
    'axes.spines.left': False,
    'axes.spines.top': False,
    'axes.spines.bottom': False})


让我们使用networkx构建第一个网络:



from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = nx.read_edgelist('example.edgelist')
# Draw network
#pos = nx.spring_layout(G)
pos = nx.spectral_layout(G)
#pos = nx.planar_layout(G)
nx.draw_networkx(G, pos)
plt.gca().margins(0.15, 0.15)


这是发生的事情:







如您所见,伊万诺夫拥有两个CFC,而这些CFC又拥有俄罗斯法人实体。通过人。



让我们分析上面的代码。



我们导入了模块,并指定了从以下位置读取磁盘上数据的位置:



from pathlib import Path
data_dir = Path('.') / 'data'


当前目录被读取为“ example.edgelist”:



G = nx.read_edgelist('example.edgelist')


* example.edgelist是一个纯文本文件,如下所示:



# source target
 1
 2
1 2
1 _
2 _


这些值是由某人记录的,它们之间有一个空格。



接下来,我们确定了网络的外观:



pos = nx.spectral_layout(G)


如果我们更改为pos = nx.spring_layout(G),则它将采用以下形式:







奇怪的是,这种安排最适合较大的结构。



最后,我们绘制了网,标记了缩进:



nx.draw_networkx(G, pos)
plt.gca().margins(0.15, 0.15)


保存图片很容易:



plt.savefig('plot.png')


如何在Networkx中绘制线段



#
H = G.subgraph(['', '1', '_'])
plt.subplot(212) 
print(":") 
nx.draw_networkx(H)


我们在这里没有







缩进,名称为“ left”:Networkx使用节点和它们之间的链接的概念进行操作。在我们的情况下,节点是Ivanov,KIK1,KIK2,Romashka_OOO,Bucket_AO。链接是example.edgelist文件中的链接。



您只需参考G.nodes和G.edges方法即可看到它们:







networkx中的方向图(有向边列表)



让我们稍微澄清一下构造的网络,添加箭头:



# Read edge list
G = nx.read_edgelist(
    str('example.edgelist'),
    create_using=nx.DiGraph)
pos = nx.spectral_layout(G)
# Draw network
nx.draw_networkx(G, pos, arrowsize=20)
plt.gca().margins(0.15, 0.15)


进行微小的更改就可以更清晰地描绘谁是谁的所有者:



如您所见,在代码中,更改很小。



下一步是构建一个图形,在该图形中所有权包的大小将可见。



为此,您需要熟悉weight(重量)的概念是networkx可以使用的第三个主要参数。要将其包括在工作中,您需要将这些权重添加到文本文件中,例如:



# source target
 1 100
 2 100
1 2 50
1 _ 100
2 _ 100


现在,让我们使用权重重建网络并在图中指定权重:



# Read edge list
G = nx.read_weighted_edgelist(
    str('example2.edgelist'))
# Extract weights
weights = [d['weight'] for s, t, d in G.edges(data=True)]
nx.draw_networkx(G,pos)
labels = nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels)
plt.gca().margins(0.15, 0.15)


* example2.edgelist是上面带有权重生成的文件。



我们得到以下图片:







谁拥有谁以及如何拥有,networkx



现在,作为律师兼程序员,我们需要了解Ivanov拥有的顺序和数量,例如Bucket_AO公司,以及他是否完全拥有它。为了确定分支控股公司和目标LLC(JSC)的所有链中的所有权的事实,这是必需的,以便以后可以在CFC通知中注册这些链。



使用networkx,您可以按照以下步骤进行操作:



list(nx.all_simple_paths(G,'', '_'))


第一个参数是所有者节点,第二个参数是我们要构建路径的节点。



使用此方法,您可以看到Ivanov的Bucket_AO属于以下链:



[['', '1', '2', '_'], ['', '2', '_']]


通过图形确认。



您可以通过乘以相应节点之间的权重来找到所有权份额:1 * 0.5 * 1 = 0.5,1 * 1 = 1。份额超过25%,必须提交通知。



在代码中,乘法是通过以下拐杖完成的(尚未找到更优雅的方法):



x=0
b=0
c=[]
for i in list(nx.all_simple_paths(G,'', '_')):    
    for a in i:        
        if x>len(i)-2:
            pass                        
        else:            
            b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#                        
            x+=1
            c.append(b/100)              
print(c)
import numpy as np
print(np.prod(c))


x=0
b=0
c=[]
for i in list(nx.all_shortest_paths(G,'', '_')):
    for a in i:        
        if x>len(i)-2:
            pass                      
        else:            
            b=int(nx.bidirectional_dijkstra(G, i[x],i[x+1])[0])#                        
            x+=1
            c.append(b/100)              
print(c)
import numpy as np
print(np.prod(c))


在第一种情况下,它将显示0.5的分数,在第二种情况下,它将显示0.5的分数



例如,Netwulf。



净水



文档在这里



网络本身是交互式的,这是其主要优势。安装python软件包后,让我们构建网络:



import netwulf as nw
plt.figure(figsize=(200,200))
G = nx.read_weighted_edgelist(str('example2.edgelist'),create_using=nx.DiGraph)
pos = nx.spring_layout(G)
nw.visualize(G)


运行代码后,jupyter冻结,并且在打开的其他浏览器窗口中,您可以看到结果:







在面板的右侧,您可以看到选项,这些选项的更改会影响在线构建的网络。



该软件包的缺点是尚无法显示节点之间的权重和箭头,但作者承诺对其进行改进。



*要返回jupyter,您需要单击“发布到python”选项:







此类python可视化的另一个不错的选择是年轻的webweb项目。



网路



文档在这里



该网络以类似的方式构建:



from webweb import Web
web = Web(title='kitchen_sink')

web.display.networkName = 'tree'
web.display.networkLayer = 2
web.display.colorBy = 'ring'
web.display.sizeBy = 'degree'
web.display.gravity = .3
web.display.charge = 30
web.display.linkLength = 15
web.display.colorPalette = 'Greens'
web.display.scaleLinkOpacity = False
web.display.scaleLinkWidth = True

from pathlib import Path
data_dir = Path('.') / 'data'
# Read edge list
G = nx.read_edgelist('example.edgelist',create_using=nx.DiGraph)
plt.figure(figsize=(200,200))
# Draw network
pos = nx.spring_layout(G)
Web(list(G.edges)).show()






与netwulf相比的明显优势是:能够用颜色突出显示关键节点,可以在网络上用文本搜索具有突出显示的节点:







总而言之,我们可以说networkx的发展后代-netwulf和webweb有助于快速了解小型公司的结构。这两个模块都有冻结模式,可冻结由于图的交互性而将一堆粘在一起的节点冻结。但是,即使使用它们,使用大型结构(节点数量超过200个)也不容易。



财政部的“基座”,交叉和环所有权



构造这样的结构时,如果不是因为一件事破坏了整个画面,那么一切都会很好。但是,这是因为公司的控股权是通过其他法人实体拥有的。脸,这称为交叉所有权或戒指所有权。



财政部来信中的图片(例如,自02.07.2013-4-13/ 11912起)看起来像这样。



交叉所有权: 环形















让我们看看networkx如何为D参与B的交叉所有权计划定义链接。



让我们创建一个具有链接的边列表:



# source target
D B 45
B A 40
A B 55
E A 60


建立具有权重的网络后,您可以看到A和B之间的反馈未得到反映:







如果您构建的没有权重的网络(带有箭头)可以看出:







计算结果如何? D在B中的累积份额是多少?



这里的一切似乎都是透明的,有45%



,networkx给出了命令列表(nx.all_simple_paths(G,'D','B')):

[['D','B']]

但是并不是所有的事情都那么简单。



财政部表示,D在B中的总份额由以下公式确定:







并且将为57.69%。



该怎么办? networkx是无能为力的吗?



完全没有,networkx会揭示这种情况,但是根据“法律信”,计算公式将有所不同。



通过将

AA

BB条目添加到边缘列表,可以部分解决此问题

此外,使用命令列表(nx.nodes_with_selfloops(G)),您可以查看自身参与的节点,但是在确定从D到B的路径时仍未考虑到这一点。



jupyter笔记本下载-此处



All Articles