追踪资金流向是政府审计的一项基本方法,难点在于要对每笔支出与收入之间的关联性进行判断。本文将审计专家经验应用于算法设计,利用SQL语句进行收支记录配对、汇总“稀释资金”、决策树“剪枝”等操作,从而实现对资金流向的自动追踪。 收支关联性的判定方法 追踪资金流向的传统方法是逐笔审查被审计单位银行存款日记账或银行对账单,当账户收到某笔特定资金(如审计关注的贷款、货款等),观察其后发生的若干笔支出并对每笔支出与收入之间的关联性进行判断。由于资金收付行为的连续性、复杂性,在所关注的收支之间可能存在若干笔资金转入和转出,在此形象地称之为“稀释资金”和“抽取资金”,账户收支余以及稀释、抽取的关系如下页图所示。 “账户前余额”及“稀释资金”“抽取资金”的存在影响收支之间的关联性,如在取得100万元贷款之后又陆续转入200万元“稀释资金”,则随后支出的100万元无法认定其是否源于贷款,判断收支关联性的关键在于依据谨慎性原则设计一个标准去考察图中各项要素。 根据收支余平衡关系,账户前余额A+收入金额B+稀释资金总额C=账户后余额F+支出资金E+抽取资金总额D。认定某笔支出E源于特定收入B需满足条件:收入金额B>抽取资金总额D+账户后余额F,该公式等价于支出资金E>账户前余额A+稀释资金总额C。
上述两个公式均可作为收支关联性的判定标准,后者更便于理解,即如果某笔支出的资金量比特定收入前账户余额与收支之间“稀释资金”总和还要大,则可以认定该笔支出必然包含特定的资金收入。审计中要对特定收入后发生的每笔支出,分别统计其间转入的“稀释资金”总额,在收支频繁的情况下运算量较大。如商业银行每年发放上万笔贷款,要跟踪每笔贷款发放后承贷账户数以百计的资金支出,至少需要进行上亿次运算,显然是人工方式无法完成的。 算法设计流程 人工判定资金流向的方法可以归纳为一个决策树判定过程,在数据挖掘和人工智能领域有很多经典算法可供参考,这里仅结合数据库及SQL语句的特点,采取先“生长”再“剪枝”的方法构建决策树。 算法的总体思路是先将满足一定条件的收入记录和支出记录配对形成初步线索,再统计每对收支记录之间的稀释资金总额,最后根据收支关联性的判定标准,对初步线索进行“剪枝”操作,删除不符合条件的线索并形成追踪结果。在此基础上,把第一轮追踪形成的支出记录作为第二轮追踪的收入来源,循环执行算法可以实现对资金流向的多步追踪。 以对某商业银行贷款资金流向的追踪为例,算法的输入信息是该商业银行对公账户“交易流水表”。 第一步,根据“交易类型”字段将该商业银行审计时间范围内所有发放贷款的交易记录筛选出来(“交易类型”=“贷款入账”),形成“放款交易表”,结构与“交易流水表”相同。 create table放款交易表as select*from交易流水表where交易类型=‘贷款入账’ 第二步,将“交易流水表”与“放款交易表”进行内连接,筛选出放款账户的全部交易记录,形成“放款账户流水表”,结构与“交易流水表”相同。 create table放款账户流水表as select distinct交易流水表.* from交易流水表inner Join放款交易表on (交易流水表.账号=放款交易表.账号) 第三步,将前两步生成的“放款交易表”与“放款账户流水表”进行内连接,把放款记录与其后一定时间段内(此处为30天)的全部支出记录进行配对,形成“收支配对表”,在该表中增加由账号和收支记录流水号组成的“线索标识”唯一标定一对收支。为避免零星支出放大运算量,可根据审计重要性水平设定收支比例阈值(此处为支出金额/收入金额>10%)。 create table收支配对表as select 放款交易表.账号as账号, 放款交易表.户名as户名, 放款交易表.收入金额as贷款额, 放款交易表.余额-放款交易表.收入金额as贷前余额, 放款交易表.交易时间as放贷时间, 放款账户流水表.支出金额as支出金额, 放款账户流水表.交易时间as支出时间, 放款账户流水表.对方账号as对方账号, 放款账户流水表.对方户名as对方户名, 放款交易表.账号||放款交易表.流水号||放款账户流水表.流水号as线索标识 from放款交易表inner join放款账户流水表on (放款交易表.账号=放款账户流水表.账号 放款交易表.交易时间<放款账户流水表.交易时间 datediff(day,放款交易表.交易时间,放款账户流水表.交易时间)<30 放款账户流水表.支出金额/放款交易表.收入金额>0.1) where放款账户流水表.支出金额>0 第四步,将“收支配对表”与“放款账户流水表”进行左连接,筛选出每一对收支之间的“稀释资金”转入记录,形成“稀释资金明细表”。 create table稀释资金明细表as