吳 寧
(中國鐵路信息技術(shù)中心,北京 100844)
鐵路資金管理系統(tǒng)中利息計算算法的設(shè)計與實現(xiàn)
吳 寧
(中國鐵路信息技術(shù)中心,北京 100844)
針對現(xiàn)有鐵路資金管理籌投資系統(tǒng)中利息計算不準確的問題,本文在利息手工計算方法的基礎(chǔ)上,優(yōu)化并詳細介紹了涵蓋各種利息計算場景的一套綜合算法,主要包括算法原理、算法設(shè)計和實現(xiàn)。經(jīng)過大量真實財務(wù)數(shù)據(jù)的驗證測試,新的利息結(jié)付功能模塊能夠得到準確的計息數(shù)據(jù)。
籌資;算法;利息
隨著鐵路建設(shè)發(fā)展,各類在建、運營項目的資金管理變得日益重要。具體來講,資金管理主要包括對外籌資/投資、對內(nèi)資金調(diào)劑、資金結(jié)算等活動。其中,籌/投資管理主要包括資金提款、資金還款及利息結(jié)付3個方面。由于算法漏洞,當前籌投資系統(tǒng)中的利息結(jié)付模塊始終存在計算結(jié)果不準確的問題,為了從繁重的人工計息勞動中解放出來,業(yè)務(wù)部門迫切需要對利息結(jié)付模塊進行重構(gòu)。
1.1 業(yè)務(wù)需求分析
對鐵路項目資金籌集業(yè)務(wù)的管理是以對籌資合同的簽訂和履行為管理標的,依據(jù)籌資合同約定的日期和金額,執(zhí)行實際的本金提款和本金還款業(yè)務(wù);同時,資金籌集部門需在合同期內(nèi)每個約定的結(jié)息日期,針對實際持有本金進行計息、付息。本文所述利息計息算法即是完成在特定結(jié)息日期,每個籌資合同應(yīng)付的當期利息數(shù)額的計算。
1.2 算法要素分析
準確、便捷地獲得利息計算結(jié)果,需要從利息計算關(guān)鍵要素及其關(guān)聯(lián)入手。
當期應(yīng)結(jié)利息 = 結(jié)算區(qū)間×本金×利率
結(jié)息區(qū)間:其取值完全取決于籌資合同指定的結(jié)息日期或方式,通常有按季結(jié)息、按年結(jié)息等,結(jié)息區(qū)間與當期應(yīng)結(jié)利息可視為簡單的正比例關(guān)系。
本金:當期應(yīng)結(jié)利息除了與結(jié)息區(qū)間首日的歷史提款余額有關(guān),還與結(jié)息區(qū)間期間是否發(fā)生提還款及其金額有關(guān)。同時,提還款具體發(fā)生的日期也會影響當期應(yīng)結(jié)利息的計算結(jié)果。
利率:利率的取值首先取決于央行在合同期內(nèi)有效的基準利率以及籌資合同內(nèi)約定的利息計算選用何種基準利率,如3年定期、5年定期等;其次取決于在央行基準利率發(fā)生調(diào)整時,合同約定的利率調(diào)整方式,如隨央行調(diào)整,還是在固定的一個或幾個日期調(diào)整;最后,對于浮動利率計息,還要考慮其具體浮動方式,如按百分比浮動,還是按點數(shù)浮動。
由此可見,如果按照影響利息計算結(jié)果的各關(guān)鍵要素進行排列組合的話,將會有多達數(shù)百種利息計算場景和對應(yīng)算法。在實際的項目開發(fā)中,這會造成大量冗余代碼和項目延期,為日后的項目維護升級也帶來隱患。
2.1 算法原理
利息算法通過將結(jié)息區(qū)間層層細分,直至利息計算中的各關(guān)鍵要素為定量,再據(jù)此給出涵蓋全部利息場景的綜合算法,算法設(shè)計原理如圖1所示。

