IT审计之辅助财务审计
在实践中, IT 审计团队通常是和财务审计团队配合完成审计工作的,区别是财务审计是对被审计单位的财务报表及其附注发表意见,而 IT 审计是对信息系统发表意见。
我们所做的工作是通过测试财务报表所依赖的信息系统(包括财务系统和业务系统)的有效性、数据的真实性,证明信息系统环境是否可以信赖。从某种意义上来说, IT 审计是服务于财务审计。
随着财务审计对 IT 审计工作的了解,他们会对 IT 审计提出更多 IT 审计工作范围外的期待。
尤其是在企业信息化浪潮下,受限于技术能力,财务审计团队在数据处理,方法创新方面对 IT 审计团队提出了更高的要求。因此 IT 审计如何更好地辅助财务审计是一个新的课题。
利用Python代替繁重计算
在财务审计中存在大量数据处理、数据计算的基础性工作,对于这类有逻辑重复性工作, IT 审计团队可以借助 Python 批量完成。
成本还原
对于生产制造业的 IPO 审计项目,成产品的料工费占比是财务审计特别关注的事项。而很多企业采用了逐步结转分步法来核算生产成本,由于每一道工序的半成品将是下一道工序的原材料,所以要计算产成品真实的料工费占比就需要进行成本还原。
如果企业使用的 ERP 系统没有还原后的成本结构报表,同时财务成本会计也未手工编制成本结构报表,那么这项核查工作对于财务审计来说将是巨大的工作量。
对于这类财审提出的需求,我们会了解企业的生产工艺,以及成本还原的计算方法,再利用 Python 编程语言,模拟成本还原的计算过程,将产成品拆分成真实的料工费,从而计算出料工费的占比。
通过 IT 审计团队的辅助,财审团队能完成人工短时间无法完成的工作。
保费收入与收款流水核对
在一家保险公司 IT 审计项目中,财审团队需要我们对保费收入与收款流水进行数据核对。
当我们了解到业务中存在大量多个保单对应多个收款流水的情况,对于这种多对多关系,正常是无法批量核对的。
一般情况下,我们核对的数据关系要么是一对一、多对一或者一对多。这三种情况我们写 SQL 语句时都很好处理,只需要将多条数据按单号聚合汇总再进行核对就可以。
这种多对多的关系我们可以借助数学图论中的二分图解决。
比如,我们将这种关系画上线,可以看到其中可以形成一些独立的网络,这里我们将这种网络(用不同颜色标记)简称为组。
我们将独立的网络编上组号,然后将两个数据集的金额分别按组号汇总再进行核对。
示例 Python 代码:
class Net(object):
def __init__(self):
self.setA = {
'A': ['a', 'b', 'c'],
'B': ['d'],
'C': ['b'],
'D': ['a', 'c'],
'E': ['e']
}
self.setB = {
'a': ['A', 'D'],
'b': ['A', 'C'],
'c': ['A', 'D'],
'd': ['B'],
'e': ['E'],
}
self.keys = list(self.setA.keys()) + list(self.setB.keys())
self.groups = {}
def split_net(self):
num = 0
for key in self.keys:
if key not in self.groups.keys():
num += 1
self.loop_net(key, num)
def loop_net(self, node, id):
if node:
self.groups[node] = id
if node in self.setA.keys():
sub_nodes = self.setA[node]
else:
sub_nodes = self.setB[node]
for sub_node in sub_nodes:
if sub_node:
if sub_node not in self.groups.keys():
self.loop_net(sub_node, id)
if __name__ == '__main__':
net = Net()
net.split_net()
print(net.groups)
我们借助 Python 构建了类Net
,通过 loop_net
函数递归找出两个数据集形成的独立网络,从而给独立网络分组,最后我们可以将两个数据集分别按组号聚合后进行核对。
利用Python获取外部信息
在财务审计过程中,外部信息的可靠性大于内部信息,因此审计师会查询大量的外部信息与获取的内部信息做交叉验证。
例如,审计一家汽车硬件销售的企业,财务审计团队计划查询销售订单中对应的汽车车架号的信息,核实有没有真实车辆以及车型信息,以及判断查询的外部信息与订单信息是否存在矛盾。
企业 1 年的销售订单有 30 万,依赖审计师人工查询将不太现实。那么,我们 IT 审计团队提出了两种方案:
- 购买接口,通过 python 调用接口批量获取数据。
- 编写爬虫,通过 python 编写爬虫获取公开网站数据。
出于节约成本考虑我们选择编写爬虫获取公开信息,用 python 的selenium包,自动查询网站数据,并将结果保存到本地文件。
最后再由财务审计团队对外部信息与内部信息的一致性进行判断。
当然,对于很多公开网站都会有反爬措施,如验证码、访问频率限制、字体混淆等,对于我们 IT 审计团队提出了一定的技术要求。
除此外,财务审计对于外部信息的获取有很大的需求,如同行业财务指标、公司公告、发函快递信息、汇率、交易性金融资产价格等等。
这类需求,随着这几年的发展已有很多成熟的商业网站可以满足,但对于一些特殊的、行业属性较强的小众信息,如果不能批量查询,那么 IT 审计团队就可以辅助财务审计完成信息获取工作。
利用IT技术进行方法创新
2020年 6 月24日,证监会依法对獐子岛公司信息披露违法违规案作出行政处罚及市场禁入决定。证监会将渔船的北斗定位信息,通过第三方机构还原出航行轨迹,从而计算出采捕区域面积,进而估算真实成本。
根据这则公开披露的信息,启发了我们利用信息技术的优势,对相关数据进行深入分析挖掘,使审计工作更加智慧、高效。我们 IT 审计团队相对有信息技术的优势,而财务审计团队在财务处理、项目风险识别等方面更有优势,两个团队的良好融合会发挥1+1>2的效果。
对于这类精纬度空间信息,我们可以通过 Python 计算面积、周长、距离。
示例 Python 代码:
from pyproj import Geod # 导入Geod类
from shapely.geometry import Point, LineString, Polygon # 导入点、线、多边形类
# 计算封闭区域面积、周长
geod = Geod(ellps="WGS84") # 创建一个WGS84坐标系
polygon = Polygon([(116.169465, 39.932670), (116.160260, 39.924492),
(116.150625, 39.710019), (116.183198, 39.709920),
(116.226950, 39.777616), (116.442621, 39.799892),
(116.463478, 39.790066), (116.588276, 39.809551),
(116.536091, 39.808859), (116.573856, 39.839643),
(116.706380, 39.916740), (116.600293, 39.937770),
(116.514805, 39.982375), (116.499935, 40.013710),
(116.546520, 40.030443), (116.687668, 40.129961),
(116.539697, 40.080659), (116.503390, 40.058474),
(116.468800, 40.052578)]) # 将多个精纬度坐标实例化为Polygon多边形对象
poly_area, poly_perimeter = geod.geometry_area_perimeter(polygon) # 计算多边形面积和周长
print(poly_area, poly_perimeter) # 打印面积和周长
面积:951546279.1726327 周长:183419.43445625657
结语
随着新技术、新模式在企业发展过程中不断涌现,财务审计与 IT 审计的融合将会更加紧密。在这样的背景下, IT 审计的工作界限未来可能会更加模糊, IT 审计如何发挥我们的优势辅助财务审计高效、智慧地完成审计工作需要我们共同探索。