さくら VPS FFT 大容量解析
さくら VPS FFT 大容量解析 豪ドル/円予測
FFT 解析による豪ドル/円予測Ⅱファイルまとめ
で作成した 5000本の大容量データを使用した
FFT 解析による豪ドル/円予測Ⅱファイル fft-go-long.py
をさくら VPS のなかで動かしたいと思います。
さくら VPS のなかで fft-go-long.py が動作するように改造します。
- 予測チャ-ト保存
でき上がった予測チャ-ト図を保存します。
保存場所はフルパスで指示します。
plt.savefig(
'/home/yamada/public_html/manep-img/fft-go-long.png')
manep-img フォルダはあらかじめ作成しておいてください。 - その他 print( )文等をコメント化
デバッグのため print, plt.plot, plt.show 文を挿入していたのをコメント化します。
要するにサイレント化して実行するようにします。
さくら VPS FFT 大容量解析 豪ドル/円予測ファイル
さくら VPS で動作する大容量解析 豪ドル/円予測ファイルまとめます。
fft-go-long.py との差分は赤字にし、ファイル名は
fft-go-long-sk.py とします。
# -*- coding: utf-8 -*-
#!/usr/bin/python3
import os
# 1:INFOメッセージが出ないようにする
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 が 9 以下の値で 主信号は構成されているとみて
# それ以上の周波数成分はノイズとみなす。
# ここは異論があるとは思いますが、よしとさせてください。
# よって、ロ-パスフィルタ処理を行うため、配列 f[10]~f[fs-1] の値を0でクリアします。
fc = 800 # cut off 500-800 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)
# plt.plot(xx3, f_result, '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.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)
以上で変更作業は完了です。
引き続き
さくら VPS FFT 大容量解析 豪ドル/円予測ファイル fft-go-long-sk.py
を確認します。