メタラーまとんがハイソにやらかすようです

東大理系修士卒JTBCエンジニアのハイソサイエティ(上流階級)な日常

ドル建て生命保険の解約返戻金を計算してLINEに通知する仕組みを作った!

ども!ファイナンシャルプランナー2級兼、AWS認定SAアソシエイトのまとんです。

最近、ドル建ての生命保険に加入したのですが、解約返戻金がよく分からないという課題がありました。

そこで、現在の解約返戻金を計算し、LINEに通知してくれる仕組みAWSを使って構築したので紹介します。

経緯:ドル建ての生命保険に入った

まとまったお金を銀行口座に預けておくのはもったいないと思い、思い切って生命保険に加入しました。

この生命保険には機能が二つあって、(1)終身生命保険の機能と、(2)資産運用の機能があります。

具体的には、

(1)僕が死んだときに嫁に死亡保険金が下りる。不慮の事故などの死亡リスクに備えられる。

(2)30年間、固定金利で運用される。ざっくり、30年後に2倍になり、老後資金に備えられる。

この生命保険は、毎月お金をコツコツと振り込むタイプではなく、最初に一気にドカンとお金を預けるタイプ(一時支払い)の生命保険です。

一時支払いを選んだ理由は、最初からまとまったお金で運用を始めた方が、運用のパフォーマンスが高くなるからです。

この保険は終身保険です。つまり、僕が死ぬまで、何歳でも保険が適用されます。

とはいえ、仮に僕が100歳まで生きていても、100歳で嫁が死亡保険金を受け取っても面白くないので、60歳くらいまで生きていたら、解約します。

そのとき、解約返戻金を受け取ることができます。

30年度に解約すれば、最初に預けたお金が、約2倍になって戻ってくるという保険です。老後の備えになりますね。

課題:運用益と為替の影響で難しい!

この保険の難しいところは、解約返戻金の計算です。

まず、この保険はドル建てです。

最初にお金を預ける際に、僕の円はドルに換金されて、保険会社がドルで運用します。

というのも、保険会社はドル国債をベースに運用するからです。(ドル国債金利が高いことから、この保険の固定金利が担保されています)

僕が保険に加入した日のドル円レートは、約106円でした。

なので、30年度に解約する際に円安になっていれば、例えば120円になっていれば、さらに13%ほど運用益を得られます。

逆に、30年後にガチの円高で、例えば70円になっていると、34%ほど減少してしまいます。ここにはリスクがあります。

 

要するに、この保険の解約返戻金は、

・固定金利で少しずつ増えていく分

・為替レートで変動する分

の二つが絡み合っているため、「解約返戻金は何円なの?」を見積もるのが難しいです。

さらに、保険会社は「今の返戻金額を知りたかったら電話でお問い合わせください」というスタンスです。

電話で聞くのはめんどくさい!自分で好きな時に調べたい!

というわけで、今回、解約返戻金をLINEに通知してくれるシステムを作りました。

作りたいもの

要件定義は以下の通り。

・現在の解約返戻金を、好きな時にLINEに通知してくれる

複利運用額を1日単位で計算する

今日のドル円為替レート終値)を反映する

こんな感じでLINEに通知させます。

f:id:highso:20190916232950j:plain

実装

アーキテクチャ

前回の記事で作った、「SORACOMのボタンを押したらLINEに通知する」仕組みをベースに使います。

為替レートはOANDA APIを使って取得します。

f:id:highso:20190908015747p:plain

詳細はこちらの記事からどうぞ。

highso.hatenablog.com

複利運用の近似曲線を算出

まず、複利運用額を計算します。

保険会社は、ざっくり「1年後には〇〇円、2年後には〇〇円、・・・、30年後には〇〇円」だけを教えてくれました。

このサンプル点を元に、近似曲線をPythonで算出しました。

f:id:highso:20190917000221p:plain

※これは、最初に約100万円を入金した場合の例。実際に入金した額とは異なります。

※※106円の日に入金しましたが、最初に手数料などで引かれるので、5~6年以内に解約するとマイナスとなります。

複利運用なので、指数関数(y = a * b ^ 年)で近似できると考えました。

近似曲線を求めるスクリプトはこちら。curve_fit()で簡単に近似できます。

import numpy as np

year = np.arange(1,31)

day = year * 365

henreikin = np.array([1年目の返戻金額, 2年目の返戻金額, ... , 30年目の返戻金額])

array_x = year

#array_x = day

array_y = henreikin

def nonlinear_fit(x,a,b):

    return a * np.power(b, x)

param, cov = curve_fit(nonlinear_fit, array_x, array_y)

param[0]にaの近似値が、param[1]にbの近似値が格納されます。

具体的には、

a = 8457.29004

b = 1.02936377

となりました。

