在处理公司控制人及实际控制人的过程中,耗费了我大量的精力,需求的改动,业务的不熟悉,算法的调整等等,每一种改动的实现都伴随着一定的复杂度,欣慰的是:结果是好的。
如今实际控制人和控制人的数据已对外提供服务,一些小瑕疵也在不断打磨过程中,争取我们公司做出的产品能够得到业界的认可。
本文是站在技术的角度上写的,可能会存在诸多问题,如有发现,万望指摘,不胜感激。
1.背景
丰富公司的产品线等等。。。
2.什么是控制人
3.什么是实际控制人
4.控制人和实际控制人的区别
5.有限合伙及其管理人和股东
6.控股股东和实际控制人的区别
7.抽屉协议
8.控制权如何计算
9.法定代表逻辑如何使用
10.国资委、国务院等特殊行政部门的处理
11.在多个板块上市的公司数据如何选取
12.链路的抉择
13.上市公司披露值实控人不为股权穿透中的点
14.自然人合并
15.程序执行流程图
附注:
- 1.并发如何实现?
Celery+rabbitmq; - 2.本批次接收到的公司是否都需要处理?
举例来说:在处理A的时候已经把B的控制人及实际控制人都给处理过了,若后期再遇到B时会把B给过滤掉。
去重采用redis集合。 - 3.股权穿透时涉及算法
深度优先搜索+记忆化剪枝;贪心;拓扑排序。 - 4.如何快速的处理所有节点?
在处理过程中,优先处理无对外投资的节点,在处理每个起始节点的过程中,链路中间涉及的每个节点的实际控制人及控制人都进行计算。
若不采用此方案,则会导致一个离控制人最近的节点被处理很多次,增大计算的时间成本。 - 5.股权穿透时是否选取了公司所有的股东?
在初次尝试中,发现大多数公司的股权穿透达到了200层以上,一家公司的涉及到的链路获取将近1天(最坏时间复杂度:n^m,其中n表示每一层的股东数量,m表示穿透的层数),不能发挥并发的作用,同时存在大量的冗余。所以这里添加了一层基于持股比例做的剪枝,在不影响追溯结果的情况下,同时提高链路追溯的效率(具体做法不再赘述)。优化后发现最大深度控制在50层左右,效率有明显提高。 - 6.是否所有公司都需要穿透?
部分公司不需要穿透,基于上市公司披露的年报数据发现,部分公司并无实际控制人,所以针对于此类公司,并不需要穿透。 - 7.股权存在环的数据如何处理?
发现部分公司在股权穿透过程中存在环,这里存在一个破环的逻辑,如下:- 若当前追溯的公司只有一个股东,则取法定代表;若无法定代表,则取本公司。
- 若该公司存在多个股东,存在环的只有其中一个股东,则只追溯剩余的股东。
- 8.自然人如何处理?
该问题在上面已经提到过,这里不再进行过多赘述。 - 9.实际控制人和控制人查找过程中涉及算法
动态规划;trie树;广度优先搜索。 - 10.控制链路及能够计算控制权的链路的区别?
能够计算控制权的链路:是指能够通过这些链路去计算公司的控制权,链路中的某些点并不控制起始公司。
控制链路:它的产生基于能够计算控制权的链路,该链路中的每个节点都控制起始公司。 - 11.能够计算控制权的链路如何筛选?
起始公司的实际控制人计算依赖于从该公司起始经过的所有链路中的所有公司节点,若其中任何一个节点计算有误,都会导致公司的实际控制人计算错误。故深度为从大到小处理。
当处理完一个节点,若该节点存在实际控制人,则把该节点与实际控制人之间的映射关系记录。
当处理到某个节点时,对该节点存在的所有链路进行判断,针对于链路中每一个存在实际控制人的节点,若该当前数据中的实际控制人不存在于上一段落的记录中,则过滤。从而得出能够计算控制权的链路。 - 12.查找控制人过程中如何筛选出能够计算控制人的链路?
基于所有的链路数据进行建树,对树上数据的每一层取最大值,所得数据即为控制链路,该链路可用于计算控制人。