LoginSignup
0
1

【Python】外貨定期預金のシュミレーション(積立なし)

Last updated at Posted at 2024-05-01

Pythonを使って、外貨定期預金のシュミレーションをしてみる

  • 目的はまとまった金額(円)を外貨定期預金(豪ドル)で運用する際のリスクを把握
  • 定期、非定期に関わらず積立はしない前提
  • 終価係数ベースでのシュミレーション
  • 源泉分離課税 20.315% =(国税 15% + 地方税 5% + 復興特別所得税 0.315)の税率が適用
  • 為替差益に対する課税は未処理
  • 三井住友信託銀行の外貨定期預金シュミレーションと同じ結果になることを確認
  • 基本上記サイトで事足りてしまう。が、為替シュミレーションが±5円の幅までしか確認できない。このコードであれば自由に幅を設定出来るので、より為替損益のリスクが把握しやすい
  • 5年で運用していれば、10円、20円変動することは十分あり得る

環境

  • MacOS : Sonoma 14.4.1
  • python : 3.12.0

ポイント

  • 後でモジュールとして使えるようにクラス化
  • if_name__ = 'main' を使ってスクリプトファイルとして実行できるようにした
  • python的には難しいことは何もやってない😅
  • お金の計算なので、Decimalモジュールを使用
  • こういうものを簡単に自作できちゃうPythonってめっちゃステキ!❤️

実行結果

simulation.png

コード

gaika_teiki_yokin.py
# -*- coding: utf-8 -*-

from decimal import *


