财务舞弊(本福特——KS验证)
财务舞弊(本福特——KS验证) – Bard7 – 博客园
本福特——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值小于该检验值,可以认为符合本福特定律。
一、代码
from WindPy import w
from datetime import *
import math
from scipy import stats
#本福特定律中1-9的分布概率
exp = [0.301, 0.1761, 0.1249, 0.0969, 0.0792, 0.0669, 0.058, 0.0512, 0.0458]
#启动wind
w.start()
#这里按wind取数规则,将代码和日期设为变量
list=["600000.SH"]
rptDate="unit=1;rptDate=20161231;rptType=1"
def count_num(x):
#取第一位数,并且按1-9返回出现次数的列表
numC = [0] * 9
for i in x.Data:
if not math.isnan(i[0]):
#wind空数据显示为"nan"
num=int(str(abs(i[0]))[0])
if num ==1:
numC[0]+=1
elif num==2:
numC[1]+=1
elif num==3:
numC[2]+=1
elif num==4:
numC[3]+=1
elif num==5:
numC[4]+=1
elif num==6:
numC[5]+=1
elif num==7:
numC[6]+=1
elif num==8:
numC[7]+=1
elif num==9:
numC[8]+=1
return numC
def ks(numC):
#Kolmogorov–Smirnov(KS) 统计
ks_value=0
numT = sum(numC)
p=1.36/(numT**0.5)
for j in range(0, 9):
numC[j] = numC[j] / numT
ks = [0] * 9
for i in range(0, 9):
a = 0
b = 0
for j in range(0, i + 1):
a = a + numC[j]
b = b + exp[j]
ks[i] = abs(a - b)
Max=max(ks)
if Max>p:
#如果不符合ks,返回1,符合返回0
ks_value=1
return ks_value
二、验证
1.舞弊公司
代码 | 公司名称 | 备注 |
300267.SZ | 尔康 | 系统未报错 |
600074.SH | 保千里 | 系统报错 |
300372.SZ | 欣泰 | 系统报错 |
002323.SZ | 雅百特 | 系统未报错 |
600654.SH | 中安消 | 系统未报错 |
2.上证50公司
系统均未报错。
3.结论
符合本福特—KS验证,不一定没有问题。但不符合本福特—KS验证,应该存在问题。