バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は今後の方針としてVTIの周波数特性を見て見る流れを考えた。
と言っても、やってみないとわからないので、結論としては行き当たりばったり方式。
というわけで、今回はおもむろにVTIチャートにFFTをぶちかます。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
VTIチャートをちょっと加工
じゃー、VTIチャートにFFTをブチかましてみよう!
ちょい待ち!
何?まだ何かあるの?
VTIチャートの日数が現状だと251日になってると思うのだけど、
サンプリング数が奇数だとローテーションする際に少し都合が悪い。
よって、偶数の250日としてFFTを掛ける。
まぁ偶数か奇数か確認してローテーションの数値を調整すれば良いのだけど、メンドイのでデータ側を弄ろう。
じゃー、最後の251日目を削っておくねー。
VTIチャートにFFT、IFFTをブチかます。(MATLAB版)
VTIチャートに対するFFT、IFFTは以下のコードになる。
VTI=csvread('VTI.csv'); % VTIチャート読み込み
N=length(VTI);
L=N/2;
x=linspace(-L,L-1,N);
ft=VTI;
% 変換前波形
subplot(4,1,1)
plot(ft)
title('f(t)');
grid();
% FFT後にローテーション
Fw=fft(ft);
Fw_tmp=circshift(Fw,fix(L));
subplot(4,1,2);
mask = (-50<=x & x<=50);
plot(x(mask),abs(Fw_tmp(mask)));
title('F(\omega)');
grid();
% 拡大
subplot(4,1,3);
mask = (0<=x & x<=10);
plot(x(mask),abs(Fw_tmp(mask)));
title('F(\omega)');
grid();
% IFFT前にローテーション
fx = (ifft(circshift(Fw_tmp,fix(L))));
subplot(4,1,4);
plot(real(fx),'r','LineWidth',4);
hold on;
plot(ft,'b','LineWidth', 2);
title('f(x)');
grid();
結果
そして結果だ。
一番下のグラフが赤線がIFFTの結果、青線が元のVTIチャートだよね?
完全に重なってて、ぱっと見だと紫に見えるけど。
そうだよ。
ばっちり重なってるからVTIチャートに対してFFT、IFFTは問題無く使えるってことだね。
完全に重なってて、ぱっと見だと紫に見えるけど。
そうなるな。
しかし、これは・・・。
なんとなく嫌な感じ
何?ちゃんと動いていて問題なさそうだけど、なんかあるの?
FFT、IFFTに関しては問題無い。
問題はVTIチャートの周波数特性だな。
ちゃんとIFFTで戻ってるからちゃんとした特性だと思うのだけど?
まぁ、ここらへんはPython側で同じことを実施した後に突き詰めていこう。
(不安なまま放置される僕の気持ちは・・・。)
まとめ
まとめだよ。
- FFTの出力をローテーションしている都合、サンプリング数は偶数が望ましい。
- 頑張って調整すれば奇数でも行けるはずだがメンドイのでやらない。
- 無事、VTIチャートの周波数特性及びそこからのVTIチャートへの逆変換ができた。
- しかし、VTIチャートの周波数特性自体に何かしら問題が・・・。
バックナンバーはこちら。
コメント