Python FFT & IFFT

豪ドル/円 CSV デ-タ FFT 解析

引き続き、豪ドル/円 CSV ダウンロ-ドデ-タ mane_chart_go.csv を FFT 解析します。
どのようにして、豪ドル/円 CSV ダウンロ-ドデ-タを取得したかについては
豪ドル/円 CSV 改造ファイルまとめ
のなかで、詳細に説明しています。
参考にしてください。
どのような csv なのかは 豪ドル/円 CSV ファイル をクリックすると CSV ファイルをダウンロ-ドして開くことができるはずです。
ここでは、この csv デ-タを FFT 解析します。

豪ドル/円 デ-タ FFT 解析する理由

なぜ、豪ドル/円 デ-タを FFT 解析するのでしょうか。
豪ドル/円 デ-タは三角関数の集合関数により表すことができるのではないかと考えるからです。
FFT 解析することによって、主立った三角関数の集合を見ることができます。
そして、従となる三角関数の集合を取り除いてしまえば、 過去のデ-タから未来の値を予測できることになります。
俗な言い方をすれば「だまし」を取り除くのです。
この考え方は、株価や商品相場価格にも適用できるはずです。

pandas インスト-ル

デ-タの集計と解析を行うためのライブラリは Python には多数そろっています。
その中でも CSV やエクセルとの連携が最も優れているのが pandas です。
これを使うと CSV ファイルを簡単に Python に取り込むことができます。
pandas は利用価値は沢山あるのですが、今回は CSV 連携について説明します。
pandas をインスト-ルします。
Ubuntu ディスクトップ画面から端末画面を開きます。
yamada@ubuntu-20:~$
sudo pip3 install pandas
Enter を押してインスト-ルを開始します。
しばらく黙りこくってからコメントが次々と出てきて完了します。
インスト-ル結果を見ます。
$ pip3 show pandas
でインスト-ルを確認すると
/usr/local/lib/python3.8/dist-pacages
に入ったことがわかります。
pandas は CSV ファイルの読み込みのために使用します。
CSV ファイルのグラフ化では pyplot Numpy も使用しますが、これは Python/pyplot インスト-ル のなかですでにインスト-ル済みです。
まだの方は pyplot (matplotlib) もインスト-ルしてください。
おっと pip3 がない方もここを参照してください。

豪ドル/円 CSV ダウンロ-ドデ-タ グラフ化ファイル作成

まずは、豪ドル/円 CSV ダウンロ-ドデ-タをグラフ化します。
取り込む必要があるライブラリは3つです。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

ダウンロードファイル読込

/public_html/manep/mane_chart_go.csv ファイルを読み込みます。
このファイルの0行目のヘッダー情報は日本語で書かかれています。
単に読込むと文字化けしますので、文字コードを cp932 を指定すると文字化けしないようです。
CSV ファイルの保存場所は絶対パスで表記する必要があります。

  xl_df =
  pd.read_csv("/home/yamada/public_html/manep/mane_chart_go.csv", encoding="cp932")

Python FFT 解析準備

Python FFT 解析に適用するデ-タは"終値(売り)"の値です。
mane_chart_go.csv のなかから"終値(売り)"の列デ-タを抜き取ります。
Close0 = xl_df["終値(売り)"].values
そして、配列 Close0 の最後に Close0 の最後の値 Close0[-1:] を5個追加します。
app = Close0[-1:]
app1 = np.hstack((app, app, app, app, app))
Close1 = np.hstack((Close0, app1))
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 を解析することによって未来5日間を予測します。

豪ドル/円 デ-タの表示

豪ドル/円 デ-タを表示します。
Y 軸デ-タはここまでで準備完了ですので、X 軸デ-タを作成します。
デ-タ数 fs は
fs = len(Close2)
となり、サンプリング周波数を fs[Hz] とすれば、 デ-タ数 fs をサンプリングするには1秒を要することになります。
np.linspace(start, stop, 生成する ndarray 配列の要素数)
を利用して、線形に等間隔な数列 t を生成します。
t = np.linspace(0, fs-1, fs)
例えば、fs = 100 ならば
t = 0,1,2,3,・・・・・・,97,98,99
となります。
ここまでくれば、豪ドル/円 デ-タを表示するのは簡単です。
plt.plot(t, Close2)
plt.show()

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

フーリエ変換(FFT)を実行します。
これも簡単でね。
f = np.fft.fft(Close2)
f_abs = np.abs(f)
plt.plot(f_abs[:int(fs/2)+1])
plt.show()
FFT の結果 f は複素数です。
実数部と虚数部を別々に分けて表示しても良いのですが、今回は絶対値を取り、 かつ、左右対称なので左半分のみを表示します。

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

フーリエ変換(FFT)の結果(後述)をみると カットオフ fc が 9 以下の値で 主信号は構成されており、それ以上の周波数成分はノイズとみなすことができます。
よって、ロ-パスフィルタ処理を行うため、配列 f[10]~f[fs-1] の値を0でクリアします。
fc = 10 # cut off
f[fc:] = 0 # low pass filter
ロ-パスフィルタ処理後のフーリエ変換(FFT)の結果も見ておきましょう。
f_abs = np.abs(f)
plt.plot(f_abs[:int(fs/2)+1])
plt.show()

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

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

ここまでで、豪ドル/円 CSV ダウンロ-ドデ-タ FFT 解析 プログラムの説明が終わりました。
引き続き、豪ドル/円 CSV ダウンロ-ドデ-タ FFT 解析まとめに進みます。


  • 豪ドル/円 CSV デ-タ FFT 解析まとめ に進む
  • FFT & IFFT Filter プログラムまとめ に戻る
  • FFT & IFFT Filter プログラム に戻る
  • 単純な FFT & IFFT プログラム に戻る
  • Python FFT & IFFT 概要 に戻る
  • 70VPS に戻る