圖1 利息計算算法設(shè)計原理圖
結(jié)息區(qū)間由兩個日期,即區(qū)間兩端的日期確定,該日期由合同約定,一般具有約定俗成的規(guī)律性。如合同約定按季結(jié)息,則每年有4次結(jié)息,結(jié)息區(qū)間分別為每年的12月21日~3月20日、3月21日~6月20日、6月21日~9月20日、9月21日~12月20日;在確定的結(jié)息區(qū)間內(nèi),利率未必確定,如果央行利率發(fā)生調(diào)整,還要依據(jù)合同約定的調(diào)整方式和日期,進一步將結(jié)息區(qū)間細分為利率區(qū)間,在利率區(qū)間內(nèi)利率是固定不變的;但在利率確定的區(qū)間如果發(fā)生提還款業(yè)務(wù),則計息本金金額會發(fā)生變化,因此需依據(jù)提還款日期將利率區(qū)間進一步細分為提款區(qū)間和還款區(qū)間,在這些提/還款區(qū)間及首日本金余額區(qū)間內(nèi),諸如本金、利率和區(qū)間起止日期,這些基本的利息計算要素都是確定已知的。
2.2 算法比較
本文提出對任一結(jié)息區(qū)間計算利息優(yōu)化算法:
傳統(tǒng)手工計算任一結(jié)息區(qū)間利息的算法:
傳統(tǒng)算法以提款/還款發(fā)生的日期作為劃分每個利息塊 k 分界,含頭不含尾。在計算每個利息塊 k 時:(1)都要通過利率區(qū)間首日本金余額加/減本利息塊k首日及首日之前發(fā)生的所有提款/還款金額,以獲得該利息塊 k 的計息本金金額,這就需要頻繁訪問數(shù)據(jù)庫內(nèi)的提還款數(shù)據(jù),或者開辟緩沖內(nèi)存保存本利息塊首末日期間發(fā)生的提還款數(shù)據(jù),用以該利息塊 k 計算利息時循環(huán)調(diào)用;(2)利息塊k的計息起止日期也要通過頻繁循環(huán)訪問數(shù)據(jù)庫內(nèi)提款/還款日期來獲得。即在計算每個利息塊時,本金金額和起止日期都要重新計算、更新。
相對于傳統(tǒng)算法每個利息塊 k 利息的計算都要頻繁計算更新利息要素參數(shù)相反,本文所提算法,每個計息區(qū)間的要素參數(shù)可通過對數(shù)據(jù)庫內(nèi)基本數(shù)據(jù)直接提取應(yīng)用,無需二次轉(zhuǎn)化計算和邏輯判斷控制,就可進行利息計算。例如:所有計息區(qū)間的末日相同,直接采用利率區(qū)間的末日,即利率調(diào)整日;計息的首日則分別直接采用利率區(qū)間首日、提款日或還款日。所有計息區(qū)間的本金金額的計算,除首日本金余額區(qū)間的本金余額需要提取庫內(nèi)區(qū)間首日之前的提還款數(shù)據(jù)計算獲得,其他計息區(qū)間的本金金額直接采用提款、還款金額即可。作為基本的利息計算要素,這些都是籌投資合同數(shù)據(jù)庫內(nèi)已有的基本數(shù)據(jù)。連同利率調(diào)整方式、一年天數(shù)等其他利息計算要素,都以籌資合同號為關(guān)鍵字保存在數(shù)據(jù)庫內(nèi)。直接提取庫內(nèi)已有數(shù)據(jù),極大地簡化了算法的邏輯難度。
2.3 算法設(shè)計與實現(xiàn)難點
2.3.1 算法設(shè)計
按照利息計算中結(jié)息區(qū)間的細分過程,本文算法設(shè)計了5個功能模塊,逐層調(diào)用下層模塊并傳遞已經(jīng)確定的利息計算要素參數(shù),底層模塊借以計算最小提/還款區(qū)間的應(yīng)結(jié)利息并對這些計息區(qū)間的應(yīng)結(jié)利息累加求和,獲得對應(yīng)利率區(qū)間的應(yīng)結(jié)利息,進一步對利率區(qū)間的應(yīng)結(jié)利息累加求和,即可獲得當期結(jié)息區(qū)間的應(yīng)結(jié)利息,向頂層模塊返回利息計算結(jié)果。利息計算算法流程如2所示。

