AOYAMA Koji's PROGRAMMING BLOG

新NISAが始まるので積立計算ツールを作ってみた (資産運用)

2024/01/03

 今年から新NISAが始まりますね。 非課税の積立が長期間できるようになるということで自分向けというよりは自分の子供世代、新社会人世代向けに計算ツールを作ってみました。 もし年利が10%ならば、毎月2万円弱の積立を40年続ければなんと1億円貯まるようです!

積立計算ツール


 以下の「数値入力」のところで必要な数値を入力して[計算]を押下してみてください。 「計算結果」の中の緑色部分はスクロールしますので一番下まで確認してみてください。


数値入力


年数
年率% (少数可)

計算結果


使い方


 もう少し詳しく使い方を解説します。

目標金額から毎月積立額を求める


 まず本ツールは、40年かけて1億貯めるには?!というように、目標金額から毎月積立額を求めることができます。
 まず目標金額に金額を入力します。1億なら100,000,000ですね。100000000でも大丈夫です。老後に必要と言われている2000万円なら20,000,000か20000000です。
 続けて年数です。40年続けるつもりなら40、5年なら5と入力します。
 最後に年率です。こちらは投資対象の年率を予想して入力します。10%だと思えば10、5%なら5ですね。
 そして[計算]ボタンを押すと書き込まれる「計算結果」内の上の方に毎月積立額が表示されますのでご確認ください。 月々の遷移も表示されるので参考にしてください。

毎月積立額から期待値を求める


 毎月○円なら余裕があるので投資にまわした場合に期待される○年後の金額を知りたい、という場合にも本ツールは対応しています。
 まず最初にツール内の一番下にある目標金額毎月積立額のチェックボックスで毎月積立額を選びます。
 ツールの一番上の入力欄が毎月積立額に変わったことを確認して金額を入力します。2万円なら20,000あるいは20000です。1000円なら1000ですね。1,000でも大丈夫です。
 続けて年数です。40年続けるつもりなら40、5年なら5と入力します。
 最後に年率です。こちらは投資対象の年率を予想して入力します。10%だと思えば10、5%なら5ですね。
 そして[計算]ボタンを押すと書き込まれる「計算結果」内の一番下に、期待値として金額が表示されていますので、一番下までスクロールしてご確認ください。

クリップボードへコピー


 計算結果表示後に[クリップボードへコピー]を押下すると、テキストを別の場所にペーストできるようになります。 計算結果には今から投資して○年○月にいくらになっているという情報も入っているので、メモとして残し目標にするなどしていただけると良いと思います。
 なおうまく動かない場合は手動で全選択してコピーしてみてください。スマートフォンだとちょっと大変ですが。。

プログラミング解説


 プログラミングや計算方法などを少々解説します。

月数


 本ツールは年数指定から月々の計算をするので、年数から月数を求める必要があります。 こう書くとなんとなく仰々しいですが難しい話ではなく、単純に年数を12倍して求めます。 プログラムとしては以下の記載になります。
iMonths = iYears * 12;

年利(倍)


 まずパーセントで指定された年率○倍の形になるようにします。 そうしておいた方が計算しやすくなるためです。 パーセントは100倍された数値なので値を100で割る必要があります。 また、例えば10%なら元値+元値の10%の意味ですから、倍率にするには1を足す必要があります。数式としては
\(年利(倍) = 1 + \frac{年率(%)}{100}\)

になります。10%なら1.1倍ですね。

月利


 本ツールは月々の計算を行うため年利から月利を求める必要があります。○倍の形になっている前提で数式で表すと、
\(月利 = 年利^\frac{1}{12}\)

です。これは、月利の12乗が年利というところから、その逆算とする方がわかりやすいでしょう。
\(\because 年利 = 月利^{12} \)

 この一連のプログラムは以下になります。パーセントで表された年率(%)から一気に月利(倍)を求めています。 べき乗は Math.pow を使用して計算できます。
fMonthlyRate = Math.pow( 1.0 + fRatePercent/100.0 , 1.0/12.0 );

毎月積立額を求める


 月数月利目標金額から毎月積立額を求めるには、まず、毎月積立額から期待値を計算する数式を立てます。 まず初月は以下の式になります。まだ月利の影響は受けません。
\(初月期待値 = 毎月積立額\)

 続けて2ヶ月目は、初月分の金額だけが月利の影響を受けて以下の式になります。
\(2ヶ月目期待値 = 初月期待値 \times 月利 + 毎月積立額\)

 初月期待値=毎月積立額ですので、以下に変形できます。
\(2ヶ月目期待値 = 毎月積立額 \times 月利 + 毎月積立額\)

 同様に3ヶ月目は以下になります。前月期待値が月利倍されます。
\(3ヶ月目期待値 = 2ヶ月目期待値 \times 月利 + 毎月積立額\)

 ここから2ヶ月目期待値を展開して、
\(3ヶ月目期待値 = (毎月積立額 \times 月利 + 毎月積立額) \times 月利 + 毎月積立額\)

 更に展開して以下の形にすると、これを続けていくとどうなるかが見えてきます。
\(3ヶ月目期待値 = 毎月積立額 \times 月利^2 + 毎月積立額 \times 月利 + 毎月積立額\)

 これを最終的に月数まで続けると以下になります。
