はじめに
最近、年金がいろいろとニュースになっていますが、「GPIF 年金運用成績を参院選後まで隠蔽か」という記事が気になりました。
GPIFの基本ポートフォリオは公開されているので、公開を待たなくても、ある程度はシミュレーションできるんじゃね?と。
Colaboratory でやってみる
やってみました。→ Gist
解説
eMAXISのサイトから各投資信託の設定来データをダウンロードします。
使う投信は「eMAXIS TOPIXインデックス」、「eMAXIS 国内債券インデックス」、
「eMAXIS 全世界株式インデックス」、「eMAXIS 先進国債券インデックス」の4つです。面倒なのでダウンロードしてpandas.DataFrameにする jpfund
というパッケージを作りました。
!pip install jpfund
import jpfund
emaxis = jpfund.EMaxis.get_list()
jp_stock = [x for x in emaxis if "250888" in x.id][0].get()
jp_bond = [x for x in emaxis if "250893" in x.id][0].get()
world_stock = [x for x in emaxis if "260434" in x.id][0].get()
world_bond = [x for x in emaxis if "250925" in x.id][0].get()
def sim_portfolio(assets, weights, start_price=10000):
w = np.array(weights)
w = w / w.sum()
align_assets = align_start_date(assets)
# 各資産の変動率を計算
changes = [price_to_change(df) for df in align_assets]
# 各変動率にポートフォリオの重みをかける
weight_changes = [x[0]*x[1] for x in zip(changes, w)]
# 重み付き変動率を足し合わせてポートフォリオの変動率を計算する
daily_change = None
for change in weight_changes:
if daily_change is None:
daily_change = change
else:
daily_change = daily_change + change
# ポートフォリオの変動率を価格に戻す
return change_to_price(daily_change, start_price)
# 基本ポートフォリオ
assets = [jp_stock, jp_bond, world_stock, world_bond]
weights = [25, 35, 25, 15]
gpif = sim_portfolio(assets, weights)
# 各四半期の収益率
q_return = gpif.asfreq("Q", method="ffill").pct_change().fillna(0).tail(12) * 100
計算結果
四半期収益率 | |
---|---|
Date | |
2016-09-30 | 1.970105 |
2016-12-31 | 8.366616 |
2017-03-31 | 0.316310 |
2017-06-30 | 3.205794 |
2017-09-30 | 2.852240 |
2017-12-31 | 3.941257 |
2018-03-31 | -3.514218 |
2018-06-30 | 1.306749 |
2018-09-30 | 3.411030 |
2018-12-31 | -8.447312 |
2019-03-31 | 5.862487 |
2019-06-30 | -0.041640 |
GPIFが公開している運用状況速報は次の通り。
プラマイ0.5ポイントぐらいの誤差があるのかな?
ということで、まだ公開されていない2018年度第4四半期の運用成績は5%〜6.5%ぐらいになるのかなあ?
2019/7/5 追記
公開されましたね。
第4四半期の実績は 6.21% だったみたいです。だいたい合ってたっぽい。