Published Date : 2021年1月11日17:32

Part 1 - Pythonを使って複利による利息の計算をするアプリを作ろう
Part 1 - Create an app that calculates compound interest using Python


This blog has an English translation


ニコニコ動画にアップした動画のまとめ記事です。

This is a summary blog post about a video I uploaded to NicoNico.

細かい部分は動画を参考にしてください。

Please refer to the video for details.


目次

Table of Contents




① 動画の説明
① Video Description



警告:

このアプリは大雑把に大体の見積りを計算して楽しむ為のツールです。

計算の詳細や、端数の処理等は各金融機関等によって異なります。

このアプリを使って何かしらの損害が発生したとしても、私は一切の責任を負いません。

このアプリを使って何かしらの損害が発生したとしても、私は一切の責任を負いません。

Warning:

This application is used to calculate rough estimates and enjoy them.

The details of calculations and the treatment of fractions differ depending on the financial institution.

​I will not be liable for any damage caused by using this app.

軽く単利と複利について説明します。

I will briefly explain simple interest and compound interest.

単利は元金に対して利息が発生しますが、複利の場合は発生した利息と元金を合わせた金額に対して利息が発生します。

Simple interest accrues interest on the principal, but compound interest accrues interest on the total amount of the interest and the principal.

年月を追うごとに、複利は単利よりも多くの利息を生んでいきます。

Over time, compounded interest yields more interest than simple interest.

それではPythonを使って簡単な複利計算(毎月の積立)を行うアプリを作成していきましょう。

Let's build a simple app that calculate with compound interest (to incorporate a certain amount into the principal each month) using python.

ユーザーの入力が誤った数値であれば、アプリを途中で終了させたいので、sysモジュールをインポートしてexitメソッドを使用できるようにします。

If the user's input is incorrect, we want to stop the application in the middle, so we import the sys module to use the exit method.

import sys

まずは関数を定義して、次にユーザーからの入力部分を処理するスクリプトを作成します。

First you define a function, and then you write a script to handle the input from the user.

try/exceptionを使用して、もし文字等が入力されたら例外が発生するようにして、エラー内容を表示させてからexitメソッドを使用してアプリを終了させます。

Use try/exception to cause an exception if a character is entered, display the error, and then exit the application using the exit method.

def function():
    try:
        pass
    except:
        pass
if __name__ == "__main__":
    fuction()

年利、毎月の積立金、積立期間と積立年数を入力させます。

You will be asked to enter the annual interest rate, monthly reserve fund, reserve period and number of years.

まずは入力させる項目をあらかじめ決めて変数にしていきます。

First, you decide the items you want to input beforehand and make them variables.

try:
    年利 = 3 / 100
    初期金額 = 30 * 10000
    毎月の積立金 = 30 * 10000 
    積立年数 = 3
except:
    print('数値を入力してね')
    sys.exit()

利息を期初に組み込むか、期末に組み込むかを決定します。この利息を元本に組み込むタイミングによっては繰り入れ後の元金が少し変わってきます。

Determines whether interest is included at the beginning or end of a period. Depending on the timing to transfer this interest to the principal, the principal after the transfer will change a little.

利息の端数を切り捨てるか、四捨五入するか、切り上げるかを選択します。

Select the method for rounding the interest.

月ごとか、四半期ごとか、半年ごとにするか、年単位ごとに複利にするかを選択します。

Select monthly, quarterly, semiannual, or annually compounded.

利息を繰り越しを行う月を決めます。

Decide the month to carry over.

課税を利息を繰り入れた段階でするかどうかを決めます。

Determine whether to collect taxes when interest is transferred.

最初は値を固定してアプリのテストしたいので、あらかじめ入力をする処理を書いておいてからコメントアウトします。

First, I want to test the app with a fixed value, so I write the input process in advance and comment it out.

try:
    # 年利 = float(input('年利を入力(%) ')) / 100
    # 初期金額 = float(input('初期金額を入力(万円) ')) / 10000
    # 毎月の積立金 = float(input('毎月の積立年数を入力(万円) ')) / 10000
    # 積立年数 = float(input('積立年数(年) '))

    年利 = 3 / 100
    初期金額 = 30 * 10000
    毎月の積立金 = 30 * 10000 
    積立年数 = 3
except:
    print('数値を入力してね')
    sys.exit()

入力側の負担を減らしたいので、桁数を少なく入力できるようにしてから、本来の桁数に戻すような処理をさせます。

In order to reduce the burden on the input side, it is necessary to make it possible to input a smaller number of digits, and then to perform processing to return to the original number of digits.

ですが、好み等あると思うので、この処理は各自で自由に調整してください。

However, it depends on your preference, so please adjust this process by yourself.

後はスクリプトをコピペして、内容を少し編集するだけです。

