見出し画像

あなたは何歳から年金をもらいますか? ~ MATLAB で年金シミュレーション ~ datetime と datatip を使う


まえがき

2000年の改正で、老齢厚生年金の支給開始年齢がそれまでの60歳から65歳に引き上げられてしまいました。

いきなり変わるわけではなく、男性は2013~2025年、女性は2018~2030年にかけて行われ、昭和28年4月2日~昭和36年4月1日に生まれた男性、昭和33年4月2日~昭和41年4月1日に生まれた女性は、それぞれ支給開始時期が異なります。

(この期間に生まれた人は「特別支給の老齢厚生年金」制度に該当する場合があります。
 これは繰り下げで増えることはなく、時効でもらえなくなることもあるのでご注意を。)

また、これに伴い、60歳以降であれば請求によって年金の繰上げ受給ができるようになっています。


繰上げ・繰下げ受給

詳しくは日本年金機構のサイトをご覧ください。

年金の繰上げ・繰下げ受給


請求した日の翌月分から、年金が支給されます。
「~から」という指定はできません!

最大繰り上げると60歳の誕生日の翌月から受給できますが、月0.4%の割合で月々の支給額が減り、それが一生続きます

一旦請求すると、変更はできません

その代わり、60歳からもらえば5年間分先に現金が手に入ります。

しかし減額されているので、ある時点以降、65歳から受給した場合の方が総額が上回ることになります。

逆に65歳より繰り下げると、月0.7%の割合で月々の支給額が増えます。

なかなか悩ましいですね。

そこで検討用に、その損益分岐点・受領総額が分かるグラフを MATLAB で作ってみました。

もちろん計算すれば分かるのですが、計算間違えがあったり、結果の数字だけ見てもピンとこず、グラフで見た方がイメージが沸きやすいかと思います。

MathWorks の無料アカウントがあれば、MATLAB Online で実行ができます。

無料のスマホアプリ MATLAB Mobile でも動きますが、今回のはとてもやりづらいと思います。

個人向け MATLAB Home があれば、デスクトップで動きます。


実際は色々と細かい条件がありますが、下記の条件のみとしています。

減額率 = 0.4% × 繰上げ請求月から65歳に達する日の前月までの月数
増額率 = 0.7% × 65歳に達した月から繰下げ申出月の前月までの月数

その他は各自ご確認ください。
(昭和37年4月1日以前生まれの場合は減額率は0.5%、他の収入があった場合の減額等)

また、実際の支給額は毎年調整が入ります。
あくまでも目安としてご活用ください。


税金

調べ始める前は、

「いくらなんでも、年金から税金取るほど鬼畜じゃないだろ!」

と思っていました。

鬼畜でした。

65歳未満
 年額108万円以上(公的年金等控除60万円 + 基礎控除48万円)
65歳以上
 年額158万円以上(公的年金等控除110万円 + 基礎控除48万円)

の超過分は課税されます。

この辺りは、他の収入や自治体、扶養の有無等により細かく変わりますので、各自ご確認ください。

「年金 税金」で検索すれば色々出てきます。

また、65歳前にもらうと上記のように65歳までは控除額が減ります。しかし受給額が減るので、逆に65歳以上で非課税になる場合もあるかと思います。

その辺りも併せてご検討ください。


MATLAB シミュレーション

datetime 配列

まず時間軸ですが、「○年○ヶ月」とかで表示したいですよね。

その様な場合、datetime 配列が便利です。

年、月、日、時、分、秒の成分(ナノ秒精度)を持ち、時間に関する操作が簡単にできます。

今回、「時間」は不要で「年、月」だけあればよいので、例えば「60歳」を表す定数を以下のように宣言します。

>> t60 = datetime(60,1,1)

t60 = 

  datetime

   0060/01/01


ここから3年後は

>> t60 + calyears(3)

ans = 

  datetime

   0063/01/01

のように求まります。

「60歳から3ヶ月単位で1年後までの配列」は

>> t60:calmonths(3):t60+calyears(1)

ans = 

  1×5 の datetime 配列

   0060/01/01   0060/04/01   0060/07/01   0060/10/01   0061/01/01


のように生成できます。

「60歳から61歳3ヶ月(頭)までが何ヶ月間か」は以下のようにして求まります。

>> calmonths(between(t60,datetime(61,3,1)))

ans =

    14


あとは、例えば65歳から100歳までの累積受給額の配列を作っておき、各受給開始時からの累積額と大小比較して越える月のインデックス(crossPoint)を求めるだけで良いですね。

そのインデックスを datetime 配列に入れれば損益分岐点が、累積額配列に入れればその時点での累積受給額が表示できます。


datatip 関数

グラフにデータ点を表示する一番簡単な方法は datatip 関数(R2019b 以降)を用いることです。

座標(近くの座標でも良い)を入れれば、そこに任意のデータを表示することができます。

ただ datatip の場合は、ラベルとデータ自体は任意に設定できますが、単位とかはデータ任せです。

今回の場合であれば、「○年○月」という表示になります。

