2014年 第 20 期
总第 696 期
财会月刊(下)
审计与CPA
债券摊余价值审计模型与算法研究

作  者
张 莉(博士) 刘甜甜

作者单位
(北京信息科技大学信息管理学院 北京 102208)

摘  要

      【摘要】债券投资摊余成本的确认与计量直接影响财务报告的信息质量。为了有效控制审计风险,验证债券业务系统内部控制的有效性,采用平行模拟的审计方法,建立了债券投资摊余价值审计模型,设计了基于SQL的嵌套迭代算法,并用一组测试数据验证了算法的有效性,实现审计线索的精准定位。在某省商业银行债券投资审计中的实例应用,发现了被审计单位摊余价值分类错误、计算错误导致的收入低估。对债券投资业务的海量数据式审计实务有积极的指导意义和参考价值。
【关键词】债券投资   摊余价值审计   平行模拟审计模型   嵌套迭代算法

一、问题的提出
在对金融、证券等行业的审计中,债券投资业务常是最重要的业务环节。随着被审计单位信息技术的日益变化,审计人员面临的IT审计风险凸现。从业务层面分析,债券投资审计的重大错报风险往往体现在系统控制风险和审计检查风险上。
首先,资金管理系统的数据经由不同操作员录入核心业务系统,系统间的数据传递存在非技术控制风险,存在错报且没有被内部控制及时防止、发现和纠正的可能性。其次,债券投资种类多、利率复杂、购买日与交割日各异,可能存在某一认定错报,该错报单独或连同其他错报是重大的,但注册会计师未能发现这种错报的可能性。尤其是对各债券实际利率、摊余成本的实质性测试更为重要,采用适当的审计方法以有效降低检查风险是审计人员义不容辞的责任。
审计人员如何验证债券投资业务报表数据的真实性、合法性、完整性,如何保障债券投资原始数据、过程数据、结果数据的一致性?二、文献综述
国内外金融审计实践中对债券投资数据审计时,常采用逆查法、流程法、关键数据复核法、复算法等测试方法。宜保华(2013)等提出了对债券投资成本、溢折价摊销、收益计量确认的复算法对实践有一定的指导意义;张莉(2012)设计了商业银行信息系统控制测试底稿在实践中有一定的实用价值。郁玉环(2010)利用EXCEL计算债券“非整数计息期”的实际利率和摊余价值,这种方法方便快捷,对于少量的债券投资业务可快速完成。这些研究成果有效地指导了商业银行审计实践。但总体而言,债券投资审计的研究成果较少,技术方法也有不足:
1. 利用EXCEL等工具进行复算,从审计人员视角常常会将每一笔投资的买入与卖出一一对应进行测试,以确定当期摊余价值及应计利息。而实际业务中,债券交易信息系统会存储债券基本信息表、债券交易信息表两张二维表,所有债券的买入、卖出交易均是分为多条记录存储的,这种存储模式造成审计人员按照常规审计方法很难计算每只债券的摊余价值及应计利息。
2. 进行实质性测试时往往抽取部分测试数据,很难覆盖到全部的、海量的交易数据,容易因审计抽样的方法、样本的选择而产生审计风险,且对列报的完整性审计困难。
3. EXCEL计算债券的实际利率,由于付息日不同,现金流和实际利率需要根据交易业务单独测算,需逐笔计算每笔投资业务的摊余价值,批量处理困难。
4. 由于信息系统内部控制的复杂性,债券投资的数据从业务系统、财务系统到报表要经过多个部门、多个环节,各系统间数据传递的真实性、完整性常被忽略,且往往审计人员对金融机构、证券行业的信息系统本身并不熟悉,更多地将审计重点放在对财务数据的关注上,对处理海量数据的计算机应用系统本身控制参数的合理性、计算方法准确性的审计更容易被忽略。
为了有效控制审计风险,有必要对债券投资业务流程、涉及到的信息系统间的数据流程进行梳理,基于债券投资业务整体建立计算机辅助审计模型,设计合理的算法进行审计。
三、债券摊余价值平行模拟审计模型
为了实现批量审计SERVER债券投资摊余价值的估价准确性认定,本文基于SQL SERVER设计了平行模拟审计方案。
在审前调查阶段,审计人员应先分析债券投资业务流程:金融机构进行债券投资时,需要由投资部门负责通过资金管理系统办理、复核并生成单据,由部门领导或行领导审批后,由结算部门记账,将数据传递到核心业务系统或数据仓库,生成报表。根据业务流程,审计人员可绘制业务流程图,并分析出关键业务。
在审计计划阶段,审计人员应根据业务流程绘制数据流程图;根据关键业务分析关键数据,确定相应的审计人员及审计数据获取方案。
在审计实施阶段获取关键数据,商业银行的债券投资需要备份被审计单位原始债券业务数据(包括基本信息表和债券交易表)以及被审计单位账面债券价值数据(业务清单表),了解并详细分析数据间的逻辑关系,结合计算机辅助审计技术,利用SQL SEVER进行平行模拟,建立平行模拟审计模型(如下图所示)。为了准确计算全部债券的投资收益,必须计算每只债券的溢折价、实际利率、审计截止日的现金流,从而确定全部债券的审计截止日的摊余价值和应计利息。因此,平行模拟审计模型首先建立实际利率测试模型,计算债券的实际利率;其次计算债券交易的现金流;最后计算测试日(审计截止日)交易债券的摊余成本;最终将被审计单位数据与平行模拟测试数据进行自动比对,计算错报金额,发现疑点并逐一落实取证。平行模拟审计方案从全局关注所有交易数据,从而避免审计抽样带来的检查风险。
1. 实际利率计算模型。债券的折溢价采用实际利率法来摊销。当债券初次买入时、债券逆回购或正回购做起息交易时,需要计算实际利率,或是当已有债券再次买入时、浮息债每次更新利率时,需要重新计算实际利率。
实际利率批量审计模型根据债券基本信息(或回购合同信息)来计算未来其预计的现金流,并计算该未来现金流量折现为债券当前账面价值(或回购融资金额)所使用的利率以确定实际利率。
实际利率模型:
 (1)  
