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 がまとまりました。
引き続き、このファイルの動作確認をします。


  • FFT 解析による豪ドル/円予測Ⅱファイル動作確認 に進む
  • 元デ-タをロ-ソク足表示に変更 に戻る
  • 豪ドル/円 大容量デ-タ FFT 解析 に戻る
  • FFT 解析による豪ドル/円予測Ⅱ に戻る
  • 70VPS に戻る