持ち株会社、所有権チェーンを描き、CFCシェアを計算する方法

企業弁護士の法務では、比較的最近(数年前)、Artの下で管理された外国企業(CFC)に関する通知を作成して提出する必要がありました。ロシア連邦の税法の25.13。この義務の本質は、ロシア連邦の現在のLLC(JSC)からロシア連邦CFCの所有者税居住者までのチェーンに沿った保有における会社のすべてのつながりを反映する文書を作成し、提出することです。簡単に言えば、オフショアがロシア人(ロシア連邦の税務上の居住者)によって所有されており、ロシアのLLCのオフショア(中間LLCのフェンスを介しても)が25%を超える場合、通知があります。ハイライトは、この状況が観察されたすべてのLLC(JSC)に提出する必要があり、25%を超える所有権とその後の所有権のシェアの変更に関する情報を適時に提出する必要があることです。それ以外の場合は、罰金(チェーン内の各企業に対して100,000ルーブル-Art。129.6ロシア連邦の税法)。保有(法的実体の集合)は生物であり、所有権のシェアの絶え間ない変化は避けられないため、罰金を徴収しないように、これらすべてを何らかの方法で監視する必要があります。この方向での作業を簡素化し、自動化する方法、この記事は専念しています。この記事は、ソーシャルなどの関連する構造のグラフィック表示の観点からも興味深いものになります。ネットワーク。







この記事では、CFCについて、CFCへの参加について、提出された通知の法的側面については詳しく説明しません。問題の技術的な側面について検討します。



間違いなく、問題の持ち株会社がタイプLLC-> KIK->ロシア語の単純な構造としてそれ自体を提示する場合、機械を使用してここに何かを構築することは非現実的です。構造が分岐し、二重になり、これらの織り交ぜの数がないかどうかは別の問題です。



作業を簡素化するいくつかの既存のグラフィックソリューションを見てみましょう。

視覚化を容易にするために、jupyterノートブックとpython環境が使用されます。



Networkx



このソリューションは、提示されたものの中で最も古いものであり、その相互作用を誇ることはできません。Habréにはこのパッケージに関する同じ古代の記事があります



ただし、古いものは悪いことを意味するものではなく、このオプションは描画とコンピューティングの両方の点で最も成功したものの1つです。



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)


起こったことは次の







とおりです。ご覧のとおり、Ivanovは2つの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)


ここでは







インデントせず、名前は「左」です。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)


小さな変更により、誰が誰を所有しているかをより明確に描くことができまし



た。コードでは、ご覧のとおり、変更は最小限です。



次のステップは、所有権パッケージのサイズが表示されるグラフを作成することです。



これを行うには、重量(重量)の概念を理解する必要があります。これは、networkxが使用できる3番目の主要なパラメーターです。これを作業に含めるには、次のように、これらの同じ重みをテキストファイルに追加する必要があります。



# 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



さて、弁護士-プログラマーとして、私たちはイワノフがどのような順序でどのくらいの量を所有しているか、たとえばBucket_AOを、そして彼がそれを所有しているかどうかを理解する必要があります。これは、分岐ホールディングとターゲットLLC(JSC)へのすべてのチェーンの所有権の事実を判断するために必要です。これにより、後でこれらのチェーンをCFC通知に登録できます。



networkxを使用すると、次のようにこれを行うことができます。



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


最初の引数は所有者ノードであり、2番目の引数はパスを構築するノードです。



このメソッドを使用すると、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の割合が表示され、2番目のケースでは1になります。



他にどのような視覚化オプションが利用できますか?たとえば、Netwulf。



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に戻るには、「posttopython」オプションをクリックする必要があります。







このようなpythonの視覚化に適したもう1つのオプションは、若いwebwebプロジェクトです。



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を超える大規模な構造での作業は容易ではありません。



財務省の「ペデスタル」、クロスアンドリングオーナーシップ



そのような構造を構築するとき、全体像を台無しにする1つのことではないにしても、すべてが非常に良いでしょう。ただし、これは、会社の所有物が他の法的エンティティを通じて所有しているという事実にあります。これは、クロス所有権またはリング所有権と呼ばれます。



財務省からの手紙の写真(たとえば、2013年7月2日-4-13/ 11912)では、次のようになっています。



クロスオーナーシップ: リング型















networkxがDのBへの参加のクロスオーナーシップスキームのリンクをどのように定義するかを見て



みましょうリンクを使用してエッジリストを作成しましょう。



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


重みのあるネットワークを構築すると、AとBの間のフィードバックが反映されていないことがわかります。重みのない







ネットワークを矢印で構築した場合にわかり







ます。計算についてはどうでしょうか。 BにおけるDの累積シェアはどれくらいですか?



ここではすべてが透過的であるように見えます。45%



そしてnetworkxはコマンドリスト(nx.all_simple_paths(G、 'D'、 'B')):

[['D'、 'B']]を提供し

ますが、すべてがそれほど単純なわけではありません。



財務省によると、BにおけるDの合計シェアは次の式で決定され







ます。そして57.69%になります。



何をすべきか? networkxは無力ですか?



networkxはそのような状況を明らかにするわけではありませんが、「法の手紙」によると、計算式は異なります。



問題は、部分的に追加することで解決することができ

AA

BBのedgelistにエントリを

さらに、コマンドリスト(nx.nodes_with_selfloops(G))を使用すると、ノード自体に参加しているノードを表示できますが、DからBへのパスを決定するときにこれは考慮されません。



jupyterノートブックのダウンロード-ここ



All Articles