これは単位を年とした場合なので、array_x = dayのコメントアウトを外して実行すると、一日単位での近似式が得られます。

一日単位で計算すると、

a = 8457.28972

b = 1.00007929

となりました。つまり、近似式は以下の通りです。

運用投資額(米ドル) = 8457.28972 * 1.00007929 ^ 運用期間(日)

これで、一日単位で運用額を計算することができるようになりました。

為替レートを計算してLINE通知するAWS Lambda関数

Lambda関数では以下のことをします。

  1. OANDA APIで今日のドル円為替レートを取得
  2. 保険を開始した日から現在日時までの日数を計算
  3. 近似曲線を使って、複利運用額のドルを計算
  4. ドルに、為替レートをかけて、円に換算
  5. LINE Notify APIを使って、LINEに通知
  6. このLambda関数を、SORACOMボタンを押したときに起動するよう設定

このうち、(1),(5),(6)は前回の記事で説明しているので、気になる方はそちらをご覧ください。

具体的には、以下のコードを書きました。太字の部分が、今回新たに加えた部分です。

import json
import sys
import urllib.parse
import urllib.request
import datetime
import os
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
from datetime import datetime as dt
from datetime import timedelta


# LINE notify API
LINE_TOKEN= '自分のアクセストークン'
LINE_NOTIFY_URL='https://notify-api.line.me/api/notify'

#OANDA API
access_token = '自分のアクセストークン'
api = API(access_token=access_token)

def get_USDJPY():
    params = {
        'count': 1,
        'granularity': 'D'
    }
    r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)
    api.request(r)

    data = []
    for raw in r.response['candles']:
        data.append({
            'time': raw['time'],
            'volume': raw['volume'],
            'o': raw['mid']['o'], #始値
            'h': raw['mid']['h'], #高値
            'l': raw['mid']['l'], #安値
            'c': raw['mid']['c'], #終値
        })
    print(data)

    #前日の終値
    date = dt.strptime(data[0]['time'][:19], '%Y-%m-%dT%H:%M:%S')
    date = date + timedelta(hours = 9)
    #print(date)
    exchange_rate = float(data[0]['c']) #USD-JPYレート
    msg1 = str(date.year) + '年' + str(date.month) + '月' + str(date.day) + '日'
    msg2 = 'USD-JPY終値: ' + str(exchange_rate) + '円'
    print(msg1)
    print(msg2)

    #日ごとの複利計算
    start_date = dt(year=2019, month=8, day=20) #保険開始日
    elapsed_time = date - start_date
    elapsed_day = elapsed_time.days
    msg3 = '経過日数: ' + str(elapsed_day) + '日'
    print(msg3)

    ## Y = a*b^X
    ## 解約返戻金(USD) = a*b^(経過日数)
    a = 8457.28972
    b = 1.00007929
    refund_USD = a * b ** elapsed_day
    exchange_fee = 0.5 #USDからJPYへの為替手数料(円)

    refund_JPY = refund_USD * (exchange_rate - exchange_fee)
    msg4 = '複利運用額: ' + str(round(refund_USD, 1)) +'ドル'
    msg5 = '解約返戻金: ' + str(round(refund_JPY, 1)) + '円'

    msgs = ' '.join([msg1, msg2, msg3, msg4, msg5])
    print(msgs)
    return msgs


    def send_line(msg):
        method = "POST"
        headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
        payload = {"message": msg}
        try:
            payload = urllib.parse.urlencode(payload).encode("utf-8")
            req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
            urllib.request.urlopen(req)
        except Exception as e:
            print ("Exception Error: ", e)
            sys.exit(1)

def lambda_handler(event, context):
    msg = get_USDJPY()
    send_line(msg)

デモ

f:id:highso:20190916233000j:plain

こんな感じで、僕と嫁とLINE Notifyのbotが入っているトークルーム「生命保険は今何円?」に、botが解約返戻金を通知してくれます。

今回は「SORACOMのボタンを押したときに通知する」という仕組みにしましたが、例えば「毎朝6時に通知」などとトリガーをかけても良いと思います。

今後

解約返戻金額をDynamoDBに毎日格納して、たまにグラフ化して振り返る仕組みを実装しようかなと思っています。

 

以上、メタラーまとんでした。

ではでは。

生命保険にまつわるファイナンシャル × IoT記事

1. ドル円為替レートをLINEに通知するハイソ投資ボタンを作った! Lambda, LINE Notify, OANDA, SORACOM

2. ドル建て生命保険の解約返戻金を計算してLINEに通知する仕組みを作った!

3. LINE Botに生命保険の解約返戻金を教えてもらえるようにした!Messaging API, Amazon API Gateway, Lambda

4. 投資の近況報告!!積み立てNISA、ドル建て生命保険、国内株式