【VTI】MATLAB、Pythonで株価予測 その43【周波数解析⑦】

【VTI】MATLAB、Pythonで株価予測 その43【周波数解析⑦】 株価予測
【VTI】MATLAB、Pythonで株価予測 その43【周波数解析⑦】

バックナンバーはこちら。
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))
フクさん
フクさん

そうだね。
挙動は合わせておいた方が良いだろう。

動作結果

太郎くん
太郎くん

そして動作結果。

PythonによるVTIチャートの5Hz抽出及び比較、f(t)、F(ω)、f(x)
フクさん
フクさん

当然ではあるが、同じ結果が得られたな。

太郎くん
太郎くん

まぁ挙動としては問題無いんだよねー。

フクさん
フクさん

VTIチャートに関しては次回の検討材料としよう。

まとめ

フクさん
フクさん

まとめだよ。

  • 前回MATLABで作ったVTIチャートから5Hzを抽出するコードのPython版を作成。
    • 振幅調整も同じ処理で対応。
  • MATLABと同じ結果が得られたことは確認。
  • 問題は、これから何を分析できるかと言う点だが、そこは次回。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました