Python FFT & IFFT

FFT 解析による豪ドル/円予測

ここまでで、豪ドル/円チャ-トロ-ソク足表示 プログラムの確認が終わりました。
引き続き、このロ-ソク足表示にロ-パス処理後の IFFT 結果を重ねて表示します。
必要なのは、
FFT解析計算 及び
FFT解析結果表示
を挿入することです。

FFT解析計算挿入

FFT解析計算において必要となるのは
豪ドル/円 CSV デ-タ FFT 解析 のなかの次の部分です。

Python FFT 解析準備
Close0 = xl_df["終値(売り)"].values
app = Close0[-1:]
app1 = np.hstack((app, app, app, app, app))
Close1 = np.hstack((Close0, app1))

cent = np.average(Close1)
Close2 = Close1 - cent
フーリエ変換(FFT)の実行
f = np.fft.fft(Close2) # フーリエ変換(FFT)

ロ-パスフィルタのカットオフを決める
fc = 10 # cut off freq.
f[fc:] = 0 # low pass filter
f_abs = np.abs(f)

逆フーリエ変換(IFFT)の実行
f_ifft = np.fft.ifft(f*2)
f_real = f_ifft.real # 実数部のみにする

ロ-パス処理後の IFFT 結果を重ねて表示

後は、ロ-ソク足にロ-パス処理後の IFFT 結果を重ねて表示 します。
f_ifft_sht = f_real + cent
Idx5 = Idx[-5:] + 5
plt.plot(
Idx, f_ifft_sht[:-5],
Idx5, f_ifft_sht[-5:],'bo')

予測日/予測値の一覧表作成

引き続き、予測日とその予測値の一覧表をつくるための CSV ファイルを作成します。
FFT 解析による豪ドル/円予測ファイル si_fft_filter-go-02.py ファイルにおいて
その予測日は
lastday[0]
その予測値は
f_ifft_sht[-5:]
に5日分のデ-タがあります。
よって、この二つの配列を一緒にして CSV ファイルにすることができれば
「予測日/予測値 一覧」
にすることができます。
このあたりのことは予測最終日取得 が参考になります。

予測日/予測値の配列を合体

2つの配列を pandas concat 関数を使用して横(列)方向へ連結することにします。
まずは、それぞれの配列を DataFrame 型に変換します。
これで、pandas で操作することが可能になりました。
import pandas as pd
lastday_pd = pd.DataFrame(lastday[0])
f_ifft_sht_pd = pd.DataFrame(f_ifft_sht[-5:])
この2つを pandas concat 関数で横(列)方向へ連結します。
横(列)方向指定 axis = 1 を忘れないでください。
df_concat-f = pd.concat([lastday_pd, f_ifft_sht_pd], axis = 1)
これを csv ファイルとして保存します。
保存するファイルフォルダ名は絶対パスで指定します。
そして、header=False, index=False としてヘッダとインデックスは保存なしとします。
df_concat-f.to_csv('/home/yamada/public_html/manep-img/mane_chart_go-f.csv', header=False,index=False)

FFT 解析による豪ドル/円予測ファイルまとめ

