本福特——KS验证
Amiram1(2015)发表文章Financial statement errors: evidence from the distributional properties of financial statement numbers, 其在文章中成功的将本福特定律应用于美国上市公司的年报数据,发现1、在同一年中,重修订的数据比原始谎报数据更符合本福特定律;2、统计越偏离本福特定律,该上市公司的持续盈利能力越低。文章中利用Kolmogorov–Smirnov(KS) 统计与Mean Absolute Deviation (MAD)两种检验方式来度量实际分布概率与本福特定律的偏差程度, KS的计算公式为:
KS=Max(|AD1−ED1|,|(AD1+AD2)−(ED1+ED2)|,…,|(AD1+AD2+…+AD9)−(ED1+ED2+…+ED9)|)
其中AD是统计数据的真实分布,ED为该数字在本福特定律中的期望概率。可以利用KS来检验该分布适合本福特定律,在5%的水平下,检验值为 1.36/srqt§,其中P为总的统计样本个数。如果该样本的KS值小于该检验值,可以认为符合本福特定律。
一、代码
1 from WindPy import w 2 from datetime import * 3 import math 4 from scipy import stats 5 6 #本福特定律中1-9的分布概率 7 exp = [0.301, 0.1761, 0.1249, 0.0969, 0.0792, 0.0669, 0.058, 0.0512, 0.0458] 8 9 #启动wind10 w.start()11 12 #这里按wind取数规则,将代码和日期设为变量13 list=["600000.SH"]14 rptDate="unit=1;rptDate=20161231;rptType=1"15 16 def count_num(x):17 #取第一位数,并且按1-9返回出现次数的列表18 numC = [0] * 919 for i in x.Data:20 if not math.isnan(i[0]):21 #wind空数据显示为"nan"22 num=int(str(abs(i[0]))[0])23 if num ==1:24 numC[0]+=125 elif num==2:26 numC[1]+=127 elif num==3:28 numC[2]+=129 elif num==4:30 numC[3]+=131 elif num==5:32 numC[4]+=133 elif num==6:34 numC[5]+=135 elif num==7:36 numC[6]+=137 elif num==8:38 numC[7]+=139 elif num==9:40 numC[8]+=141 return numC42 43 def ks(numC):44 #Kolmogorov–Smirnov(KS) 统计45 ks_value=046 numT = sum(numC)47 p=1.36/(numT**0.5)48 for j in range(0, 9):49 numC[j] = numC[j] / numT50 ks = [0] * 951 for i in range(0, 9):52 a = 053 b = 054 for j in range(0, i + 1):55 a = a + numC[j]56 b = b + exp[j]57 ks[i] = abs(a - b)58 Max=max(ks)59 if Max>p:60 #如果不符合ks,返回1,符合返回061 ks_value=162 return ks_value
二、验证
1.舞弊公司
代码 | 公司名称 | 备注 |
300267.SZ | 尔康 | 系统未报错 |
600074.SH | 保千里 | 系统报错 |
300372.SZ | 欣泰 | 系统报错 |
002323.SZ | 雅百特 | 系统未报错 |
600654.SH | 中安消 | 系统未报错 |
2.上证50公司
系统均未报错。
3.结论
符合本福特—KS验证,不一定没有问题。但不符合本福特—KS验证,应该存在问题。