株価の時系列データをフーリエ解析してみた⑤ 〜周期性の把握〜
ジュワーっとステーキ「俺のターン」
夜に見たら飯テロですね🥩
はい、こんばんは。データサイエンティスト、ひろきです🐶
よくクリスマスシーズンにはおもちゃメーカーの株が上がる、夏には飲料メーカーの株価が上がるなど言われていますが、本当なのでしょうか?データで検証したくなったりしませんか?
前回ご紹介したピリオドグラムを活用して周期性を発見し、株価時系列データの周期性、季節性をわかりやすく表示する方法をご紹介したいと思います。
なんのこっちゃ?
って思われている方々いらっしゃるかと思います。
要するに、こんな感じで株価のデータをスムージングしたような、周期性の読みやすいグラフを作ります。
さて今回のやることを技術的に書くと、
- ピリオドグラムで得られた周期情報を抜き出すようなフィルタを作る
- そのフィルタを元の時系列データに掛け合わせて、特定の周期のグラフを抽出する
初めに、リンクをクリックいただき、一票いただけると幸いです✨
にほんブログ村にほんブログ村
優しく解説していきますので、ご安心ください🙂
それではやっていきましょ^^
Matlabコード
それでは全体のコードを紹介します。 下記の通り非常にシンプルなコードで計算できます。
%株価データをダウンロード
data = hist_stock_data('24102002','24112022',append('6752.T'));
%時間データと終値を変数yとtに格納
y=data.Close;
t=data.Date;
%欠損データがある場合は補間してYYにデータを格納
[Y,TF] = fillmissing(y,'linear','SamplePoints',t);
%トレンド除去
T=(1:length(Y))';
p= polyfit(T,Y,1);
YYfit= polyval(p,T);
dYY=detrend(Y);
%トレンド除去後の時系列データ
figure
plot(t,Y)
hold on
plot(t,YYfit)
hold on
plot(t,dYY)
%1年を245日(営業日)としてサンプリング周波数を245回/年と定義
Fs=245;
%欠損データを補った株価データYYをサンプリング周波数Fsでフーリエ変換し、パワースペクトル密度pxxと周波数fを出力
[pxx,f] = periodogram(dYY,rectwin(length(y)),length(y),Fs);
figure
%横軸:周波数[回/年]、縦軸:株価の大きさとしてグラフ(ピリオドグラム)を作成
plot(f,10*log10(pxx))
xlabel('Cycles/Year')
ylabel('dB / (Cycles/Year)')
title('Periodogram')
xlim([0 3])
ylim([10 80])
%0.06~0.5Cycles/Yearのバンドパス
figure
bandpass(dYY,[0.06 0.5],Fs);
xlabel('Cycles/Year')
xlim([0 10])
出てくるグラフはこちらです。
こちらのグラフは青の株価データ📉から赤のトレンド成分を差し引いて黄色いグラフを作りました。データ全体から20年間のトレンドを除去する事で数年単位の変化を読み取りやすくするのが狙いです。
さて次にピリオドグラム(株価時系列データを周波数軸にフーリエ変換したグラフ)をみて、ピーク値の周波数(横軸の周期)を読み取ります。
ピリオドグラムから3周期くらい抽出しました。😉
抽出したピーク値が0.098~0.44[Cycles/Year]の範囲に集中していたので、 その範囲を含むように0.06~0.5[Cycles/Year]のバンドパスフィルターを元の時系列データにかけました。
いかがでしたでしょうか? ちょっと難しいかもしれませんが、信号処理などで一般的に使える知識なので、 ぜひこのコードをコピペしていろんなデータに使って見てください〜🍵🌟
最後まで読んでくださりありがとうございました😊
ひろき🐶