さくら VPS Python 豪ドル/円 4時間足予測

FFT 解析 豪ドル/円 4時間足予測

ここまで
Numpy polyfit 関数 Python 多項式フィッティング
で豪ドル/円4時間足予測を行なってきました。
引き続き、FFT 解析で豪ドル/円 4時間足予測を行なっていきます。
まずは、Numpy polyfit 関数 Python 多項式フィッティングでの
Money Partners サイト 4時間足デ-タ取得
4時間足ダウンロ-ドファイル名変更
マネパ 4時間足 CSV ダウンロードファイル作成 に戻る
豪ドル/円 4時間足 CSV ダウンロ-ドデ-タ グラフ化
での説明に沿ってファイル作成を進めます。
Numpy polyfit 関数で豪ドル/円4時間足予測
のなかのフィティング方法については、FFT 解析方法にしたがった予測方法に変更します。
FFT 解析方法については、
Python FFT & IFFT 概要 に戻る
単純な FFT & IFFT プログラム
FFT & IFFT Filter プログラム
FFT & IFFT Filter プログラムまとめ
豪ドル/円 CSV デ-タ FFT 解析
豪ドル/円 CSV デ-タ FFT 解析まとめ
を読んでください。

FFT 解析 豪ドル/円4時間足予測 暫定予測値作成

まずは暫定予測値を作成します。
確定している終値は
Close = xl_df["終値(売り)"].values
です。
FFT 解析では何らかの予測値が必要なようです。
そこで、シンプルな予測値をあらかじめ設定することによりこの問題を回避します。
今回採用したのは、N番目の4時間足の終値は、次のN+1番目の4時間足の終値に引き継がれると予測する考えです。
app = Close[-1:]
app1 = np.hstack((app, app, app, app, app, app))
Close1 = np.hstack((Close, app1))
として、この Close1 を解析することによって未来6番目の4時間足を予測します。
np.hstack((a, b)) は ndarray 配列 a と b を結合してくれます。
Close1 はほぼ 80 前後を行き来する値をとりますので
cent = np.average(Close1)
Close2 = Close1 - cent
として、三角関数に見合った値にシフトします。
np.average(Close1) は ndarray 配列 Close1 の平均値です。
これで a * sin(x) 風のデ-タ値に変換されました。
この Close2 を解析することによって未来 24時間をを予測します。
Idx は X 軸でデ-タの数だけあります。
Idx6 は未来4時間足6本分の X 軸です。
Idx = xl_df.index
Idx6 = Idx[-6:] + 6
Idxlg = np.r_[Idx, Idx6]
np.r_ : 配列の結合
関数ではないので引数とかを指定するのではなく[ ]の中に結合したい配列を指定します。
Idxlg は未来値も含めたト-タル数になります。
これで、FFT 解析の準備完了です。

フーリエ変換(FFT)の実行

フーリエ変換(FFT)を実行します。
簡単です。
f = np.fft.fft(Close2)
FFT の結果 f は複素数です。
f_abs = np.abs(f)
実数部と虚数部を別々に分けて表示しても良いのですが、今回は絶対値を取ってみました。

ロ-パスフィルタのカットオフを決める

通常フーリエ変換(FFT)の結果をみると カットオフ fc が 9 以下の値で 主信号は構成されており、 それ以上の周波数成分はノイズとみなすことができます。
よって、ロ-パスフィルタ処理を行うため、配列 f[10]~f[fs-1] の値を0でクリアします。
fs:デ-タ数
fs = len(Close2)
となり、サンプリング周波数を fs[Hz] とすれば、デ-タ数 fs をサンプリングするには1秒を要することになります。
fc = 10 # cut off
f[fc:] = 0 # low pass filter
ロ-パスフィルタ処理後のフーリエ変換(FFT)の結果は
f_abs = np.abs(f)
となります。

逆フーリエ変換(IFFT)の実行

ロ-パスフィルタ処理後元の波形がどう変化したか見てみましょう。
f_ifft = np.fft.ifft(f*2)
# 逆フーリエ変換(IFFT)
f_real = f_ifft.real
# 実数部のみにする
IFFT は inverse fast Fourier transform の略称で FFT の結果を元の信号形式に戻すことができます。
IFFT 処理結果は f_ifft で受け取ります。
IFFT の処理結果は numpy.ndarray 形式で、値は複素数です。
f_ifft.real に実数部が、f_ifft.imag に虚数部が格納されます。
この実数部がロ-パスフィルタ処理後の元の信号形式を表しています。
実数部をプロットします。
急激な動きがなくなり、なめらかな変化になります。
後は、シフト値 cent を元にもどします。
f_ifft_sht = f_real + cent
このなかに、フィティング値と予測値が入っています。

FFT 解析 豪ドル/円4時間足予測ファイル

ここまでくれば、FFT 解析 豪ドル/円4時間足予測ファイルは
X 軸日付予測4時間足最終日時取得
予測最終日時取得関数まとめ
豪ドル/円ロ-ソク4時間足と予測値の表示
豪ドル/円4時間足予測まとめ
を参考に作成することができるのですが、とは言うものの面倒なので、 豪ドル/円4時間足予測まとめ のなかで示した 豪ドル/円ロ-ソク4時間足予測多項式フィティングファイル sc_sele_mane_poly-tako_4h.py のどこを修正したらよいのか説明します。
60行目ぐらい以下 3行削除
z = np.polyfit(Idxlg, Close1, 9)
p = np.poly1d(z)
p_pand = np.round(p(Idx6),3)
代わりに上記(このぺ-ジの初めの部分で説明した内容)10行を追加します。

   
  cent = np.average(Close1)
  Close2 = Close1 - cent
  f = np.fft.fft(Close2) # フーリエ変換(FFT)
  fc = 10          # cut off freq.
  f[fc:] = 0       # low pass filter
  f_ifft = np.fft.ifft(f*2)
  f_real = f_ifft.real   # 実数部のみにする
f_ifft_sht = f_real + cent p_pand = np.round(f_ifft_sht[-6:],3) f_ifft_sht_pd = pd.DataFrame(p_pand)

次に、60行目ぐらい下記 4行削除

  df_concat = pd.concat([lastday_pd, p_pand_pd], axis = 1)
  df_concat.to_csv(
   '/home/yamada/public_html/manep-img/mane_chart_go_4h.csv',
   header=False, index=False)

代わりに以下4行追加

  df_concat = pd.concat([lastday_pd, f_ifft_sht_pd], axis = 1)
  df_concat.to_csv(
   '/home/yamada/public_html/manep-img/mane_chart_go-fil_4h.csv',
   header=False, index=False) 

最後から12行目当たり
plt.plot(
Idx, p(Idx),
Idx6, p(Idx6),'bo')
の 3行を削除、代わりに
plt.plot(
Idx, f_ifft_sht[:-6],
Idx6, f_ifft_sht[-6:],'bo')
を追加します。
そして最後

  plt.savefig(
   '/home/yamada/public_html/manep-img/mane_chart_go_4h.png')

を削除して

  plt.savefig(
   '/home/yamada/public_html/manep-img/mane_chart_go-fil_4h.png')

を追加します。

ここまでで、やっと修正案ができましたので、 続いて、FFT 解析 豪ドル/円4時間足予測ファイルをまとめて表示します。


  • FFT 解析 豪ドル/円4時間足予測ファイルまとめ に進む
  • 70VPS に戻る