"""#30 引き直し・1本目(計算検証役 2026-10-01):起点の額から11回の改定(H28〜R8)の「物価どおり」と「実際」の月額を出す。 年表(物価・決め手・改定率)は calc.py/decompose.py と同じもの(Issue #30 の検証官合格の表)を使うが、積み上げは下で独立に書き直す(年表→掛け合わせ)。""" from math import prod # 年度: (物価, 既裁定の改定率, 新規の改定率, 賃金) % Y = [("H28",0.8,0.0,0.0,-0.2),("H29",-0.1,-0.1,-0.1,-1.1),("H30",0.5,0.0,0.0,-0.4),("R1",1.0,0.1,0.1,0.6),("R2",0.5,0.2,0.2,0.3),("R3",0.0,-0.1,-0.1,-0.1), ("R4",-0.2,-0.4,-0.4,-0.4),("R5",2.5,1.9,2.2,2.8),("R6",3.2,2.7,2.7,3.1),("R7",2.7,1.9,1.9,2.3),("R8",3.2,1.9,1.9,2.1)] def cum(xs): return prod(1 + x / 100 for x in xs) CP = cum([y[1] for y in Y]) def chain(who, r8): # who=0 既裁定 / 1 新規。r8=R8 の率(基礎1.9/厚年2.0) return cum([(y[2 + who] if y[0] != "R8" else r8) for y in Y]) print("物価の累積", round((CP - 1) * 100, 3)) for who, nm in ((0, "既裁定(68歳以上)"), (1, "新規(67歳以下)")): for r8, lab in ((1.9, "R8=1.9(基礎年金の率)"), (2.0, "R8=2.0(厚年の報酬比例部分の率)")): print(nm, lab, "累積", round((chain(who, r8) - 1) * 100, 3)) print("既裁定 H28〜R7(R8を除く)", round((cum([y[2] for y in Y[:-1]]) - 1) * 100, 3), "/新規", round((cum([y[3] for y in Y[:-1]]) - 1) * 100, 3)) def amounts(start, who, share): # share=R8 に 2.0 が効く割合(報酬比例の割合。基礎部分は 1.9) pre = cum([y[2 + who] for y in Y[:-1]]) r8 = pre * (1 + ((1 - share) * 1.9 + share * 2.0) / 100) prc = CP return start * prc, start * r8 S = 150289 print("\n## 起点=2015年度に S 円の仮の人(既裁定の率)") for who, nm in ((0, "既裁定(68歳以上)"), (1, "新規(67歳以下)")): for share in (0.0, 0.6, 1.0): pr, ac = amounts(S, who, share) print(f"{nm} 厚年の割合{share:.0%}:物価どおり {pr:,.0f}/実際 {ac:,.0f}/月の差 {pr-ac:,.0f}/年の差(×12) {(pr-ac)*12:,.0f}") print("\n## 起点を替えた感度(既裁定・R8 の厚年割合 0%=全部 1.9)") for nm, s in (("標準的な年金額(夫婦・H27年度)221,507", 221507), ("国民年金の満額(H27年度)65,008", 65008), ("厚年(第1号)平均 150,289", 150289), ("同・男子 169,967", 169967), ("同・女子 111,413", 111413)): pr, ac = amounts(s, 0, 0.0); print(f"{nm}:物価どおり {pr:,.0f}/実際 {ac:,.0f}/月の差 {pr-ac:,.0f}/年の差 {(pr-ac)*12:,.0f}/実際÷物価どおり {ac/pr:.4f}") # B:実績に揃える。R6末の平均が S になるよう 2015年度の額を逆算し、R7・R8 を続ける print("\n## B:R6年度末に S 円(実際の平均)になるよう 2015年度を逆算(既裁定・新規の率の混ぜ方で幅)") for who, nm in ((0, "既裁定"), (1, "新規")): f6 = cum([y[2 + who] for y in Y[:-2]]); f8 = cum([y[2 + who] if y[0] != "R8" else 1.9 for y in Y]) s0 = S / f6; p_nominal = s0 * CP; a_now = s0 * f8 print(f"{nm}:2015年度の額 {s0:,.0f}(R6末→R8 の改定率 {(f8/f6-1)*100:.2f}%)/今の実際 {a_now:,.0f}/物価どおり {p_nominal:,.0f}/月の差 {p_nominal-a_now:,.0f}/年の差 {(p_nominal-a_now)*12:,.0f}") print("\n## 3. 11回のうち 賃金 < 物価 の回(年表)") miss = [y[0] for y in Y if y[4] < y[1]]; ok = [y[0] for y in Y if y[4] >= y[1]] print("届かなかった", len(miss), miss, "/届いた(賃金≧物価)", len(ok), ok) print(" うち 年金の決め手が賃金・物価・据え置き:賃金で下げた", [y[0] for y in Y if y[4] < y[1] and y[0] not in ("H28","H29","H30")], "/物価の年 H29(物価<0・賃金<物価)/据え置き H28・H30(物価>0・賃金<0)")