株価の時系列データをフーリエ解析してみた① 〜フーリエ変換〜
こんにちは、データサイエンティスト・ヒロキです。
株価データを自分で分析し、将来の動向などを予測したいけど、テクニカル分析の本などを見てみても、応用の事ばかり書いていてなんだか難しく感じる。もう少し時系列データの基本的なことを学びたい。とお困りの方いらっしゃったりしませんでしょうか?私もそうでした。
そこでこの記事では、
- ・株価データの分析をしたいけど、時系列分析ってなんか難しそう
- ・テクニカル分析などの本を目にしたことあるが、もう少し基本的なことを学びたい
- ・フーリエ?聞いたことあるけどなんか難しそう
という方のために、時系列データの3つの基本パターンとフーリエ解析の基礎を解説していきたいと思います。
初めに、リンクをクリックいただき、一票いただけると幸いです✨
にほんブログ村にほんブログ村
優しく解説していきますので、ご安心ください🙂
時系列データの3つの基本パターン
- 直流成分(平均値)
- 周期変動(sin波やcos波)
- 不規則変動(ランダムノイズ)
時系列データは上記3つのパターンの組み合わせでできていると考えられます。
なんとなく、足し合わせると株価の変動と似ているのがわかるかと思います。
まずは、時系列データというのは、直流成分と周期変動と不規則変動の3種類から構成されているんだな〜と理解できれば大丈夫です。
時系列データを直流成分と周期変動に分解することを(離散)フーリエ変換と言います。
詳しくはヨビノリさんのYouTubeをご覧ください。
具体例
Matlabコードを使って具体例も提示していきます。 このblogで紹介しているプログラムを実行するにはMatlabに加えてMatlabから提供されているCurve Fitting Toolboxが必要です。
“Matlab持ってないよ”という方も無料でMatlabを30日利用できるトライアルがありますのでご安心ください。またCurve Fitting Toolboxも無料のトライアル版が提供されていますのでご安心ください。
こちら
からインストールお願いします。
さて、いきなりですが、下記グラフを重ね合わせると何になるでしょうか?
答えは日経平均データを3項までのフーリエ級数展開モデルで近似したグラフです。 実際の日経平均のデータと比較したグラフをつくりました。
このように分解することで、どのくらいの大きさの周期がどのタイミングでやってくるのかの目安を知ることができます。もちろんこれだけでは投資判断できませんが経済の動向や企業分析などファンダメンタルな考察と組み合わせることで、判断の手助けになるかもしれません。
コード
上記具体例に使用したMatlabコードを示します。
事前にyahoofinanceの時系列データにアクセスできるプログラムファイルをこちら
からダウンロードし、作業フォルダに保存しておいてください。
%日経平均のデータを入手
NIKKEI = hist_stock_data('09112011','09112021','^N225');
%日付データ(グラフの横軸)をyearという変数に格納
year=NIKKEI.Date;
L=length(year);
x=[1:L]';
%欠損データを補完し、YYに格納
[YY,TF] = fillmissing(NIKKEI.Close,'linear','SamplePoints',year);
%3項までのフーリエ級数展開でフィッティング(curve fitting toolboxが必要)
f2 = fit(x,YY,'fourier3')
%フーリエ係数を変数に格納
a0=f2.a0;
a1=f2.a1;
a2=f2.a2;
a3=f2.a3;
b1=f2.b1;
b2=f2.b2;
b3=f2.b3;
w=f2.w;
%直流成分、周期変動、不規則変動に分解
y1=a0*ones(L,1);%直流成分
y2_sin=b1*sin(x*w)+b2*sin(2*x*w)+b3*sin(3*x*w); %周期変動
y2_cos=a1*cos(x*w)+a2*cos(2*x*w)+a3*cos(3*x*w);%周期変動
y3=200*randn(L,1);%不規則変動
%分解したものを足し合わせる
y=y1+y2_sin+y2_cos+y3;
%日経平均と足し合わせたものを比較するグラフ
figure
plot(year,YY);
hold on
plot(year,y);
xlabel('year')
ylabel('株価[¥]')
title('日経平均株価')
legend('日経平均','フーリエ近似')
%直流成分、周期変動、不規則変動に分解したものをそれぞれ描かせるグラフ
figure
subplot(8,1,1)
plot(year,y1)
text(datetime('2013-01-04'),19916,'1.直流成分 y=19920')
subplot(8,1,2)
plot(year,b1*sin(x*w))
xlim([datetime(year(1)),datetime(year(L))])
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=-6113*sin(0.001931x)')
subplot(8,1,3)
plot(year,a1*cos(x*w))
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=-3199*cos(0.001931x)')
subplot(8,1,4)
plot(year,b2*sin(2*x*w))
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=-2489*sin(2*0.001931x)')
subplot(8,1,5)
plot(year,a2*cos(2*x*w))
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=-3909*cos(2*0.001931x)')
subplot(8,1,6)
plot(year,b3*sin(3*x*w))
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=76.72*sin(3*0.001931x)')
subplot(8,1,7)
plot(year,a3*cos(3*x*w))
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'2.周期変動 y=-2765*cos(3*0.001931x)')
subplot(8,1,8)
plot(year,y3)
ylim([-5000 5000])
text(datetime('2013-01-04'),3800,'3.不規則変動 y=200*randn(L,1)')
参考文献
本記事を書くにあたって下記文献を参考にしています。 基本的な内容が体系的に優しく書かれているので初学者におすすめの入門書です。
Excelで学ぶ理論と技術 フーリエ変換入門(Amazonリンク)
入門はじめての時系列分析/盛岡書房
Matlabの基本的なことを勉強したいという方には、下記書籍がおすすめです。
MATLAB入門(メルカリ) MATLAB入門(Amazon)
参考動画
こちらの動画も非常に面白いのでぜひご覧ください。
次回
次回はもう少し効率的に周期間隔を把握する手法とも言えるスペクトル分析を紹介したいと思います。
最後まで読んでくださりありがとうございました😊
ひろき🐶