ローンの総費用(ローン)-例/計算アルゴリズム

少し前に、連邦法第353号が発効し、いわゆる「ローンの総費用(ローン)」(以下-CPM)に関する情報の開示を金融機関に要求しました。

この記事では(原則として金融部門の労働者にのみ適用されます)、CPMの計算例を挙げたいと思います。 おそらく誰かが役に立つでしょう。



重要! 少し前まで、議員は公式に変更を加えました。これは2014年9月1日にのみ施行されます。次のすべては新しい公式にのみ適しています。 この記事では、法律に基づくCPMの計算の技術的な実装のみを説明しています。



もっと重要! 以下の情報はすべて、ローンが1回の支払いで発行された場合、つまり、 借り手は一度お金を受け取り、所定の支払いスケジュールに従って返済が行われます。 このオプションは、発行されたローンの99%をカバーします(クレジットカードはカウントしません)。



実際、ここに獣があります:






用語の意味を理解する

UCSは、i、CWP、および数値100の3つの量の積として定義されます。使用されている用語と記号を分析しましょう。

  1. BP(基本期間)とは
    消費者信用(ローン)契約に基づくBPは、消費者信用(ローン)契約に基づく支払いのスケジュールで最も頻繁に発生する標準的な時間間隔です。 消費者ローン(ローン)契約に基づく支払いのスケジュールで、1年未満または1年に等しい支払いの間に時間間隔がない場合、BP-1年。

    実際、BPは支払い間の最も一般的な時間間隔です。 支払いスケジュールに繰り返しの時間間隔がなく、ロシア銀行によって別の手続きが確立されていない場合、その期間は標準期間に切り上げられたすべての期間の算術平均であるベース期間として認識されます。 標準の時間間隔は、日、月、年、および特定の日数または月数であり、1年の期間を超えません。 このようにして、PSUを定義できます。 支払いが毎月の場合、BP = 365/12〜= 30

  2. NWPとは何ですか(暦年の基本期間の数)
    法律の定義は非常にあいまいですが、私が理解しているように、これは1暦年に「適合する」基本期間の数です。

    • 月払いの標準支払いスケジュールの場合:NWP = 12
    • 四半期ごとの支払い:NWP = 4
    • 年に1回以下の支払い:NWP = 1
    • 支払いスケジュールが難しい場合:たとえば、最初の2回の支払いは四半期に1回、次に6回の支払いは1か月に1回、3回の支払いは1日1回、そして基本期間は1か月です。 NWP = 12(暦年は12 BP)。


  3. iとは(10進数形式で表される基本期間の金利)
    (少なくとも私には)理解することは不可能です。 おそらく、数iを決定することにはある程度の意味がありますが、この意味を直感的に理解することはできません。 iの検討方法-次のセクションで分析します。





私を数える方法

番号iの「物理的な」意味を理解しようとする後の試みに任せて、次の定義を与えます。

数iは、次の方程式を解くことによって計算されます。

ここで:





PSK計算アルゴリズム

着信データ:2つの配列。 キーはキャッシュフロー番号、値は支払日と支払額です。

発信データ:UCS値(数値)。

計算手順:
  1. NWP(基本期間の数)を計算します。 基本期間の数-365日間に該当する期間の数、つまり ChBP =床[365 / BP]。
  2. k回目の支払いごとに、DP k 、Q k 、E kを考慮します。
  3. 近似計算の方法では、小数点以下2桁までが考慮されます。
  4. NWP * i * 100を掛けます。


コード!

JavaScriptとVBAには既製のソリューションがあります(計算用のExcelファイルもあります)。

VBAとExcelを選ぶ理由
突然火災が発生し、2014年9月1日に何も機能しない場合、最も妥当なのは、少なくとも初めてCPMを計算できるように、契約の締結場所にエクセルプレートを送信することです。


例では、年間12%の割合で3か月間100,000ルーブルのローンのスケジュールを取ります。 発行日-2014年9月1日:
キー キャッシュフロー日 キャッシュフロー額
0 2014年9月1日 -100,000
1 2014年10月1日 34 002.21
2 11/01/2014 34 002.21
3 12/01/2014 34 002.21
Javascriptソリューション
コード
function psk() { //  -   var dates = [ new Date(2014, 8, 01), new Date(2014, 9, 01), new Date(2014, 10, 01), new Date(2014, 11, 01)]; //  -   var sum = [-100000, 34002.21, 34002.21, 34002.21 ]; var m = dates.length; //   //   bp bp=30; //     : var cbp = Math.round(365 / bp); //          -  var days = []; for (k = 0; k < m; k++) { days[k] = (dates[k] - dates[0]) / (24 * 60 * 60 * 1000); } //   Q    var e = []; var q = []; for (k = 0; k < m; k++) { e[k] = (days[k] % bp) / bp; q[k] = Math.floor(days[k] / bp); } //     0  i      s var i = 0; var x = 1; var x_m = 0; var s = 0.000001; while (x > 0) { x_m = x; x = 0; for (k = 0; k < m; k++) { x = x + sum[k] / ((1 + e[k] * i) * Math.pow(1 + i, q[k])); } i = i + s; } if (x > x_m) { i = i - s; } //  var psk = Math.floor(i * cbp * 100 * 1000) / 1000; //  alert(" = " + psk + " %"); }
      
      





jsfiddleのデモ: jsfiddle.net/exmmo/m5kbb0up/7



VBA + Excelソリューション
コード
列Aの2行目から始まるのは、キャッシュフローの日付です。

列Bでは、2行目からキャッシュフローの量が始まります。

 Sub psk() Dim dates() Columns("A:A").Select dates() = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp))) Dim summa() Columns("B:B").Select summa = Application.Transpose(Range(ActiveCell, Cells(Rows.count, ActiveCell.Column).End(xlUp))) Dim m As Integer m = UBound(dates) bp = 30 cbp = Round(365 / bp) ReDim Days(m) For k = 2 To m Days(k) = dates(k) - dates(2) Next ReDim e(m) ReDim q(m) For k = 2 To m q(k) = Days(k) \ bp e(k) = (Days(k) Mod bp) / bp Next i = 0 x = 1 x_m = 0 s = 0.000001 Do While x > 0 x_m = x x = 0 For k = 2 To m x = x + summa(k) / ((1 + e(k) * i) * ((1 + i) ^ q(k))) Next i = i + s Loop If x > x_m Then i = i - s End If psk = Round(i * cbp, 5) Cells(3, 7).Value = psk End Sub
      
      





Excel + VBAのデモ: yadi.sk/i/oRTa8Id-a6UfV



おわりに

コードは完璧とはほど遠いもので、悲惨であると言う人もいるかもしれません。 たとえば、近似計算は、人類に知られている最も愚かな方法で実行されます。 理解して許してください、現在の状況では、提示可能なものを書くのに十分な時間がありません。 有罪、私はそれを修正します。



あなたがコメントを持っているか、間違いを見つけた場合-報告してください、私は感謝します。 最も危険なことは、法律のテキストの最初の誤った解釈です。



ユーザーフレンドリーな健全なインターフェースを備えたUPD オンライン計算機UCS



All Articles