吳 寧
(中國鐵路信息技術中心,北京 100844)
鐵路資金管理系統(tǒng)中利息計算算法的設計與實現(xiàn)
吳 寧
(中國鐵路信息技術中心,北京 100844)
針對現(xiàn)有鐵路資金管理籌投資系統(tǒng)中利息計算不準確的問題,本文在利息手工計算方法的基礎上,優(yōu)化并詳細介紹了涵蓋各種利息計算場景的一套綜合算法,主要包括算法原理、算法設計和實現(xiàn)。經過大量真實財務數(shù)據(jù)的驗證測試,新的利息結付功能模塊能夠得到準確的計息數(shù)據(jù)。
籌資;算法;利息
隨著鐵路建設發(fā)展,各類在建、運營項目的資金管理變得日益重要。具體來講,資金管理主要包括對外籌資/投資、對內資金調劑、資金結算等活動。其中,籌/投資管理主要包括資金提款、資金還款及利息結付3個方面。由于算法漏洞,當前籌投資系統(tǒng)中的利息結付模塊始終存在計算結果不準確的問題,為了從繁重的人工計息勞動中解放出來,業(yè)務部門迫切需要對利息結付模塊進行重構。
1.1 業(yè)務需求分析
對鐵路項目資金籌集業(yè)務的管理是以對籌資合同的簽訂和履行為管理標的,依據(jù)籌資合同約定的日期和金額,執(zhí)行實際的本金提款和本金還款業(yè)務;同時,資金籌集部門需在合同期內每個約定的結息日期,針對實際持有本金進行計息、付息。本文所述利息計息算法即是完成在特定結息日期,每個籌資合同應付的當期利息數(shù)額的計算。
1.2 算法要素分析
準確、便捷地獲得利息計算結果,需要從利息計算關鍵要素及其關聯(lián)入手。
當期應結利息 = 結算區(qū)間×本金×利率
結息區(qū)間:其取值完全取決于籌資合同指定的結息日期或方式,通常有按季結息、按年結息等,結息區(qū)間與當期應結利息可視為簡單的正比例關系。
本金:當期應結利息除了與結息區(qū)間首日的歷史提款余額有關,還與結息區(qū)間期間是否發(fā)生提還款及其金額有關。同時,提還款具體發(fā)生的日期也會影響當期應結利息的計算結果。
利率:利率的取值首先取決于央行在合同期內有效的基準利率以及籌資合同內約定的利息計算選用何種基準利率,如3年定期、5年定期等;其次取決于在央行基準利率發(fā)生調整時,合同約定的利率調整方式,如隨央行調整,還是在固定的一個或幾個日期調整;最后,對于浮動利率計息,還要考慮其具體浮動方式,如按百分比浮動,還是按點數(shù)浮動。
由此可見,如果按照影響利息計算結果的各關鍵要素進行排列組合的話,將會有多達數(shù)百種利息計算場景和對應算法。在實際的項目開發(fā)中,這會造成大量冗余代碼和項目延期,為日后的項目維護升級也帶來隱患。
2.1 算法原理
利息算法通過將結息區(qū)間層層細分,直至利息計算中的各關鍵要素為定量,再據(jù)此給出涵蓋全部利息場景的綜合算法,算法設計原理如圖1所示。
圖1 利息計算算法設計原理圖
結息區(qū)間由兩個日期,即區(qū)間兩端的日期確定,該日期由合同約定,一般具有約定俗成的規(guī)律性。如合同約定按季結息,則每年有4次結息,結息區(qū)間分別為每年的12月21日~3月20日、3月21日~6月20日、6月21日~9月20日、9月21日~12月20日;在確定的結息區(qū)間內,利率未必確定,如果央行利率發(fā)生調整,還要依據(jù)合同約定的調整方式和日期,進一步將結息區(qū)間細分為利率區(qū)間,在利率區(qū)間內利率是固定不變的;但在利率確定的區(qū)間如果發(fā)生提還款業(yè)務,則計息本金金額會發(fā)生變化,因此需依據(jù)提還款日期將利率區(qū)間進一步細分為提款區(qū)間和還款區(qū)間,在這些提/還款區(qū)間及首日本金余額區(qū)間內,諸如本金、利率和區(qū)間起止日期,這些基本的利息計算要素都是確定已知的。
2.2 算法比較
本文提出對任一結息區(qū)間計算利息優(yōu)化算法:
傳統(tǒng)手工計算任一結息區(qū)間利息的算法:
傳統(tǒng)算法以提款/還款發(fā)生的日期作為劃分每個利息塊 k 分界,含頭不含尾。在計算每個利息塊 k 時:(1)都要通過利率區(qū)間首日本金余額加/減本利息塊k首日及首日之前發(fā)生的所有提款/還款金額,以獲得該利息塊 k 的計息本金金額,這就需要頻繁訪問數(shù)據(jù)庫內的提還款數(shù)據(jù),或者開辟緩沖內存保存本利息塊首末日期間發(fā)生的提還款數(shù)據(jù),用以該利息塊 k 計算利息時循環(huán)調用;(2)利息塊k的計息起止日期也要通過頻繁循環(huán)訪問數(shù)據(jù)庫內提款/還款日期來獲得。即在計算每個利息塊時,本金金額和起止日期都要重新計算、更新。
相對于傳統(tǒng)算法每個利息塊 k 利息的計算都要頻繁計算更新利息要素參數(shù)相反,本文所提算法,每個計息區(qū)間的要素參數(shù)可通過對數(shù)據(jù)庫內基本數(shù)據(jù)直接提取應用,無需二次轉化計算和邏輯判斷控制,就可進行利息計算。例如:所有計息區(qū)間的末日相同,直接采用利率區(qū)間的末日,即利率調整日;計息的首日則分別直接采用利率區(qū)間首日、提款日或還款日。所有計息區(qū)間的本金金額的計算,除首日本金余額區(qū)間的本金余額需要提取庫內區(qū)間首日之前的提還款數(shù)據(jù)計算獲得,其他計息區(qū)間的本金金額直接采用提款、還款金額即可。作為基本的利息計算要素,這些都是籌投資合同數(shù)據(jù)庫內已有的基本數(shù)據(jù)。連同利率調整方式、一年天數(shù)等其他利息計算要素,都以籌資合同號為關鍵字保存在數(shù)據(jù)庫內。直接提取庫內已有數(shù)據(jù),極大地簡化了算法的邏輯難度。
2.3 算法設計與實現(xiàn)難點
2.3.1 算法設計
按照利息計算中結息區(qū)間的細分過程,本文算法設計了5個功能模塊,逐層調用下層模塊并傳遞已經確定的利息計算要素參數(shù),底層模塊借以計算最小提/還款區(qū)間的應結利息并對這些計息區(qū)間的應結利息累加求和,獲得對應利率區(qū)間的應結利息,進一步對利率區(qū)間的應結利息累加求和,即可獲得當期結息區(qū)間的應結利息,向頂層模塊返回利息計算結果。利息計算算法流程如2所示。
圖2 利息計算算法流程框圖
2.3.2 算法實現(xiàn)難點
計息區(qū)間年化的算法:每個計息區(qū)間由首末日期確定,要根據(jù)年利率計算利息,還要將該區(qū)間折算成“年”。目前,業(yè)務上普遍有兩種年化方法:積數(shù)計息法和逐筆計息法。積數(shù)計息相對簡單,計息區(qū)間年化值 = 實際包含天數(shù)/合同約定的一年天數(shù);逐筆計息采用業(yè)內約定俗成的滿月按月的規(guī)則進行年化,例如,計息區(qū)間始末日期為3月30日和6月20日,則滿月為3月30日~4月29日~5月29日,共計2個月,天數(shù)為5月30日~6月20日,共計22天。因此,年化值 = 2/12+22/約定一年天數(shù)。
由于在實際業(yè)務中,存在計息區(qū)間的起止日期并非完全具有規(guī)律性、每月實際天數(shù)有差異以及計息區(qū)間跨年等多種可能,因此在區(qū)間年化的算法實現(xiàn)上要全面考慮各種特殊情況。另外,依據(jù)本文利息算法,每個計息區(qū)間從有效本金發(fā)生日開始,截止日相同,再根據(jù)發(fā)生金額是提款,還是還款相應進行利息累加或累減,即先進再退;而傳統(tǒng)算法的每個計息區(qū)間則是從本金變化日開始,截止日為下一個本金變化日,而后進行利息累加,即逐步前進。本文算法在簡化的同時,也會造成年化值計算結果與傳統(tǒng)手工算法的年化值結果發(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模式訪問,用戶只需要輸入合同號,算法即可利用該借款合同在庫內已有的要素數(shù)據(jù),計算并返回當期應結利息。數(shù)據(jù)庫采用Oracle 10g,在現(xiàn)有數(shù)據(jù)庫基礎上,新建相關數(shù)據(jù)表,并維護央行基準利率等初始數(shù)據(jù),為算法的運行建立基本的數(shù)據(jù)環(huán)境。
項目發(fā)布前,針對業(yè)務部門提供的數(shù)百個真實籌資合同的財務數(shù)據(jù),進行了全面的測試。合同涵蓋了固定利率合同、浮動利率合同中各種典型的利息計算場景,重點測試了浮動利率合同中利率隨央行實時調整和利率在每年中指定的若干個日期調整兩種情況。本文算法的利息計算結果與實際財務付息數(shù)據(jù)完全一致,滿足了實際應用的要求。相關細節(jié)功能還需要在投入使用的過程中進一步細化完善。
[1] 程 杰.大話設計模式[M].北京:清華大學出版社,2009.
[2] 楊春暉.系統(tǒng)架構設計師[M].北京:清華大學出版社,2012.
[3] 石連運.新編企業(yè)財務管理[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
吳 寧,工程師。