つみたてNISA、iDeCoなど活用して、インデックス投資をする上で、国内株式インデックスとして、「日経平均」「TOPIX」「JPX日経400」どれを選ぶといいか、過去の時系列データを比較してみた。
つみたてNISAの対象になっている3本のETFを用いる。
- ダイワ上場投信 – 日経225(2010/10/29~)
- ダイワ上場投信 – トピックス(2006/1/4~)
- ダイワ上場投信 – JPX日経400(2014/3/25~)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas_datareader.data as web
import datetime
from scipy import stats
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
# 期間設定
start = datetime.datetime(2014,3,31)
end = datetime.datetime(2020,12,31)
# データ取得
df = web.DataReader(['1320.T','1305.T','1599.T'],'yahoo',start,end)['Adj Close']
# 系列名変更
df.columns = ['N225','TOPIX','JPX400']
# 2014年3月末を100として指数化
df_index = df / df.iloc[0]*100
sns.set_style('whitegrid')
df_index.plot(figsize=(10,5))
2014年3月31日に購入し、2021年12月31日に売却するとすると、パフォーマンスは日経平均が一番いいことがわかる。 TOPIXとJPX400が、相対的に似た傾向がある。
df_index.describe()
日経平均が平均値、標準偏差が高いことがわかる。
# 日次データから月次データに変換(月末値)
df_index_m = df_index.resample('M').last()
# 収益率に変換
df_r_m = df_index_m.pct_change().dropna()
# 月次収益率をプロット
df_r_m.plot(figsize=(10,5))
df_r_m.describe()
日経平均の平均月次収益率0.95%、標準偏差4.90%で、TOPIX、JPX400より大きい。
df_r_m.corr()
各系列とも相関は95%以上で、ほぼ同じ動きをしていることも数値で確認。
# 年率換算
r_y_mean = (1+df_r_m.mean())**12 -1
r_y_sd = np.sqrt(12) * df_r_m.std()
# 平均・標準偏差(年率換算値)プロット
sns.set_style('whitegrid')
plt.figure(figsize=(5,4))
for (i,j,k) in zip(r_y_sd,r_y_mean, df_r_m.columns):
plt.scatter(i,j)
plt.annotate(k, xy=(i, j))
plt.xlabel("Standard Deviation (annualized basis)")
plt.ylabel("Mean Return (annualized basis)")
plt.show()
pd.DataFrame({'Mean':r_y_mean,
'Sd':r_y_sd,
'Mean/Sd': r_y_mean / r_y_sd})
日経平均が平均収益率(年率)12.0%・標準偏差17.0%、TOPIXが平均収益率8.6%・標準偏差15.9%、JPX400が平均収益率が8.5%・標準偏差が15.7%。
リスクあたりのリターン(Mean/Sd)でみると、日経平均が一番高いことがわかる。
sns.set_style('whitegrid')
f, axs = plt.subplots(1, 3, figsize=(12, 4))
sns.histplot(df_r_m, x='N225', stat='probability', kde=True, ax=axs[0])
sns.histplot(df_r_m, x='TOPIX', stat='probability', kde=True, ax=axs[1], color='orange')
sns.histplot(df_r_m, x='JPX400', stat='probability', kde=True, ax=axs[2], color='green')
f.tight_layout()
3つの指数の月次収益率のヒストグラムを確認すると、ほぼ正規分布で、下落の度数が大きくなっていることがわかる。
sns.histplot(df_r_m, x='N225', stat='probability', kde=True,
bins=50, alpha=0.5, label='N225')
sns.histplot(df_r_m, x='TOPIX', stat='probability', kde=True,
color='orange', bins=50, alpha=0.5, label='TOPIX')
plt.legend()
plt.xlabel('Monthly Return')
stats.ttest_ind(df_r_m['N225'], df_r_m['TOPIX'])
日経平均の平均月次収益率が若干大きく見えるが、t検定をするとp値は0.72で、有意な差があるとは言えない。 この期間では、たまたま日経平均の平均月次収益率が高かったようである。
sns.jointplot(data=df_r_m, x='N225', y='TOPIX', kind='scatter')
sns.histplot(df_r_m, x='TOPIX', stat='probability', kde=True,
color='orange', bins=50, alpha=0.5, label='TOPIX')
sns.histplot(df_r_m, x='JPX400', stat='probability', kde=True,
color='green', bins=50, alpha=0.5, label='JPX400')
plt.legend()
plt.xlabel('Monthly Return')
stats.ttest_ind(df_r_m['TOPIX'], df_r_m['JPX400'])
sns.jointplot(data=df_r_m, x='TOPIX', y='JPX400', kind='scatter')
TOPIXとJPX400はほぼ同じ傾向であることを、視覚的に、数値で確認。
Topixデータについて、Prophetを使って予測して簡単に可視化してみる。精度は求めておらず、ざっくり過去と同じと仮定すると2021年はこんな感じ程度の情報です。
Prophetのインストールなど詳細は以下公式ドキュメント参照ください。
https://facebook.github.io/prophet/
# 期間設定
start = datetime.datetime(2014,3,31)
end = datetime.datetime(2020,12,31)
# データ取得
df = web.DataReader('1305.T','yahoo',start,end)
df.head()
df['ds']=df.index
df['y']=df['Adj Close']
df['y'].plot(figsize=(8,4))
df.head()
from fbprophet import Prophet
# モデル作成
model = Prophet()
model.fit(df)
# 365日分予測
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)
# 結果確認
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
fig1 = model.plot(forecast, figsize=(8,4))
2021年も2014年〜2020年と同じような傾向があるとすると、年初から下落して、年末にかけて上昇しそうである。
fig2 = model.plot_components(forecast, figsize=(8,6))
要素をみてみると、上昇トレンドがあり、曜日は水・火がプラス、月は1月、11月~12月がプラス要因のようである。