もうちょっとこだわって「○歳○ヶ月」にしたい場合は、最後にコメントアウトしてある部分のように text 関数を使って自前で表示させるとよいでしょう。

datetime 変数は通常であれば「○年○月」表示になりますが、Format プロパティを
 'yy歳MMヶ月'
とすることで、「○歳○ヶ月」表示に変えることができます。

michio inoue さんに datatip の表示フォーマット変更方法を教えて頂いたので、上記の通りスクリプトも修正しました。

年額表示も追加しました。

2024/02/26


MATLAB スクリプト

ライブスクリプトになっています。


ライブエディターでは、GUI だけ表示してコードを隠せるので、そのままアプリのように使用できて便利です。

ライブエディターでの表示


もちろん通常のスクリプト形式でも実行できますので、一応、スクリプトも載せておきます。

normalVal = 10;  % 65歳受取り開始時の月額(万円)
dispEndYear = 90;  % 何歳まで表示するか

t60 = datetime(60,1,1);
t65 = datetime(65,1,1);
t100 = datetime(101,1,1);
t_month = t60:calmonths(1):t100;
t_year = t60:calyears(1):t100;

N = length(t_month);
startYear = 65;
offsetM = (startYear-60)*12;
Val65 = [zeros(1,offsetM) normalVal:normalVal:(normalVal + (N-1-offsetM)*normalVal)];

startYear = 60;  % 開始年(60-75)
startMonth = 1;  % 開始月(1-12)

diffMonth = calmonths(between(datetime(startYear,startMonth,1), t65));
if startYear<=65
    rate = 0.4/100;
else
    rate = 0.7/100;
end
adjVal = normalVal * (1-rate*diffMonth);  % 調整後月額
adjVal = round(adjVal*1e4)/1e4;  % 円未満四捨五入

offsetM = calmonths(between(t60, datetime(startYear,startMonth,1)));
ValB65 = [zeros(1,offsetM) adjVal:adjVal:(adjVal + (N-1-offsetM)*adjVal)];

p = plot(t_month,[Val65' ValB65']);

if startYear<=65
    crossPoint = find((Val65 - ValB65) > 0, 1);
else
    crossPoint = find((Val65 - ValB65) < 0, 1);
end

if ~isempty(crossPoint)
    dt = datatip(p(1),t_month(crossPoint),Val65(crossPoint));
    p(1).DataTipTemplate.DataTipRows(1).Label = '損益分岐点:';
    p(1).DataTipTemplate.DataTipRows(1).Format = 'yy歳MMヶ月';
    p(1).DataTipTemplate.DataTipRows(2).Label = '受取累計(万円):';
    row3 = dataTipTextRow('月額(円):', repmat(adjVal*1e4,N,1));
    p(1).DataTipTemplate.DataTipRows(end+1) = row3;  % 行追加
    row4 = dataTipTextRow('年額(円):', repmat(adjVal*1e4*12,N,1));
    p(1).DataTipTemplate.DataTipRows(end+1) = row4;  % 行追加
end

grid on
xticks(t_year)
xticklabels(string(year(t_year)))
xsecondarylabel("歳")
xlabel("受給開始時期")
ysecondarylabel("万円")
ylabel("受取累計額")
xlim([t_month(1) t_month((dispEndYear-60)*12)])


使用方法

ねんきんネットで「年金見込額(月額)」を確認し、「標準月額」に万円単位で入力します。千円以下も入れたい場合は小数点で指定してください。10万5千円であれば「10.5」と入力します。

受給開始年・月を変更すると、その場合の月額、通常の65歳受給の場合との損益分岐点等が表示されます。

損益分岐点は比率だけで決まるので、それが知りたいだけであれば金額は必要ありません。

自分の場合でしか確認していないので、ねんきんネットでの試算結果でご確認ください。

誕生日の翌月から受給できるため(?)か、ねんきんネットの試算は(0-11)ヶ月で入力して結果が(1-12)で出ます。
分かりにくいかと思いますので、ここでは(1-12)入力としています。

年月の表示形式はシステム設定に依存します。
変更したい場合は「基本設定」で行ってください。

表示形式システム設定


あとがき

繰り上げ受給をすると障害基礎年金等の受給資格もなくなりますし、給与収入(ボーナスと合わせた年収/12)との合計月収が48万円を越えると減額されます。減額分はプールされるわけでもなく、ただ消え去ります!

60歳を過ぎても働いていて十分収入がある場合は繰り上げる必要はないでしょう。

しかし私のように、(働いているのに!)ほぼ無収入で生活に困っている場合や、先に現金でもらって自分で運用したい場合などは検討の余地があると思います。

(実は、請求書は既に書いてあります(u_u))

条件を変えてグラフで見られるとイメージが沸きやすいかと思います。

何かのお役に立てれば幸いです。

決して、MATLAB で遊びたいからムリヤリ作ったわけではありません。

計算結果の保証はできませんので、各自ご確認ください。m(._.)m


「税金」の項を追加しました。

2024/02/26


タイトル画像モデル:海老澤一恵
The title image was created using Adobe Generative Fill based on this picture.

Original Image

この記事が気に入ったらサポートをしてみませんか?