All you have to do is copy and paste the script and edit it a little.

所得税(15%)に復興特別税(1 + 2.1%)を掛けて、それに住民税(5%)を加えた20.315%が利息に課税されて徴収されます。

The income tax (15%) is multiplied by the special reconstruction tax (1 + 2.1%), and the residential tax (5%) is added, as a result, 20.315% is levied on the interest and collected as tax.

利息を組み入れる時、期初か期末の場合でどのように元金に影響するかを見ていきましょう。

Let's look at the effect on principal when interest is included at the beginning or end of a period.

まず期初の場合は、前の月の元本の利息は課税されてから、次の月の最初に元本に組み入れられます。

First, In the case of at the beginning of a period, the interest on the principal for the previous month is taxed and then credited to the principal at the beginning of the next month.

課税される前の利息は後で最終的な課税額を求めるために、課税しないでそのまま別で利息合計として計上しておきます。

The untaxed interest is recorded separately as the total interest to determine the final tax amount.

そして、利息が組み入れられた月の積立金を含む合計額にまた利率を掛けて、次の月の利息分を計算します。

Then, the interest portion for the next month is calculated by multiplying the total amount including reserves for the month in which interest is included by the interest rate.

その利息分を先ほどの利息合計に加えます。これを繰り入れ月毎に繰り返します。

The interest is added to the total interest. Repeat this process for each additional month.

期末に利息を組み入れる場合は、単に前の月の利息分と組み越す月の利息分に税金を掛けてから次の月に繰り入れます。

If you incorporate interest at the end of a period, you simply multiply the interest portion of the previous month and the interest portion of the month you are incorporating into the next month by tax.

計算していけば分かりますが、期初の場合は利息が元本に繰り入れられるタイミングが早いので、その分利息が増えます。

You can understand if you calculate it, but in the case of the beginning of a period, the interest is transferred to the principal earlier, so the interest increases accordingly.

しかし、月毎に複利を元本に繰り入れる場合は、期初の場合は起点となる最初の月の前の月の利息はないので、どちらも同じ月に対して利息が組み入れられるので、全体としての利息は期初だろうが期末だろうが変わりませんのでご注意ください。

However, in the case of month-to-month compounding, since there is no interest in the month before the first month of interest at the beginning of a period, interest is included in the same month in both cases, so the total interest is the same whether it is at the beginning of a period or at the end of a period.

それでは積み立て期間や利率を月ごとに割って別の変数に入れていきましょう。

Now, let's put the term of the deposit and the interest rate in a different variable for each month.

そして、元本と税引き後利息や税引き後元金等の初期化を行っていきます。

Then, we initialize the principal, interest after tax and principal after tax.

実質利率も初期化します。

The real interest rate is also initialized.

実質利率について説明します。例えば年率3%での運用になっているとしましょう。

I will explain the real interest rate. Let's say you're managing your money at 3% a year.

この時、最終的な税引き後利息を最終的な元本で割ってやると、実質利率が計算できます。

The real interest rate can be calculated by dividing the final after-tax interest by the final principal.

利息に税金が課される時は実質利率は下がります。非課税の場合の実質利率は上がります。これは直観的にも理解できると思います。

When taxes are imposed on interest, the real interest rate is reduced. The real interest rate in the case of tax exemption increases. I think you can understand this intuitively.

税率は課税方式にする場合と非課税の場合とで変えられるようにしておきます。

The tax rate can be changed in the case of taxation or non-taxation.

そして初期金額と積立金を元金に入れて、繰り入れ後の元金にその元金を代入しておきます。

Then, you put the initial amount and reserve fund into the principal, and put the principal into the transferred principal.

計算結果を表示させる為に使用する文字列の変数を初期化します。

Initializes a string variable used to display the result of a calculation.

# 所得税(15%)に復興特別税(1 + 2.1%)を掛ける(15.315%) + 住民税(5%) = 20.315%
try:
    課税方式 = input('課税方式を非課税にする -> 1 複利毎課税にする -> 2 : ')
    # 課税方式 = '2'
except:
    print('指定した番号を入力してね')
    sys.exit()

積立期間月 = 積立年数 * 12

月利 = 年利 / 12
四半期複利 = 年利 / 4
半年利 = 年利 / 2

元金 = 0
繰り入れ後元金 = 0

利息 = 0
税引き後利息 = 0
税引き後元利合計 = 0

実質利率 = 0

税率 = 0

if 課税方式 == '2':
    税率 = 0.20315

税率 = (1 - 税率)

元金 = 初期金額 + 毎月の積立金
繰り入れ後元金 = 元金

結果 = ''


以上です。お疲れ様です。

That's all. Thank you for your hard work.

各自で創意工夫してもっと良いアプリに仕上げてください。

Please devise your own ideas and make it a better application.