其中: rate=实际利率;d1=第0个支付日期(买入日期);di=第i个支付日期;Pi=第i个现金流入金额;现金流系列中必须包含至少一个正值和一个负值。
首次支付与投资开始时的成本有关并是可选的,初始投资时的现金流为账面价值(即买入时的净价总额),必须是负值。所有后续支付都基于 365 天/年贴现。
2. 现金流计算模型。债券投资中债券计息方式分为固息债(固定利息的债券,利率为票面利率)和浮息债。为概化模型,仅以固息债为例进行模型设计。
现金流模型:
[Pi=P0+P×R×Di12-Ir] (2)  
其中:Pi=第i期现金流;R=票面利率;Di=第i期的付息周期;
当i=1时,P0=P=面值;Ir=应计利息;
当i[≠]1时,P0=0;Ir=0;
第一期现金流金额为每期付息额减当前应收利息。
3. 摊余价值计算模型。债券现值为债券的当前摊余成本,即面值加利息调整(借方为正,贷方为负)。《企业会计准则第22号——金融工具确认和计量》中明确了金融资产的摊余成本,是指该金融资产的初始确认金额经下列调整后的结果:①扣除已偿还的本金;②加上或减去采用实际利率法将该初始确认金额与到期日金额之间的差额进行摊销形成的累计摊销额;③扣除已发生的减值损失。
摊余价值模型:
 (3)  