\(目標金額 = 毎月積立額 \times 月利^{月数-1} + 毎月積立額\times月利^{月数-2} + \cdots + 毎月積立額\times月利^2 + 毎月積立額\times月利 + 毎月積立額\)

 この式を変形して毎月積立額を求めますが、ちょっとした計算テクニックを使います。
 まず上記式を式①とします。 そして式①の両辺に月利乗算してみます。これを式②とします。
\(目標金額\times月利 = 毎月積立額\times月利^{月数} + 毎月積立額\times月利^{月数-1} + \cdots + 毎月積立額\times月利^3 + 毎月積立額\times月利^2 + 毎月積立額\times月利\)

 ここで式②から式①を減算してみます。 するとなんと右辺の項が色々と消えて以下のようにかなりスッキリしました!
\(目標金額\times月利 - 目標金額 = 毎月積立額\times月利^{月数} - 毎月積立額\)

左辺は「\(目標金額\times(月利-1)\)」、右辺は「\(毎月積立額\times(月利^{月数}-1)\)」と更にまとめることができるので、毎月積立額を求める形に変形すると以下の式になります。
\(毎月積立額 = 目標金額\times\frac{月利-1}{月利^{月数}-1}\)

 このプログラミングは以下になります。
fMonthlyInvestment = iGoal * (fMonthlyRate - 1.0) / ( Math.pow( fMonthlyRate , iMonths ) - 1.0 );
iMonthlyInvestment = Math.ceil( fMonthlyInvestment );

1円単位にする必要があるため、毎月積立額の少数版(fMonthlyInvestment)と整数版(iMonthlyInvestment)を用意して、少数として求められた結果を Math.ceil を用いて切り上げて整数化しています。

基本的な記号の解説


 数式をプログラミングするときに用いられている記号を少し解説します。 ()+-は数式と同じなのですが、掛け算と割り算には専用の記号を使うのですよね。 あと=の意味が若干違って、左辺の変数に右辺の計算結果を代入します。
=右辺の計算結果を左辺に代入
*乗算(\(\times)\)
/除算(\(\div)\)

変数名の解説


 変数名は自由につけて良いのですが、できるだけ意味を正確に表しているものが良いです。 また本ページでは整数と小数を混在させているので、整数少数化を区別できた方が良いと考えました。
 例えば iMonthsは本ページのプログラミングでは月数を表しています。最初のiはintegerの略で整数です。 つまりiMonthは月数を整数で表したものです。
 一方fMonthlyInvestmentは毎月積立額を表し、 最初のfはfloatの略で、浮動小数、要は少数です。 実際には毎月積立額は1円単位、つまり整数になりますが、そちらはiMonthlyInvestmentという整数の変数名にしています。 このiMonthlyInvestmentを求めるための計算は直前まで少数で行うので、 少数用の変数をfMonthlyInvestmentという別の名称で用意しました。

まとめ


 新NISAで、より長期間の投資が非課税でできるということで、 自分が長期間投資するのは年齢的になかなか難しいと思いましたが、 自分の子供世代向けにツールを作ってみました。 この結果を鑑みるとうまく行けば相当な節税ができそうですね。
 実際に投資をする場合は自己責任でお願いします。 特に例示の40年間ずっと年利10%維持は正直なところ非現実的かも知れません。 ただこう考えるとがありますよね!笑

補足

・今回使用しているプログラミング言語はWeb業界で一般的に使われる「JavaScript」です。
・実際のソースコードは本ページのソースをご確認ください。
・新NISAには投資できる金額に上限がありますが本ページのプログラムでは考慮していません。
・クリップボードへのコピーはiOSが13.4以上などある程度新しいブラウザである必要があります。
・各種計算は福利すなわち利得した分を再投資する前提です。
・毎月積立額を求める方法として等比数列の公式を使う方法もありますが、本ページではその公式を導き出す際に使用されるテクニックを使用してみました。
・プログラムで1を1.0、100を100.0と書いているところがありますが、これは計算結果を少数にするちょっとしたプログラミングテクニックです。例えば整数で1/12を計算すると0になってしまいますが少数なら 0.0833… になります。自動的に少数にしてくれる場合もありますがこうしておくとわかりやすいです
・「\(月利^{月数}-1\)」で除算するところでは「\((月利^{月数}-1) \ne 0\)」すなわち「\(月利 \ne 1\)」の前提が必要です。
・プログラミング言語によって使用する記号が違う場合があります。例えばpascalでの代入は=ではなく:=です。
・コンピュータの世界で少数を表す方法には固定小数浮動小数があり、前者は小数点以下の桁数を決める形で計算の実装は整数と同様になります。後者は有効桁数を決めて指数表記で計算するものです。現在のコンピュータの世界では浮動小数が主流だと思います。
・自分の子供が実際にこのツールを使ってくれるかはわかりません(汗
・数式表現にMathJaxを使用しております。ありがとうございます。
・(公開後)計算結果表示で12月が翌年0月になっていた不具合を修正しました。自分への忠告ですが「1月から12月」が「0から11」で表現されるので間違いやすく注意です。(いわちょさんご指摘ありがとうございます!)

カテゴリー:資産運用
Loading...
ピックアップ
Loading...
最新記事
Loading...
関連記事
Loading...