掌孝政
[摘要]兩項(xiàng)直達(dá)延期政策審計(jì)需將審計(jì)期間商業(yè)銀行全部的貸款臺(tái)賬、商業(yè)銀行上報(bào)人民銀行領(lǐng)取補(bǔ)貼的臺(tái)賬進(jìn)行比對(duì)分析,由于審計(jì)數(shù)據(jù)量非常龐大、審計(jì)模型非常復(fù)雜,傳統(tǒng)的手工抽樣方式難以實(shí)現(xiàn)審計(jì)全覆蓋,存在審計(jì)風(fēng)險(xiǎn)。引入Python可以更好地解決兩項(xiàng)直達(dá)延期政策審計(jì)的問題。本文針對(duì)兩項(xiàng)直達(dá)延期政策審計(jì)的算法進(jìn)行了深入研究。延期政策包括展期、無還本續(xù)貸、借新還舊、三個(gè)工作日還舊借新等多種模型,在編寫代碼的時(shí)候要綜合考慮每種模型的特點(diǎn)。
[關(guān)鍵詞]兩項(xiàng)直達(dá)貨幣政策工具? ?Python
了加大金融對(duì)實(shí)體經(jīng)濟(jì)的支持、幫助小微企
業(yè)渡過難關(guān),2020年6月1日,中國(guó)人民銀行推出了兩項(xiàng)直達(dá)貨幣政策。如何監(jiān)督商業(yè)銀行在兩項(xiàng)直達(dá)延期政策中的執(zhí)行情況成為新的審計(jì)難點(diǎn)。本文以人民銀行對(duì)***商業(yè)銀行兩項(xiàng)直達(dá)政策審計(jì)項(xiàng)目的實(shí)例,從數(shù)據(jù)準(zhǔn)備、代碼解析、輸出結(jié)果分析三個(gè)方面詳細(xì)闡述延期政策的審計(jì)方法。人民銀行審計(jì)部門可以通過數(shù)據(jù)比對(duì)分析監(jiān)督商業(yè)銀行在兩項(xiàng)直達(dá)政策中的執(zhí)行情況,商業(yè)銀行也可以通過代碼篩選出貸款臺(tái)賬中符合延期政策的貸款,具有較高的實(shí)用價(jià)值。
一、數(shù)據(jù)準(zhǔn)備
(一)被審計(jì)商業(yè)銀行的貸款臺(tái)賬
兩項(xiàng)直達(dá)延期政策要求貸款的到期日期要大于等于2020年6月1日,而一般的銀行貸款年限為1—2年。所以,在審計(jì)中需要調(diào)取商業(yè)銀行貸款發(fā)放日期為2018年6月1日至審計(jì)日的所有貸款臺(tái)賬(以下簡(jiǎn)稱大臺(tái)賬)。調(diào)取大臺(tái)賬的要素主要包括個(gè)人(企業(yè))的“證件號(hào)碼”“客戶名稱”“貸款金額”“貸款發(fā)放日期”“貸款到期日期”“貸款結(jié)清日期”“利率”“自助循環(huán)貸款標(biāo)識(shí)”“貸款產(chǎn)品名稱”“貸款用途”“逾期貸款標(biāo)識(shí)”“展期貸款標(biāo)識(shí)”等。大臺(tái)賬的格式如表1所示。
(二)商業(yè)銀行上報(bào)人民銀行的臺(tái)賬
商業(yè)銀行上報(bào)人民銀行的臺(tái)賬(以下簡(jiǎn)稱小臺(tái)賬)是商業(yè)銀行領(lǐng)取延期政策獎(jiǎng)勵(lì)的主要依據(jù),其格式如表2所示。
二、代碼解析
(一)數(shù)據(jù)預(yù)處理
引入需要使用的Python庫(kù)函數(shù),代碼如下:
import os
import pandas as pd
import numpy as np
import datetime
from datetime import datetime
from chinese_calendar import is_holiday
1.大臺(tái)賬數(shù)據(jù)預(yù)處理。首先,導(dǎo)入大臺(tái)賬,以變量df_nsls_yq進(jìn)行存儲(chǔ)。代碼如下:
df_nsls_yq = pd.read_excel(r'201901-202106臺(tái)賬.xlsx')
其次,通過strptime()函數(shù)將“貸款發(fā)放日期”“貸款到期日期”“貸款結(jié)清日期”轉(zhuǎn)換成可以計(jì)算的日期格式。這里要用到Python的datetime函數(shù),代碼如下:
list1 = []
for i in df_nsls_yq['貸款發(fā)放日期']:
a = datetime.strptime(str(i),'%Y%m%d')
list1.append(a)
df_nsls_yq['貸款發(fā)放日期'] = list1
list1 = []
for i in df_nsls_yq['貸款到期日期']:
a = datetime.strptime(str(i),'%Y%m%d')
list1.append(a)
df_nsls_yq['貸款到期日期'] = list1
其中%Y%m%d是大臺(tái)賬中日期(如20190806)的原始格式(見表1),如果日期格式是2019-08-06,則需要改為%Y-%m-%d,格式要保持一致。這里的Y代表年,m代表月,d代表日。
而“貸款結(jié)清日期”由于存在未結(jié)清貸款的數(shù)據(jù)是空白的情況,將需要空白的地方進(jìn)行填充,以方便后續(xù)進(jìn)行計(jì)算。代碼如下:
dt2030 = datetime(2030, 1, 1, 0, 0)
list1 = []
for i in df_nsls_yq['貸款結(jié)清日期']:
if len(str(i)) < 5:
a = dt2030
list1.append(a)
else:
b = datetime.strptime(str(i),'%Y%m%d')
list1.append(b)
df_nsls_yq['貸款結(jié)清日期'] = list1
最后,檢查一下“貸款金額”是否為浮點(diǎn)型(float)數(shù)據(jù),如果是字符型(str)數(shù)據(jù)則需要轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)。經(jīng)過處理后的大臺(tái)賬格式如表3所示。
2.小臺(tái)賬的數(shù)據(jù)預(yù)處理。因?yàn)樯虡I(yè)銀行一般是按月進(jìn)行統(tǒng)計(jì),而小臺(tái)賬的數(shù)據(jù)格式是一致的,這里可以通過代碼將所有的小臺(tái)賬數(shù)據(jù)表格進(jìn)行合并,代碼如下所示:
path = r'D:\小臺(tái)賬'
files = os.listdir(path)
list1 = []
for i in files:
df1 = pd.read_excel(i)
list1.append(df1)
df_yq = pd.concat(list1)
將所有的小臺(tái)賬數(shù)據(jù)存放于D盤“小臺(tái)賬”這個(gè)文件夾中,方便進(jìn)行提取合并。
最后檢查一下“延期本金”是否為浮點(diǎn)型(float)數(shù)據(jù),如果是字符型(str)數(shù)據(jù)則需要轉(zhuǎn)換為浮點(diǎn)型數(shù)據(jù)。
(二)數(shù)據(jù)比對(duì)及存儲(chǔ)
數(shù)據(jù)預(yù)處理完成以后,就可以進(jìn)行比對(duì)了。這里以許*的貸款臺(tái)賬為例,分為5個(gè)步驟進(jìn)行詳細(xì)說明。
1.通過小臺(tái)賬中的“客戶名稱”,查找大臺(tái)賬中對(duì)應(yīng)名稱的所有貸款臺(tái)賬,代碼如下:
dt202006 = datetime(2020, 6, 1, 0, 0)
list_name = list(df_yq['企業(yè)名稱'])
list_name = list(set(list_name))
for k in list_name:
df1 = df_nsls_yq[df_nsls_yq['客戶名稱'] == k]
當(dāng)客戶名稱為許*時(shí),變量df1的數(shù)據(jù)如表4所示。
通過臺(tái)賬中的“證件號(hào)碼”可以看出,“客戶名稱”為“許*”共有四個(gè)重名,證件號(hào)碼的尾號(hào)分別為14、31、32、36。
2.計(jì)算許*貸款臺(tái)賬中符合展期條件的貸款金額,代碼如下:
df33 = df1[df1['是否展期'] == '展期']
df44 = df33[df33['自助'] != '自助放款']
df55 = df44[df44['貸款到期日期'] >= dt202006]
m_zq = sum(df55['貸款金額'])
通過表4的臺(tái)賬可以看出,許*沒有展期貸款,所以變量m_zq等于初始值0。
3.根據(jù)表4中的“證件號(hào)碼”對(duì)許*貸款臺(tái)賬進(jìn)行分類提取,代碼如下:
df1 = df1[(df1['是否展期'] == '展期') | (df1['貸款到期日期'] >= dt202006)]
df2 = df_yq[df_yq['企業(yè)名稱'] == k]
a = sum(df2['延期本金'])*10000
if len(df1) == 0:
listn.append(df2)
else:
listzj = list(df1['證件號(hào)碼'])
listzj = list(set(listzj))
for x in listzj:
dfx = df1[df1['證件號(hào)碼'] == x]
dfx = dfx.reset_index(drop = True)
4.分別計(jì)算每個(gè)證件號(hào)碼對(duì)應(yīng)的貸款臺(tái)賬中符合借新還舊、三個(gè)工作日還舊借新條件的金額,并將金額進(jìn)行相加,代碼如下:
for i in range(0,len(dfx)):
s = dfx['貸款發(fā)放日期'][i]
z = dfx['自助'][i]
for j in range(0,len(dfx)):
e = dfx['貸款結(jié)清日期'][j]
e1 = e + datetime.timedelta(days=1)
e2 = e + datetime.timedelta(days=2)
e3 = e + datetime.timedelta(days=3)
e_0 = False
e_1 = False
e_2 = False
e_3 = False
if e != dt2030:
e_0 = is_holiday(e)
e_1 = is_holiday(e1)
e_2 = is_holiday(e2)
e_3 = is_holiday(e3)
w = dfx['貸款結(jié)清日期'][j].weekday()
c = (s -e).days
if i != j:
if e_0 == True or e_1 == True or e_2 == True or e_3 == True:
if e_0 == True:
h = 1
bool_h =1
while bool_h:
bool_h = is_holiday(e + datetime.timedelta(days=h))
h = h+1
h = h - 1
else:
if e_1 == True:
h = 1
bool_h =1
while bool_h:
bool_h = is_holiday(e1 + datetime.timedelta(days=h))
h = h+1
else:
if e_2 == True:
h = 1
bool_h =1
while bool_h:
bool_h = is_holiday(e2 + datetime.timedelta(days=h))
h = h+1
else:
if e_3 == True:
h = 1
bool_h =1
while bool_h:
bool_h = is_holiday(e3 + datetime.timedelta(days=h))
h = h+1
if c <= (3+h) and c >= 0 and z != '自助放款':
list1.append(i)
list1.append(j)
list2.append(e)
list3.append(i)
list4.append(j)
else:
if w == 6 or w == 0 or w == 1:
if c <= 3 and c >= 0 and z != '自助放款':
list1.append(i)
list1.append(j)
list2.append(e)
list3.append(i)
list4.append(j)
elif w == 2 or w == 3 or w == 4:
if c <= 5 and c >= 0 and z != '自助放款':
list1.append(i)
list1.append(j)
list2.append(e)
list3.append(i)
list4.append(j)
elif w == 5:
if c <= 4 and c >= 0 and z != '自助放款':
list1.append(i)
list1.append(j)
list2.append(e)
list3.append(i)
list4.append(j)
same = [x for x in list3 if x in list4]
same = list(set(same))
if len(same) > 0:
dfs = dfx.loc[same]
same_m = sum(dfs['貸款金額'])
list1 = list(set(list1))
df11 = dfx.loc[list1]
if len(df11) > 0:
df11 = df11.reset_index(drop = True)
for i in range(0,len(df11)):
if df11['貸款結(jié)清日期'][i] in list2:
list11.append(df11['貸款金額'][i])
else:
list22.append(df11['貸款金額'][i])
m1 = sum(list11)
m2 = sum(list22)+same_m
mm = min(m1,m2)
m = m + mm
m = m + m_zq
這里的核心代碼主要是三個(gè)工作日還舊借新,在計(jì)算三個(gè)工作日時(shí),要考慮到星期六、星期日和公共節(jié)假日等情況。首先,通過chinese_calendar庫(kù)中的is_holiday()函數(shù),判斷貸款結(jié)清日期與貸款發(fā)放日期之間是否存在公共節(jié)假日,若存在,則需要在“貸款發(fā)放日期”減去“貸款結(jié)清日期”差值的基礎(chǔ)上剔除公共節(jié)假日的天數(shù);其次,通過weekday()函數(shù)判斷貸款結(jié)清日期與貸款發(fā)放日期之間是否存在星期六、星期日,若存在,則需要在“貸款發(fā)放日期”減去“貸款結(jié)清日期”差值的基礎(chǔ)上剔除星期六、星期日的天數(shù)。
5.將變量m的值與表2上報(bào)人民銀行許*的總金額96萬元進(jìn)行比對(duì),查看金額是否一致。若上報(bào)人民銀行的金額小于或等于符合延期政策的金額,則提取出對(duì)應(yīng)“客戶名稱”的大臺(tái)賬;若上報(bào)人民銀行的金額大于符合延期政策的金額,則提取出對(duì)應(yīng)“客戶名稱”的小臺(tái)賬,代碼如下:
if m >= a:
listy.append(df11)
listy.append(df33)
else:
listn.append(df2)
if len (listy) > 0:
dfy = pd.concat(listy)
dfy.to_excel('比中臺(tái)賬.xls')
if len(listn) > 0:
dfn = pd.concat(listn)
dfn.to_excel('未比中臺(tái)賬.xls')
證件號(hào)碼的尾號(hào)為14、31的兩個(gè)貸款臺(tái)賬符合延期政策,經(jīng)過程序計(jì)算,變量m的值為960,000。與表2上報(bào)人民銀行許*的總金額96萬元進(jìn)行比對(duì),發(fā)現(xiàn)完全一致。存儲(chǔ)為大臺(tái)賬格式,如表5所示。
三、輸出結(jié)果分析
通過上述代碼對(duì)***商業(yè)銀行的37萬余條大臺(tái)賬數(shù)據(jù)、4000余條小臺(tái)賬數(shù)據(jù)進(jìn)行比對(duì)篩選,最終導(dǎo)出比中臺(tái)賬與未比中臺(tái)賬,并對(duì)輸出的結(jié)果進(jìn)行分析。
(一)比中臺(tái)賬分析
比中臺(tái)賬為大臺(tái)賬格式,通過Excel的篩選功能查看比中的臺(tái)賬是否存在逾期(不良)貸款、消費(fèi)類貸款。
根據(jù)兩項(xiàng)直達(dá)政策的規(guī)定,逾期(不良)貸款、消費(fèi)類貸款不能領(lǐng)取補(bǔ)貼。通過篩選,發(fā)現(xiàn)所有比中的臺(tái)賬不存在逾期貸款、消費(fèi)類貸款。
(二)未比中臺(tái)賬分析
未比中臺(tái)賬為小臺(tái)賬格式,將未比中臺(tái)賬中的客戶名稱逐一代入大臺(tái)賬,分析未比中原因。
共有兩個(gè)客戶的臺(tái)賬未比中,分別是董**,王**。結(jié)合董**與王**的大小臺(tái)賬數(shù)據(jù)進(jìn)行分析,未比中的原因如下。
1.多報(bào)金額。從董**的大臺(tái)賬可以看出,董**符合延期政策的貸款金額為308萬元(如表6所示),而上報(bào)人民銀行的臺(tái)賬為520萬元,多報(bào)了212萬元(如表7所示)。
2.結(jié)清與發(fā)放日期不符合三個(gè)工作日換舊借新。從王**的大臺(tái)賬可以看出(如表8所示),王**的貸款結(jié)清日期與貸款發(fā)放日期不符合三個(gè)工作日換舊借新,沒有符合延期政策的貸款,而上報(bào)人民銀行的臺(tái)賬為60萬元,多報(bào)了60萬元(如表9所示)。
四、總結(jié)
兩項(xiàng)直達(dá)延期政策審計(jì)涉及的審計(jì)數(shù)據(jù)量龐大、審計(jì)模型復(fù)雜,以文中***商業(yè)銀行的審計(jì)項(xiàng)目為例,傳統(tǒng)的審計(jì)方法只能通過人工方式對(duì)小臺(tái)賬進(jìn)行逐一核實(shí)。經(jīng)過測(cè)算,核實(shí)一條臺(tái)賬的平均時(shí)間大約為2分鐘,假設(shè)審計(jì)人員每天工作8小時(shí),需要16天的時(shí)間才能完成。在實(shí)際的審計(jì)項(xiàng)目中,往往只能通過抽查的方式進(jìn)行審計(jì)。而通過Python進(jìn)行處理,可以實(shí)現(xiàn)審計(jì)的全覆蓋,1個(gè)小時(shí)以內(nèi)即可完成核實(shí)工作,極大地縮減了審計(jì)時(shí)間,提升了審計(jì)結(jié)果的準(zhǔn)確性。
兩項(xiàng)直達(dá)延期政策的原始數(shù)據(jù)是商業(yè)銀行的貸款臺(tái)賬,其數(shù)據(jù)比較規(guī)整、格式基本一致,非常適合運(yùn)用Python進(jìn)行數(shù)據(jù)分析。在本次審計(jì)分析完成后,可以將代碼進(jìn)行保存,在下一次兩項(xiàng)直達(dá)延期政策審計(jì)中稍加修改就可以直接使用,有著極高的可延續(xù)性和可重復(fù)性。
(作者單位:中國(guó)人民銀行連云港市中心支行,郵政編碼:222000,電子郵箱:271769150@qq.com)