シェルスクリプトで利息計算をやってみた


[Open USP Tukubai](https://github.com/usp-engineers-community/Open-usp-Tukubai)をインストールして、シェルスクリプトで借金の利息計算をやってみました。

利息の計算方法は、[利息の計算方法 - お金を借りる前に見る！消費者金融豆知識](https://www.bankrate.jp/dictionary/interest_rate/calculate.html)を参考にしました。

シェルで浮動小数の大小比較は[ここ](http://w.vmeta.jp/tdiary/20130618.html)を参考にした。

ユニケージの講習も受けたことないし（[このへん](https://uec.usp-lab.com/JOURNAL/CGI/JOURNAL.CGI?POMPA=LIST)に書いてあることは一応意識してみた）、シェルスクリプトも金融もあんまりよくわからない人なので間違ってたらコメントいただけるとありがたいです。

```bash
#!/bin/bash

#
# 利息計算
#
# Open USP Tukubai が必要
# https://github.com/usp-engineers-community/Open-usp-Tukubai
#
# 計算方法は以下のページを参考にした.
# https://www.bankrate.jp/dictionary/interest_rate/calculate.html
#

ganpon=300000         # 元本
nenri=18              # 年利(%)
monthly_hensai=20000  # 月あたりの返済額

: > ./tmp/ganpon_zandaka                                      # 元本残高ファイルを初期化
: > ./tmp/risoku                                              # 利息ファイルを初期化
: > ./tmp/ganpon_hensai                                       # 元本返済額ファイルを初期化

while [ 1 ]; do

if [ -s ./tmp/ganpon_zandaka ]; then                          # 元本残高ファイルが空でなければ
  ganpon=`tail -1 ./tmp/ganpon_zandaka`                       # 最後の行を変数に読み込み
fi

echo "scale=18; $ganpon * $nenri / 100 / 365 * 30" | bc >> ./tmp/risoku
month_risoku=`tail -1 ./tmp/risoku`
echo "scale=18; $monthly_hensai - $month_risoku" | bc >> ./tmp/ganpon_hensai
month_ganpon_hensai=`tail -1 ./tmp/ganpon_hensai`
echo "scale=18; $ganpon - $month_ganpon_hensai" | bc > ./tmp/current_ganpon_zandaka
current_ganpon_zandaka=`cat ./tmp/current_ganpon_zandaka`
siki="$current_ganpon_zandaka < 0"

if [ `echo $siki | bc` -eq 1 ]; then
  echo 0 >> ./tmp/ganpon_zandaka
  break;  # 現在の残高が0より小さければ終了
else
  echo $current_ganpon_zandaka >> ./tmp/ganpon_zandaka
fi

done

cat << END > ./tmp/header
返済回数 利息 元本返済額 元本残高
END

cat ./tmp/risoku | awk '{m+=$1}END{print "合計",m;}'       |  # 利息の合計を計算
marume 2.0 > ./tmp/risoku_sum                                 # 第2フィールドを整数に四捨五入

ycat ./tmp/risoku ./tmp/ganpon_hensai ./tmp/ganpon_zandaka |  # 利息,元本返済額,元本残高 を横結合
marume 1.0 2.0 3.0                                         |  # 第1,第2,第3フィールドを整数に四捨五入
rank > ./tmp/body                                             # 第1フィールドに回数を追加

cat ./tmp/header ./tmp/body ./tmp/risoku_sum               |  # ヘッダとボディを連結
keta                                                          # 桁揃え
```

ユニケージっぽいのは最後の数行くらいであとはただの下手なシェルスクリプトだな・・・。

元本30万円,年利18%,毎月1万円返済の場合の実行結果は以下のような感じで、元ネタのサイトにも「ちなみに、この場合だと返済回数は40回にも及びます。なんと、3年と4か月！」と書いてあるので、計算は（だいたい）あってそうです。

```
返済回数 利息 元本返済額 元本残高
       1 4438       5562   294438
       2 4356       5644   288794
       3 4273       5727   283067
       4 4188       5812   277255
       5 4102       5898   271357
       6 4015       5985   265371
       7 3926       6074   259297
       8 3836       6164   253134
       9 3745       6255   246879
      10 3652       6348   240531
      11 3559       6441   234089
      12 3463       6537   227553
      13 3367       6633   220919
      14 3268       6732   214188
      15 3169       6831   207356
      16 3068       6932   200424
      17 2965       7035   193389
      18 2861       7139   186250
      19 2755       7245   179006
      20 2648       7352   171654
      21 2540       7460   164194
      22 2429       7571   156623
      23 2317       7683   148940
      24 2203       7797   141144
      25 2088       7912   133232
      26 1971       8029   125203
      27 1852       8148   117055
      28 1732       8268   108787
      29 1609       8391   100396
      30 1485       8515    91882
      31 1359       8641    83241
      32 1232       8768    74473
      33 1102       8898    65574
      34  970       9030    56545
      35  837       9163    47381
      36  701       9299    38082
      37  563       9437    28645
      38  424       9576    19069
      39  282       9718     9351
      40  138       9862        0
```

ここまでやって「もしかしてクレジットカードのリボ払いの手数料ってめっちゃ高いのでは？」って気づいたので、自分の利息を計算してみます。
（利息の合計額計算はこの時点で追加しました）

EPOSカードの「月別お支払い予定額照会」からリボの残高を数えます。
なぜかリボの残高が表示されないので、表の「リボ」の列の合計額と「上記お支払後の残高」を足し合わせます。
残高258732円でした。この時点で嫌な予感しかしません。
手数料という名の利息は年利15%のようです。

元本258732円,年利15%,毎月10000円返済の結果です。

```
返済回数  利息 元本返済額 元本残高
       1  3190       6810   251922
       2  3106       6894   245028
       3  3021       6979   238049
       4  2935       7065   230983
       5  2848       7152   223831
       6  2760       7240   216591
       7  2670       7330   209261
       8  2580       7420   201841
       9  2488       7512   194329
      10  2396       7604   186725
      11  2302       7698   179027
      12  2207       7793   171235
      13  2111       7889   163346
      14  2014       7986   155360
      15  1915       8085   147275
      16  1816       8184   139091
      17  1715       8285   130805
      18  1613       8387   122418
      19  1509       8491   113927
      20  1405       8595   105332
      21  1299       8701    96631
      22  1191       8809    87822
      23  1083       8917    78905
      24   973       9027    69877
      25   862       9138    60739
      26   749       9251    51488
      27   635       9365    42123
      28   519       9481    32642
      29   402       9598    23044
      30   284       9716    13328
      31   164       9836     3493
      32    43       9957        0
    合計 54804
```

毎月の返済額を15000円に増やしてみると、

```
返済回数  利息 元本返済額 元本残高
       1  3190      11810   246922
       2  3044      11956   234966
       3  2897      12103   222863
       4  2748      12252   210611
       5  2597      12403   198207
       6  2444      12556   185651
       7  2289      12711   172940
       8  2132      12868   160072
       9  1973      13027   147045
      10  1813      13187   133858
      11  1650      13350   120508
      12  1486      13514   106994
      13  1319      13681    93313
      14  1150      13850    79464
      15   980      14020    65443
      16   807      14193    51250
      17   632      14368    36882
      18   455      14545    22337
      19   275      14725     7612
      20    94      14906        0
    合計 33974
```

なんと2万円以上減っています。

さらに毎月の返済額を20000円に増やしてみると、

```
返済回数  利息 元本返済額 元本残高
       1  3190      16810   241922
       2  2983      17017   224904
       3  2773      17227   207677
       4  2560      17440   190238
       5  2345      17655   172583
       6  2128      17872   154711
       7  1907      18093   136618
       8  1684      18316   118303
       9  1459      18541    99761
      10  1230      18770    80991
      11   999      19001    61989
      12   764      19236    42754
      13   527      19473    23281
      14   287      19713     3568
      15    44      19956        0
    合計 24880
```

更に1万円くらい減りました。

極めて当たり前のことが確認できただけですが、キャッシュに余裕があるときはガンガン返済してしまったほうが得なわけですね。