其中:Vt=某项金融资产第t期摊余价值;Vt-1=某项金融资产第t-1期摊余价值;P=面值;rate=实际利率;d1=第0个支付日期(买入日期);di=第i个支付日期;Lt=第t期累计发生的减值损失。
4. 摊余价值比较。将被审计单位账面该项金融资产的摊余价值,与通过债券投资平行模拟模型计算出的某项金融资产审计截止日的摊余价值进行比较,发现被审计单位可能的错报金额,再进一步进行落实取证。
摊余价值比较模型:
△v=Vz-Vt (4)  
其中:△v=审计截止日某项债券的账面摊余价值与实际测算价值的差;Vz=审计截止日被审计单位账面摊余价值;Vt=审计截止日债券测算得到的摊余价值。
基于SQL SERVER平行模拟的审计模型可处理批量债券投资的摊余价值,有利于审计现场快速发现审计疑点。
四、实证应用
为了验证基于SQL SERVER平行模拟法的有效性,在某商业银行债券投资业务审计中,根据被审计单位债券业务系统的控制逻辑,获取其关键数据:基础债券信息表、交易信息表、业务清单三张表。数据采集时可根据被审计单位数据库类型与审计人员具备的条件进行分析,如审计人员具备被审计单位业务系统相同的数据库版本,可直接采集数据库文件;如不具备相同环境,可采集文本文件或EXCEL数据格式,再将其导入审计人员所具备的数据库中。
本次实证采集了被审计单位某银行近三年交易债券的全部基础信息表、交易信息表及业务清单三张表(主要字段及数据类型如表1 ~ 3所示)。该数据文件为TXT格式,将其导入SQL 2008数据库中,并进行数据校验。(一)数据采集与整理
数据采集后将表1 ~ 3的数据导入SQL sever 2008,在转换过程中要特别注意:如“债券代码”字段类型,若以“0”或字母开头的,需注意在导入过程中要保持原来数据的真实和完整性。由于债券代码是以字符形式存储的,有些以“0”开头的债券代码在导入过程中容易造成数据丢失,因此需在导入过程中进行映射处理,将数据类型设为“nvarchar”;也可在导入前将EXCEL数据进行字符化处理后再导入。
(二)算法设计
为了更快速地核实被审计单位债券摊余价值计算的准确性和完整性,采用SQL server进行数据处理和算法实现。首先设计了折溢价表、现金流表、现金时间表、实际利率表、摊余成本计算表、测试结果表等审计中间表。其次,利用游标设计嵌套迭代算法,按照债券审计模型分折溢价、现金流、付息日、实际利率、摊余价值等六步骤进行审计测试。最后计算出审计测试结果与被审计单位数据计算差额。
为了更好地展示算法实现过程,下文将该商业银行数据在实证测试中的过程用部分数据进行展示。
1. 折溢价算法。折溢价表用于记录一次交易的折价/溢价/平价的具体情况,包括债券代码、折溢价及序列号两个字段。折溢价测试存储过程针对每一只债券的一次交易,从交易信息表中获得数据,根据折溢价公式计算出折、溢价,存入折溢价表中。
2. 现金流算法。首先,建立现金流表,包括债券代码、第一期摊余成本、第一期现金流、中间期现金流、最后一期现金流及序列号六个字段。其次,建立存储过程,针对每次交易,从交易信息表和基础信息表中获取数据,计算出该债券以后各期的现金流,最后存入现金流表中。其中交易信息表和基础信息表是通过公共字段“债券代码”相互连接。执行存储过程计算出每只债券的未来各期现金流,并存入现金流表。
3. 付息日现金流算法。为了测试付息日全部债券的现金流,需计算每只债券每一个付息日的现金流。算法如下:
(1)建立单只债券的现金时间表。此表主要记录每个债券交易的付息日,现金流和序列,其中,序列0代表第一期摊余成本,1代表第一期现金流,2 ~ n-1期代表中间期现金流,以及最后一期现金流对应序列n。
在现金时间表中,每一债券代码都是从序列0到序列n排序且连续不中断(某债券的实例如表4)。债券代码和序列两个字段值可以唯一标识出此债券具体某个付息日的现金流。

 

 

 

 

 

(2)建立存储过程,用于自加循环。根据计算公式“付息日=上一付息日+付息周期相隔天数”,计算出每只债券的付息日和对应的现金流,并存入现金时间表(表5)。

 

 

 

 

4. 实际利率的嵌套迭代算法。此算法用于根据折溢价、付息日、现金流等条件计算实际利率。
(1)建立实际利率表,用于记录每只债券的实际利率,其中包括实际利率、债券代码及序列号三个字段。
(2)建一个临时表(用于记录每只债券的现金流明细),其中包括现金流、付息日及序列三个字段。每次利用临时表存储数据时先清空表中数据,每筛选出一只债券交易记录,为之编制一张现金流明细表,现金流明细信息将存入临时表。保证每次临时表中只有一只债券交易的现金流明细,以确保系统计算实际利率时是针对唯一一只债券交易进行的,并提高了数据库的运算效率。
(3)设计实际利率函数(XIRR)及算法。债券业务实际利率采用迭代计算:首先,求得债券的未来现金流金额及每一个未来现金流入日期与买入日期之间的实际天数。正值代表现金流入,负值代表现金流出。将初始账面价值、每一期现金流及对应的日期差等代入公式(1),迭代步长取0.1,通过改变收益率,不断修正计算结果,直至其误差精度小于 0.000 001%,即可得出实际利率rate。系统中实际日利率保存到小数点后11位。
(4)建立存储过程,从现金时间表中得到付息日和现金流,计算出每只债券的实际利率,并存入实际利率表(表6)。

 

 

 


核心代码如下:
CREATE PROCEDURE  计算实际利率
AS
BEGIN
DECLARE 债券代码游标 CURSOR FOR SELECT 债券代码,序列号 FROM 交易信息表
OPEN 债券代码游标
FETCH FROM 债券代码游标 INTO @债券代码,@序列号                                            
WHILE (@@FETCH_STATUS=0)
 BEGIN
 DECLARE @实际利率计算表 MYXIRRTABLE                         
 INSERT INTO 临时表(现金流,付息日,序列)SELECT 现金流,付息日,序列 FROM 现金时间表
 WHERE 债券代码=@债券代码 AND 序列号=@序列号  /∗选出一只债券的现金流记录插入临时表∗/
 DECLARE 实际利率游标 CURSOR FOR SELECT 现金流,付息日 FROM 临时表   /∗嵌套游标∗/
 OPEN 实际利率游标
 FETCH FROM 实际利率游标 INTO @现金流,@付息日
 WHILE (@@FETCH_STATUS=0)
  BEGIN