ここまでをまとめると、豪ドル/円予測ファイルは以下のようになります。


  #!/usr/bin/python3
  # -*- coding: utf-8 -*-
  import datetime
  def addBusinessDays(from_date, add_days):
    cur_date8 = [] # 21/03/30
    cur_date4 = [] # 3/30
    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
      current_date += datetime.timedelta(days=1)
      weekday = current_date.weekday()
      if weekday >= 5: # sunday = 6
        continue
      #土日は以下はスキップ
      # 年/月/日として文字列にする
      #例 21/03/30      
      e11 = current_date.strftime("%y/%m/%d")
      e22 = e11.replace("/0", "/")
      e33 = e22[3:] # 21/ 削除
      cur_date8.append(e22)
      cur_date4.append(e33)
      business_days_to_add -= 1
    return cur_date8, cur_date4

  import pandas as pd
  import numpy as np
  from datetime import datetime as dt
  import matplotlib.pyplot as plt
  from mplfinance.original_flavor import candlestick_ohlc
  xl_df = pd.read_csv("/home/yasuhiro/public_html/manep/mane_chart_go.csv", encoding="cp932")

  Open = xl_df["始値(売り)"].values
  High = xl_df["高値(売り)"].values
  Low = xl_df["安値(売り)"].values
  Date = xl_df["日付"].values
  Idx = xl_df.index
  tstr = Date[-1]
  tdatetime = dt.strptime(tstr, '%Y/%m/%d %H:%M:%S')
  # 文字列をdatetimeに変換するのがstrptime()関数
  # datetime.datetime.strptime(文字列, 書式指定文字列)
  lastday = addBusinessDays(tdatetime, 5)

  xDate = []
  xD = []
  for i, key in enumerate(Date):
    if(i % 10 == 0):
      e4 = str(key)[4:10]
      e6 = e4.replace("/0", "/")
      e8 = e6.lstrip("/")   
      xDate.append(e8)
      xD.append(i)

  xDate.append(lastday[1][4])
  xD.append(i + 5)

  # FFT解析計算はここに挿入
  Close0 = xl_df["終値(売り)"].values
  app = Close0[-1:]
  app1 = np.hstack((app, app, app, app, app))
  Close1 = np.hstack((Close0, app1))
  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_abs = np.abs(f)

  f_ifft = np.fft.ifft(f*2)
  f_real = f_ifft.real   # 実数部のみにする

  ohlc = zip(
   Idx, Open, High, Low, Close0)

  fig = plt.figure(
   figsize=(8.34, 5.56)) #③

  # python スクリプトと Jupyter とでは、
  # matplotlib の図のサイズが違うので注意
  ax = fig.add_subplot(1,1,1)  #④
  ax.grid()
  
  # FFT解析結果表示はここに挿入
  f_ifft_sht = f_real + cent
  Idx5 = Idx[-5:] + 5
  plt.plot(
Idx, f_ifft_sht[:-5], Idx5, f_ifft_sht[-5:],'bo') candlestick_ohlc( ax, ohlc, width=0.5, alpha = 1, colorup='r', colordown='g') plt.xticks(xD, xDate) plt.title('AUS$ / JPY chart') plt.xlabel('Date') plt.ylabel('Yen') # plt.show() plt.savefig( '/home/yamada/public_html/manep-img/mane_chart_go-fil.png') # pandas concat 関数で横(列)方向へ連結する、axis=1 を忘れないこと lastday_pd = pd.DataFrame(lastday[0]) f_ifft_sht_pd = pd.DataFrame(f_ifft_sht[-5:]) df_concat = pd.concat([lastday_pd, f_ifft_sht_pd], axis = 1) print(df_concat) df_concat.to_csv( '/home/yamada/public_html/manep-img/mane_chart_go-fil.csv', header=False, index=False)

本内容を TeraPad 等で作成したら、ファイル名を適当に
si_fft_filter-go-02.py
として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の 共有フォルダ c:\vb_public_html にして、 ブラウザでアクセスできるようにします。
なお、
c:\vb_public_html
はゲスト OS Ubuntu のなかの
/home/yamada/public_html
とリンクしていて共有フォルダの関係にあります。
詳細は ユ-ザ-ごとの公開ディレクトリを用意する を読んでみてください。

ここまでで、豪ドル/円チャ-トロ-ソク足表示 プログラムが完成しました。
引き続き、si_fft_filter-go-02.py ファイルの動作確認をします。


  • si_fft_filter-go-02.py ファイル動作確認 に進む
  • 豪ドル/円チャ-トロ-ソク足表示 に戻る
  • 豪ドル/円 CSV デ-タ FFT 解析まとめ に戻る
  • 豪ドル/円 CSV デ-タ FFT 解析 に戻る
  • FFT & IFFT Filter プログラムまとめ に戻る
  • FFT & IFFT Filter プログラム に戻る
  • 単純な FFT & IFFT プログラム に戻る
  • Python FFT & IFFT 概要 に戻る
  • 70VPS に戻る