圖2 利息計算算法流程框圖
2.3.2 算法實現(xiàn)難點
計息區(qū)間年化的算法:每個計息區(qū)間由首末日期確定,要根據(jù)年利率計算利息,還要將該區(qū)間折算成“年”。目前,業(yè)務(wù)上普遍有兩種年化方法:積數(shù)計息法和逐筆計息法。積數(shù)計息相對簡單,計息區(qū)間年化值 = 實際包含天數(shù)/合同約定的一年天數(shù);逐筆計息采用業(yè)內(nèi)約定俗成的滿月按月的規(guī)則進行年化,例如,計息區(qū)間始末日期為3月30日和6月20日,則滿月為3月30日~4月29日~5月29日,共計2個月,天數(shù)為5月30日~6月20日,共計22天。因此,年化值 = 2/12+22/約定一年天數(shù)。
由于在實際業(yè)務(wù)中,存在計息區(qū)間的起止日期并非完全具有規(guī)律性、每月實際天數(shù)有差異以及計息區(qū)間跨年等多種可能,因此在區(qū)間年化的算法實現(xiàn)上要全面考慮各種特殊情況。另外,依據(jù)本文利息算法,每個計息區(qū)間從有效本金發(fā)生日開始,截止日相同,再根據(jù)發(fā)生金額是提款,還是還款相應(yīng)進行利息累加或累減,即先進再退;而傳統(tǒng)算法的每個計息區(qū)間則是從本金變化日開始,截止日為下一個本金變化日,而后進行利息累加,即逐步前進。本文算法在簡化的同時,也會造成年化值計算結(jié)果與傳統(tǒng)手工算法的年化值結(jié)果發(fā)生偏差。因此,在區(qū)間年化算法上也要考慮這種情況,予以更正。
2.4 算法實現(xiàn)
為了與既有資金管理系統(tǒng)更好地集成,本文算法在J2EE平臺上采用 Struts開發(fā)框架實現(xiàn),開發(fā)環(huán)境采用Myeclipse 8.5 + JDK 1.6 + Java。 前臺采用B/S模式訪問,用戶只需要輸入合同號,算法即可利用該借款合同在庫內(nèi)已有的要素數(shù)據(jù),計算并返回當期應(yīng)結(jié)利息。數(shù)據(jù)庫采用Oracle 10g,在現(xiàn)有數(shù)據(jù)庫基礎(chǔ)上,新建相關(guān)數(shù)據(jù)表,并維護央行基準利率等初始數(shù)據(jù),為算法的運行建立基本的數(shù)據(jù)環(huán)境。
項目發(fā)布前,針對業(yè)務(wù)部門提供的數(shù)百個真實籌資合同的財務(wù)數(shù)據(jù),進行了全面的測試。合同涵蓋了固定利率合同、浮動利率合同中各種典型的利息計算場景,重點測試了浮動利率合同中利率隨央行實時調(diào)整和利率在每年中指定的若干個日期調(diào)整兩種情況。本文算法的利息計算結(jié)果與實際財務(wù)付息數(shù)據(jù)完全一致,滿足了實際應(yīng)用的要求。相關(guān)細節(jié)功能還需要在投入使用的過程中進一步細化完善。
[1] 程 杰.大話設(shè)計模式[M].北京:清華大學出版社,2009.
[2] 楊春暉.系統(tǒng)架構(gòu)設(shè)計師[M].北京:清華大學出版社,2012.
[3] 石連運.新編企業(yè)財務(wù)管理[M].濟南: 山東大學出版社,1996.
[4] 鐵道部資金清算中心.資金管理系統(tǒng)操作說明書[S].北京:鐵道部資金清算中心,2006.
責任編輯 徐侃春
Interest computing algorithm in Railway Capital Management System
WU Ning
( China Railway Information Technology Center,Beijing 100844,China)
Aimed at the incorrect problem for the interest computing in the present Railway Capital Management System,this article put forward a comprehensive interest computing algorithm based on manual interest computing manner which could include nearly all kinds of interest computing occasions,given detail description on the principle,the design and implementation of the algorithm.After being tested and verifed by large amounts of factual accountant data,the new interest computing function module could be used to get absolutely accurate interest payment result.
fund raise;algorithm;interest
U29∶TP39
A
1005-8451(2016)01-0017-03
2015-04-23
吳 寧,工程師。