INSERT INTO @实际利率计算表 VALUES(@现金流,@付息日)
FETCH FROM 实际利率游标 INTO @现金流,@付息日
  END
 CLOSE 实际利率游标
 DEALLOCATE 实际利率游标
 UPDATE 实际利率表 SET 实际利率=(SELECT 实际利率函数(@实际利率计算表,0.1)) 
 WHERE 债券代码=@债券代码 AND 序列号=@序列号         /∗更新本只债券的实际利率值∗/
 TRUNCATE TABLE 临时表                                 /∗清除当前债券现金流序列∗/
 DELETE FROM @实际利率计算表                     FETCH FROM 债券代码游标 INTO @债券代码,@序列号
 END
CLOSE 债券代码游标
DEALLOCATE 债券代码游标
END
注:利用XIRR函数来计算实际利率,现金流量以“付息期”为单位,输入的付息日及对应的现金流,现金流量可以是非定期式的,即付息期可以是任何时间点,不必有规律。好比交割日与往后的付息期没有任何关联,但交割日的现金流也需包含在内用于计算实际利率。
5. 摊余价值算法。
首先,建立摊余成本表,用于记录每只债券于交割日及付息日的摊余成本。摊余成本是用实际利率作计算利息的基础,投资的成本减去利息后的金额。该摊余成本实际上相当于持有至到期投资的账面价值。
其次,建立存储过程,针对每只债券交易计算出今后每个付息日时点上的摊余成本。假设无减值损失,在从初始确认金额中扣除已偿还的本金,加上或减去采用实际利率将该初始确认金额与到期日金额之间的差额进行摊销形成的累计摊销额,计算出经上述调整后的结果,即每只债券以后各期的摊余成本,存入摊余成本表中(表7)。6. 测试结果。为验证嵌套迭代算法的有效性,利用实证数据测试审计日的被审计单位摊余成本,利用存储过程计算审计测试结果与被审计单位披露结果进行比对,并发现差异。
首先,建立一个测试结果表,用于记录测试日当天债券的摊余成本、溢折价余额、累计票面利息计提、累计实际利息收入、测算尾差等信息。测试日可以自定义,可以是资产负债表日(12月31日),亦可以是持有期间的任意日期。
其次,建立一个存储过程,用于输入用户自定义的测试日,计算出测试日距上一付息日的天数,作为持有天数,按上述计算每个付息日时点上的摊余成本同样的方法,最终计算出测试日每只债券的摊余成本、溢折价余额、累计票面利息计提、累计实际利息收入、测算尾差等信息,并存入测试结果表中(表8)。
7. 比较测试摊余成本与被审计单位账面的摊余成本。将利用平行模拟算法计算的测试日摊余成本与被审计单位账面的摊余成本进行对比,发现差额,再进行下一步延伸取证,落实问题。
首先,汇总测试日每只债券的总的摊余成本以及折溢价,存入债券测试摊余价值表中,然后与被审计单位账面的摊余价值即业务清单数据进行对比,计算差额,将有差额的债券记录存入被审计单位账面摊余价值与测试摊余价值差值表中(表9)。
经测试,发现该商业银行由于债券投资分类错误、摊余价值计算错误导致本期投资收益高估。表9显示,被审计单位截止到2011年年末,持有至到期投资共高估摊余成本499 162.57元,除此之外其他债券不存在差额。
五、结论
1. 采用了基于SQL SERVER的平行模拟法,可正确计算债券投资收益,可对批量债券投资数据进行审计,本文验证了该方法的有效性。
2. 本次实证分析发现被审计单位由于对债券投资交易分类错误、系统对实际利率计算公式设置错误等原因造成投资收益高估的会计失真现象。
主要参考文献
1. 宜保华,杨建伟.银行业债券投资风险及审计方法.山西财税,2013;3
2. 张莉.商业银行信息系统审计中的控制测试底稿设计.北京信息科技大学学报(自然科学版),2012;4
3. 郁玉环.利用Excel求解出现“非整数计息期”的持有至到期投资的实际利率.中国管理信息化,2010;3
4. 刘汝焯等.审计线索的特征发现.北京:清华大学出版社,2008
5. 卢家辉,文华宜,张海燕等.商业银行计算机审计模型研究.北京:中国时代经济出版社,2009
6. 柯芳.商业银行运用计算机审计思考.现代商贸工业,2009;18
7. 黎朝晖.商业银行计算机网络系统的风险与审计.南方金融,2008;2