バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は現状のVTIチャートに対してMATLABで5Hzを抽出するコードを作成と動作結果の確認。
動作としてはOKだが、これで分析になるのかどうか・・・。
この点の考察はさておき、同様の処理をするPythonコードも作成しておく。
登場人物
博識フクロウのフクさん
イラスト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
とりあえず作って来たPythonコード
太郎くん
同じくPython側も作って来た。
一回MATLABでやったから、予想以上にチョロかったな。
フクさん
まぁ流れが把握できてしまえば、Python自体はそれほど難しい言語じゃないし、
今回の処理自体に複雑な分岐があるわけじゃないしね。
太郎くん
というわけでPythonコード。
import numpy as np
import matplotlib.pyplot as plt
VTI=np.loadtxt('VTI.csv',delimiter=',') # 変換用波形読み込み
N=len(VTI)
L=N/2
x=np.linspace(-L,L-1,N)
ft=VTI
fig = plt.figure()
# 変換前波形
ax1 = fig.add_subplot(5, 1, 1)
ax1.plot(x,ft)
ax1.set_title('f(t)')
ax1.grid()
# FFT後にローテーション
Fw=np.fft.fft(ft)
Fw_tmp = np.roll(Fw,int(L))
ax2 = fig.add_subplot(5, 1, 2)
mask = (-50<=x) & (x<=50)
ax2.plot(x[mask],np.abs(Fw_tmp[mask]))
ax2.set_title(r'$F(\omega)$')
ax2.grid()
# 拡大
ax3 = fig.add_subplot(5, 1, 3)
mask = (0<=x) & (x<=10)
ax3.plot(x[mask],np.abs(Fw_tmp[mask]))
ax3.set_title(r'$F(\omega)$ expansion')
ax3.grid()
# 特定周波数のみ抽出
Fw_Filter=Fw_tmp;
Hz = 5;
Low = Hz-0.1;
High = Hz+0.1;
Fw_Filter[ ( x < -High) | ((-Low < x) & (x <= 0)) | ((0 <= x) & (x < Low)) | (High < x)]=0;
ax4 = fig.add_subplot(5, 1, 4)
mask = (-10<=x) & (x<=10);
ax4.plot(x[mask],np.abs(Fw_Filter[mask]))
ax4.set_title(r'$F(\omega)$ Filter')
ax4.grid()
# IFFT前にローテーション
fx=np.fft.ifft(np.roll(Fw_Filter,int(L)))
max_fx=max(fx);
max_ft=max(ft);
ax5 = fig.add_subplot(5, 1, 5)
ax5.plot(fx.real)
max_fx=np.max(fx.real);
max_ft=np.max(ft);
ax5.plot(ft*(max_fx/max_ft))
ax5.set_title('f(x)')
ax5.grid()
plt.show()
コードを確認
フクさん
まぁ問題はないな。
太郎くん
振幅の調整もMATLABでやった時と同じ方式にしておいた。
max_fx=np.max(fx.real);
max_ft=np.max(ft);
ax5.plot(ft*(max_fx/max_ft))
フクさん
そうだね。
挙動は合わせておいた方が良いだろう。
動作結果
太郎くん
そして動作結果。
フクさん
当然ではあるが、同じ結果が得られたな。
太郎くん
まぁ挙動としては問題無いんだよねー。
フクさん
VTIチャートに関しては次回の検討材料としよう。
まとめ
フクさん
まとめだよ。
- 前回MATLABで作ったVTIチャートから5Hzを抽出するコードのPython版を作成。
- 振幅調整も同じ処理で対応。
- MATLABと同じ結果が得られたことは確認。
- 問題は、これから何を分析できるかと言う点だが、そこは次回。
バックナンバーはこちら。
コメント