見出し画像

インデックスファンドを時系列分析してみた。

1.はじめに

こんにちは!
株価分析の為になるかと思い前々から時系列分析を勉強してました。
株価っていざ見ると、複雑に描かれていてなんだかつかみどころのない印象を持ちますね。そんな複雑に描かれたものを分析できるツールとして役に立つのではないかと思い勉強を進めています。

2.時系列分析とは?


時系列分析が何か?と問われれば、
時系列(時間とともに変化するデータ)を分析(要素に分解)することとなります。しかし、時系列分析で関心とされることは分析した結果を用いて、この先どう言う結果が考えられるのかという予測する部分にあります。

3.実際に時系列分析(STL分解)

では、pythonを使って分析していきます!(今回は予測はせず分析にフォーカスを当てていきたいと思います。)
インデックス投資で良く用いられているeMAXIS Slim全世界株式(オール・カントリー)を対象としたSTL分解を行いました。
STL分解とは
観測データ=トレンドデータ+循環データ+不規則データ
   トレンドデータ:データの長期的傾向
   循環データ:データの周期的傾向
   不規則データ:確率的変動
に分解する手法です。
下記結果を見ると、トレンドが右肩上がりとなっており、他のデータに対して支配的なことが分かります。
循環データと不規則データが似ているように見えますが、不規則項は2020年辺りのコロナショックの急激な下降をとらえています。

観測データ
トレンドデータ
循環データ
不規則データ

・トレンドデータ→
 長期的なざっくりとした動きをみる
・循環データ、不規則データ→
 短期的な動きをみる。特に不規則データはイレギュラーな動きをとらえる
のような使い方になりますでしょうか?

4.参考(ソースコード)

STL関数は最低限の引数のみ設定しています。


import sys
sys.path.append('/content/drive/MyDrive/module')
import pandas as pd
from datetime import datetime as dt
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL

# 基準価格のデータ取得
toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000H1T1&associFundCd=0331418A':'All_country',

          }

df_toushin = pd.DataFrame()
for i in range(len(list(toushin.keys()))):           
 data = pd.read_csv(list(toushin.keys())[i], index_col=0, encoding='SHIFT-JIS')
 data['Date'] = [s for s in [dt.strptime(str(s), '%Y年%m月%d日') for s in list(data.index)]]
 data.set_index('Date', inplace=True)
 data = data.rename(columns={'基準価額(円)':toushin[list(toushin.keys())[i]]})
 df_toushin = pd.concat([df_toushin, data], axis=1)

# STL分解の実行
stl = STL(df_toushin["All_country"],period=31)
result = stl.fit()

# グラフ作成
fig, ax = plt.subplots(figsize=(10, 3), dpi=100, tight_layout=True)
ax.plot(df_toushin["All_country"]['2018-11-01':'2024-07-01'], ls="-",label="All_Country")
plt.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Base_Value')
plt.savefig('raw_data.png')

fig, ax = plt.subplots(figsize=(10, 3), dpi=100, tight_layout=True)
ax.plot(result.trend['2018-11-01':'2024-07-01'], ls="-",label="All_Country_trend")
plt.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Base_Value')
plt.savefig('trend_data.png')

fig, ax = plt.subplots(figsize=(10, 3), dpi=100, tight_layout=True)
ax.plot(result.seasonal['2018-11-01':'2024-07-01'], ls="-",label="All_Country_seasonal")
plt.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Base_Value')
plt.savefig('seasonal_data.png')

fig, ax = plt.subplots(figsize=(10, 3), dpi=100, tight_layout=True)
ax.plot(result.resid['2018-11-01':'2024-07-01'], ls="-",label="All_Country_resid")
plt.legend()
ax.set_xlabel('Date')
ax.set_ylabel('Base_Value')
plt.savefig('resid_data.png')

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