Win11 WSL2 Ubuntu Python FFT & IFFT
FFT 解析による豪ドル/円予測Ⅱファイルまとめ
ここまで、FFT 解析による豪ドル/円予測Ⅱについて小出しにその詳細を説明してきました。
引き続き、これを一つのファイル fft-go-long.py にまとめます。
# -*- coding: utf-8 -*- #!/usr/bin/python3 import os os.environ['TF_CPP_MIN_LOG_LEVEL']='1' import datetime from datetime import datetime as dt import numpy as np import pandas as pd from matplotlib import pyplot as plt from tensorflow import keras from mplfinance.original_flavor import candlestick_ohlc 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 xl_df = pd.read_csv( "/home/yamada/public_html/manep-w/mane_chart_go_long.csv", encoding="cp932") Open = xl_df["始値(売り)"].values High = xl_df["高値(売り)"].values Low = xl_df["安値(売り)"].values Close = xl_df["終値(売り)"].values Date = xl_df["日付"].values Idx = xl_df.index tstr = Date[-1] raw_data0 = Close.copy() raw_data = Close.copy() Close1 = Close.copy() tdatetime = dt.strptime(tstr, '%Y/%m/%d %H:%M:%S') # 文字列をdatetimeに変換するのがstrptime()関数 # datetime.datetime.strptime(文字列, 書式指定文字列) lastday = addBusinessDays(tdatetime, 5) Date_100 = Date[-100:] xDate = [] xD = [] for i, key in enumerate(Date_100): 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) #5日間の予測日の追加 # 行列の平均、標準偏差を求めます。 mean = np.mean(raw_data) print("Mean", mean) raw_data -= mean std = np.std(raw_data) print("Std ",std) # 標準偏差値に変換 # 約 5000個あり raw_data /= std print("各標準偏差値") print(raw_data) # for d_a_s in raw_data: # print(d_a_s) print(len(raw_data)) raw_data00 = raw_data.copy() raw_data100l = raw_data00[-100:] print("raw_data100l") print(raw_data100l) Idx0 = Idx.copy() Idx_100 = Idx0[-100:] - Idx0[-100] Idx_100 = Idx_100 print("Idx_100") print(Idx_100) # 仮の予測値を求める z = np.polyfit(Idx_100, raw_data100l, 4) #4 p = np.poly1d(z) Idx10 = Idx_100[-10:] + 10 print("仮の予測値10個 Idx10") print(Idx10) print("仮の予測値10個 p(Idx10)") print(p(Idx10)) # 仮の予測値と大容量データ合体 raw_data_10 = np.hstack((raw_data, p(Idx10))) print("仮の予測値と大容量データ合体") print(raw_data_10) fs = len(raw_data_10) print("fs") print(fs) t = np.linspace(0, fs-1, fs) print("t") print(t) plt.plot(t, raw_data_10) plt.show() # フーリエ変換(FFT)実行 f = np.fft.fft(raw_data_10) print("f[5000]") print(f[5000]) f_abs = np.abs(f) plt.plot(f_abs[:int(fs/2)+1]) plt.show() # ロ-パスフィルタのカットオフ # フーリエ変換(FFT)の結果よりカットオフ fc が 800 以下の値で主信号は構成されるとみて # それ以上の周波数成分はノイズとみなす。 # ロ-パスフィルタ処理を行うため、配列 f[10]~f[fs-1] の値を0でクリア。 fc = 800 # cut off 500-800 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 # 実数部のみにする print("f_real") print(f_real) plt.plot(t, f_real) plt.show() f_real_110 = f_real[-110:] t_110 = t[-110:] - t[-110] print("f_real_110") print(f_real_110) print("t_110") print(t_110) t_105 = t_110[:105] print("t_105") print(t_105) plt.plot(t_110, f_real_110) plt.show() # 標準偏差値を実値に変換 result_110 = f_real_110.copy() result_110 *= std result_110 += mean print("result_110") print(result_110) result_105 = result_110[:105] print("result_105") print(result_105) Open_100 = Open[-100:] High_100 = High[-100:] Low_100 = Low[-100:] Close_100 = Close1[-100:] Idx_100 = Idx0[-100:] - Idx0[-100] plt.plot(Idx_100, Close_100) plt.plot(t_105, result_105) plt.show() ohlc = zip( Idx_100, Open_100, High_100, Low_100, Close_100) fig = plt.figure( figsize=(8.34, 5.56)) # python スクリプトと Jupyter とでは、 # matplotlib の図のサイズが違うので注意 ax = fig.add_subplot(1,1,1) ax.grid() # 解析結果表示はここに挿入 plt.plot(t_105, result_105) # ---------------- 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.savefig( # 'colab_mane_chart_go_keras.png') # '/home/yamada/public_html/manep-img/fft_go_long.png') plt.show() print("予測値 = 最終日+1~+5日") valhe = np.round(result_105[100:], 3) # 3桁まで表示 valhe_pd = pd.DataFrame(valhe) lastday_pd = pd.DataFrame(lastday[0]) # この2つを pandas concat 関数で横(列)方向へ連結します。 # 横(列)方向指定 axis = 1 を忘れない df_concat = pd.concat([lastday_pd, valhe_pd], axis = 1) print(df_concat) df_concat.to_csv( '/home/yamada/public_html/manep-img/fft_go_long.csv', header=False, index=False)
ここまでで FFT 解析による豪ドル/円予測Ⅱファイル fft-go-long.py がまとまりました。
引き続き、このファイルの動作確認をします。