返済スケジュールの計算と利息の検証
目標
貸出の返済スケジュールを2つの方式で自分で計算してみて、預金利息と税金、延滞利息、資産健全性分類と引当金まで、銀行の預金・融資の数字がどこから出るのかを、手で確認します。
なぜ重要なのか
銀行システムの要求事項の半分は、「この数字がなぜこう出るのか」です。元利均等返済は毎月払うお金が同じで、元金均等返済は毎月返す元金が同じです。同じ貸出なのに、総利息が違い、初月の返済額が違い、繰上返済のときに残る元金が違います。この違いを知らなければ、返済スケジュール画面のバグと正常動作を区別できません。
利息計算には慣行があります。月利は年利を12で割った値で、預金利息は日数を数えて365で割り、ウォン未満はどの段階でどう切り捨てるかが、会社ごとに決められています。このラボは、その慣行をこのラボのルールとして固定しておきます。実務では、そのルールは、自社の商品定義書にあります。ルールが違うと、数字が1ウォンずつずれ、その1ウォンが元帳の突合で見つかります。
延滞は、利息の問題であると同時に、分類の問題です。何日遅れたかによって、正常・要注意・固定に分かれ、その分類が、銀行が積まなければならない引当金を決めます。引当金は損益にすぐ反映されるので、分類1つがその四半期の業績を変えます。
このラボのルール
- 月利 = 年利 ÷ 12(丸めずにそのまま使います)。毎月の利息 = 直前の残高 × 月利で、ウォン未満四捨五入。
- 元利均等の月々の返済額は、
P × r ÷ (1 − (1 + r)^−n)をウォン未満四捨五入した値で、最後の月は残りの元金をすべて返します。 - 元金均等の月々の元金は、
P ÷ nの商(切り捨て)で、割り切れない余りは最後の月に付きます。 - 預金利息 = 元金 × 年利 × 日数 ÷ 365で、ウォン未満切り捨て。日数は、満期日から加入日を引いた日数です。所得税は利息の14%、地方所得税は所得税の10%で、どちらも10ウォン未満切り捨て。
- 延滞利息 = 延滞した回次の約定返済額 × (約定金利 + 3.0)% × 延滞日数 ÷ 365で、ウォン未満切り捨て。基準日は
2026-08-31で、未払いの回次の延滞日数は、基準日から返済日を引いた日数です。 - 健全性分類は、最も古い未払いの回次を基準に、0–29日は
NORMAL、30–89日はPRECAUTIONARY、90日以上はSUBSTANDARD。引当金の比率は、それぞれ1.0%、10.0%、20.0%で、引当金 = 残高 × 比率、ウォン未満切り捨て。
ステップ
- 右の例にあるジェネレーターを
/root/bank/make_loans.pyとして保存し、python3 make_loans.pyで実行してください。loans.csv(貸出6件)、payments.csv(返済32回次)、deposits.csv(預金3件)が作られます。 L001の元利均等返済スケジュールを、/root/bank/schedule_L001.csvにn,payment,interest,principal,balanceのヘッダーで360行書いてください。L002の元金均等返済スケジュールを、/root/bank/schedule_L002.csvに同じヘッダーで36行書いてください。L003を2つの方式の両方で計算し、/root/bank/compare_L003.txtにannuity_payment=、annuity_total_interest=、equal_first_payment=、equal_last_payment=、equal_total_interest=、interest_diff=の6行を書いてください。interest_diffは、元利均等の総利息から元金均等の総利息を引いた値です。- 預金3件の満期利息と税金を、
/root/bank/deposit_interest.csvにdep_id,principal,days,interest,income_tax,local_tax,netのヘッダーで書いてください。netは、元金に利息を足して、税金2つを引いた値です。 payments.csvから、遅れて払った、またはまだ払っていない回次を、/root/bank/overdue.csvにloan_id,seq,due_date,days_late,late_interestのヘッダーで書き、/root/bank/overdue.txtにoverdue_rows=、late_interest_total=、max_days_late=、max_loan=の4行を書いてください。- 貸出6件すべてを、
/root/bank/provision.csvにloan_id,days_overdue,class,outstanding,rate_pct,provisionのヘッダーで書き、/root/bank/provision.txtにtotal_outstanding=、total_provision=、substandard_count=の3行を書いてください。outstandingは、loans.csvのoutstanding_20260831です。 /root/bank/loan_report.mdに、## Repayment comparison(返済方式の比較)、## Deposit interest and tax(預金利息と税金)、## Overdue and classification(延滞と健全性分類)、## What the system must keep(システムに残すべきもの)の4つの節で報告書を書いてください。
参考
- Pythonで計算するほうが速いです。
csvモジュールで読み、datetime.date.fromisoformatで日付を引けば、日数が出ます。 - Pythonの
round()は、.5を偶数側に送ります。ウォン未満の四捨五入はint(x + 0.5)で、切り捨てはint(x)で行ってください。 - よくある間違い1: 月利を小数第4位で丸めてから始めてしまうことです。
L001の4.50 ÷ 12 = 0.00375を第4位までに縮めると、初月の利息から15,000ウォン変わり、0.0037を使うと、360か月の総利息が3,843,336ウォン足りなくなります。L002の7.50 ÷ 12 = 0.00625も第4位までに縮めると、初月の利息から1,500ウォン変わります。 - よくある間違い2: 延滞日数を、基準日ではなく今日の日付で数えてしまうことです。採点ツールは
2026-08-31基準です。 - よくある間違い3: 税金を利息の合計に1回だけかけてしまうことです。預金1件ごとに別々に計算し、別々に切り捨てます。
貸出・預金データを作る
右の例にあるジェネレーターを/root/bank/make_loans.pyとして保存し、python3 make_loans.pyで実行してください。loans.csv(貸出6件)、payments.csv(返済32回次)、deposits.csv(預金3件)が作られます。
ラボの案内にあるジェネレーターを/root/bank/make_loans.pyとして保存し、python3で実行してください。手で直すと、後のステップの数字がすべてずれます。
元利均等スケジュールを出す
L001の元利均等返済スケジュールを、/root/bank/schedule_L001.csvにn,payment,interest,principal,balanceのヘッダーで360行書いてください。
月利r = 4.50 ÷ 100 ÷ 12。返済額 = P × r ÷ (1 − (1 + r)^−360)をウォン未満四捨五入。毎月の利息 = 直前の残高 × rを四捨五入、元金 = 返済額 − 利息、最後の月は残りの残高すべて。int(x + 0.5)で四捨五入してください。
元金均等スケジュールを出す
L002の元金均等返済スケジュールを、/root/bank/schedule_L002.csvに同じヘッダーで36行書いてください。
月々の元金 = 30,000,000 // 36(切り捨て)。毎月の利息 = 直前の残高 × (7.50 ÷ 100 ÷ 12)を四捨五入。返済額 = 利息 + 元金。最後の月の元金は残りの残高すべてなので、余りの12ウォンがそこに付きます。
同じ貸出を2つの方式で比べる
L003を2つの方式の両方で計算し、/root/bank/compare_L003.txtにannuity_payment=、annuity_total_interest=、equal_first_payment=、equal_last_payment=、equal_total_interest=、interest_diff=の6行を書いてください。interest_diffは、元利均等の総利息から元金均等の総利息を引いた値です。
ステップ2・3の計算器を、L003(50,000,000・3.75%・36か月)にそのまま適用して、2つのスケジュールの利息の列を、それぞれ合計してください。元利均等のほうが大きくなります。
預金利息と源泉徴収税を計算する
預金3件の満期利息と税金を、/root/bank/deposit_interest.csvにdep_id,principal,days,interest,income_tax,local_tax,netのヘッダーで書いてください。netは、元金に利息を足して、税金2つを引いた値です。
days = 満期日 − 加入日(datetime.date同士を引くと.days)。interest = int(P × rate/100 × days/365)。income_tax = int(interest × 0.14)を10ウォン未満切り捨て、local_tax = その10%を10ウォン未満切り捨て。
延滞回次と延滞利息を計算する
payments.csvから、遅れて払った、またはまだ払っていない回次を、/root/bank/overdue.csvにloan_id,seq,due_date,days_late,late_interestのヘッダーで書き、/root/bank/overdue.txtにoverdue_rows=、late_interest_total=、max_days_late=、max_loan=の4行を書いてください。
paid_dateがあればpaid_date − due_date、なければ2026-08-31 − due_dateが延滞日数です。0以下は延滞ではありません。延滞利息 = int(amount_due × (rate + 3.0)/100 × days/365)。約定金利は、loans.csvから貸出ごとに持ってきてください。
健全性分類と引当金を算出する
貸出6件すべてを、/root/bank/provision.csvにloan_id,days_overdue,class,outstanding,rate_pct,provisionのヘッダーで書き、/root/bank/provision.txtにtotal_outstanding=、total_provision=、substandard_count=の3行を書いてください。outstandingは、loans.csvのoutstanding_20260831です。
貸出ごとに、paid_dateが空の回次のうち最も早いdue_dateを探して、2026-08-31から引いてください。未払いがなければ0日です。0–29はNORMAL、30–89はPRECAUTIONARY、90以上はSUBSTANDARD。引当金 = int(outstanding × 比率/100)。
預金・融資の検証報告書を書く
/root/bank/loan_report.mdに、## Repayment comparison(返済方式の比較)、## Deposit interest and tax(預金利息と税金)、## Overdue and classification(延滞と健全性分類)、## What the system must keep(システムに残すべきもの)の4つの節で報告書を書いてください。
taskの節の見出し4つ(バッククォートの中の英語の見出し、または括弧の中の日本語の見出しや、同じ意味の韓国語・中国語の見出し)を、それぞれ## で始まる1行で書いてください。返済方式の比較にはL003の総利息の差(interest_diff)を、預金の節には税率(tax rate)を、延滞の節にはSUBSTANDARDに落ちた貸出の番号すべてと引当金(provision)の合計を、数字で書いてください。