本福特——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 #启动wind 10 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] * 9 19 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]+=1 25 elif num==2: 26 numC[1]+=1 27 elif num==3: 28 numC[2]+=1 29 elif num==4: 30 numC[3]+=1 31 elif num==5: 32 numC[4]+=1 33 elif num==6: 34 numC[5]+=1 35 elif num==7: 36 numC[6]+=1 37 elif num==8: 38 numC[7]+=1 39 elif num==9: 40 numC[8]+=1 41 return numC 42 43 def ks(numC): 44 #Kolmogorov–Smirnov(KS) 统计 45 ks_value=0 46 numT = sum(numC) 47 p=1.36/(numT**0.5) 48 for j in range(0, 9): 49 numC[j] = numC[j] / numT 50 ks = [0] * 9 51 for i in range(0, 9): 52 a = 0 53 b = 0 54 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,符合返回0 61 ks_value=1 62 return ks_value
二、验证
1.舞弊公司
代码 | 公司名称 | 备注 |
300267.SZ | 尔康 | 系统未报错 |
600074.SH | 保千里 | 系统报错 |
300372.SZ | 欣泰 | 系统报错 |
002323.SZ | 雅百特 | 系统未报错 |
600654.SH | 中安消 | 系统未报错 |
2.上证50公司
系统均未报错。
3.结论
符合本福特—KS验证,不一定没有问题。但不符合本福特—KS验证,应该存在问题。