class GaikaTeikiYokin:
    def __init__(self):
        self.present_value = None
        self.interest_rate = None
        self.tts_rate = None
        self.ttb_simulation = None
        self.term = None
        self.tax_kokuzei = None
        self.tax_chihouzei = None

    def terminal_value_coefficient(self):
        """終価係数"""
        return Decimal(
               (Decimal("1") + Decimal(self.interest_rate)) ** Decimal(self.term)
               ).quantize(Decimal(".001"), rounding=ROUND_HALF_UP)

    def aud_current_value(self):
        """現在価値(豪ドル)"""
        return Decimal(
               Decimal(self.present_value) / Decimal(self.tts_rate)
               ).quantize(Decimal(".01"), rounding=ROUND_UP)

    def aud_future_value(self, aud_current_value, terminal_value_coefficient):
        """将来価値(豪ドル)"""
        return Decimal(aud_current_value) * Decimal(terminal_value_coefficient)

    def aud_interest_amout(self, aud_future_value, aud_current_value):
        """利息(税引前) = 将来価値 - 現在価値"""
        return Decimal(
               Decimal(aud_future_value) - Decimal(aud_current_value)
               ).quantize(Decimal(".01"), rounding=ROUND_DOWN)

    def aud_interest_kokuzei(self, aud_interest_amout):
        """国税(豪ドル) = 利息(税引前)* 国税"""
        return Decimal(
               Decimal(aud_interest_amout) * (Decimal(self.tax_kokuzei))
               ).quantize(Decimal(".01"), rounding=ROUND_DOWN)

    def aud_interest_chihozei(self, aud_interest_amout):
        """地方税(豪ドル) = 利息(税引前)* 地方税"""
        return Decimal(
               Decimal(aud_interest_amout) * (Decimal(self.tax_chihouzei))
               ).quantize(Decimal(".01"), rounding=ROUND_DOWN)

    def aud_interest_amout_tax(self, aud_interest_amout, kokuzei, chihouzei):
        """利息(税引後) = 利息(税引前)- 国税 - 地方税"""
        return Decimal(aud_interest_amout) - Decimal(kokuzei) - Decimal(chihouzei)

    def aud_future_value_tax(self, aud_current_value, aud_interest_amout_tax):
        """将来価値(税引後) = 現在価値 + 利息(税引後)"""
        return Decimal(aud_current_value) + Decimal(aud_interest_amout_tax)

    # メイン関数
    def operation_simulation(self):
        """ 運用シュミレーション """
        tvc = self.terminal_value_coefficient()
        acv = self.aud_current_value()
        afv = self.aud_future_value(acv, tvc)
        aia = self.aud_interest_amout(afv, acv)
        kokuzei = self.aud_interest_kokuzei(aia)
        chihouzei = self.aud_interest_chihozei(aia)
        aiat = self.aud_interest_amout_tax(aia, kokuzei, chihouzei)
        afvt = self.aud_future_value_tax(acv, aiat)
        # pass
        print(
        f"""

【外貨定期預金】
運用シュミレーション結果

預入金          : {self.present_value:,} 円
利率            : {self.interest_rate:.2%}
期間            : {self.term} 年
TTS             : {self.tts_rate} 円

終価係数        : {tvc}
現在価値        : {acv:>11,.2f} AUD
将来価値(税引前): {afv:>11,.2f} AUD
利息(税引前)    : {aia:>11,.2f} AUD
国税(15.315%)  : {kokuzei:>11,.2f} AUD
地方税(5%)     : {chihouzei:>11,.2f} AUD
利息(税引後)    : {aiat:>11,.2f} AUD
将来価値(税引後): {afvt:>11,.2f} AUD

        """
        )


    def ttb_ex_simulation(self):
        """TTBのシュミレーション"""
        ttb_rate_list = []
        for i in self.ttb_simulation:
            ttb_rate_list.append(Decimal(self.tts_rate) + Decimal(i))
        return ttb_rate_list

    def jpn_future_value_list(self, ttb_rate_list, aud_future_value_tax):
        """TTBシュミレーションをベースにした税引後将来価値(円)"""
        jpn_fv_list = []
        for i in ttb_rate_list:
            jpn_fv_list.append(Decimal(aud_future_value_tax) * Decimal(i))
        return jpn_fv_list

    def jpn_diff_list(self, jpn_fv_list):
        """差額(税引後の為替損益)"""
        jpn_diff_list = []
        for i in jpn_fv_list:
            jpn_diff_list.append(Decimal(i) - Decimal(self.present_value))
        return jpn_diff_list

    def case_simulation(self, ttb_rate_list, jpn_fv_list, jpn_diff_list):
        """損益シュミレーション"""

        print("損益シュミレーション結果")
        print("")
        print(
            f"税引後将来価値(満期[{self.term}]年後) と 全体損益(為替差益に対する課税は未処理)"
        )
        for r, s, a, d in zip(
            ttb_rate_list, self.ttb_simulation, jpn_fv_list, jpn_diff_list
        ):
            print(
                f" ・TTB {r:>6.2f}({s:>3.0f})円の場合:{Decimal(Decimal(a).quantize(Decimal("1."), rounding=ROUND_DOWN)):>10,.0f}円, 損益:{Decimal(Decimal(d).quantize(Decimal("1."), rounding=ROUND_DOWN)):>10,.0f}"
            )
        print("")

    def pl_simulation(self):
        """損益シュミレーション"""
        tvc = self.terminal_value_coefficient()
        acv = self.aud_current_value()
        afv = self.aud_future_value(acv, tvc)
        aia = self.aud_interest_amout(afv, acv)
        kokuzei = self.aud_interest_kokuzei(aia)
        chihouzei = self.aud_interest_chihozei(aia)
        aiat = self.aud_interest_amout_tax(aia, kokuzei, chihouzei)
        afvt = self.aud_future_value_tax(acv, aiat)
        tes = self.ttb_ex_simulation()
        jfvl = self.jpn_future_value_list(tes, afvt)
        jdl = self.jpn_diff_list(jfvl)
        self.case_simulation(tes, jfvl, jdl)

if __name__ == ("__main__"):

    # 変数の定義
    gty = GaikaTeikiYokin()
    gty.present_value = 5_000_000
    gty.interest_rate = 0.037
    gty.tts_rate = 102.50
    gty.term = 4.68  # 三井住友信託銀行の外貨定期預金の5年定期の設定
    # gty.term = 5
    gty.tax_kokuzei = 0.15315
    gty.tax_chihouzei = 0.05
    gty.ttb_simulation = [-20.0, -15.0, -10.0, -5.0, 0.0, 5.0, 10.0, 15.0, 20.0]

    # 関数の実行
    gty.operation_simulation()
    gty.pl_simulation()

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1