Forex Forecast Based on LSTM
4632 단어 사랑MachineLearningDeepLearning
【환율 데이터의 취급】
환율 데이터의 예측이지만 데이터는 얻을 수 있지만 모델을 결정해야합니다. LSTM에서 EURUSD의 예상을 해 보았다. 2019년도의 1년간의 데이터를 취했다. 자료는 일 st였다. 작은 m 에서 취한다. 처음부터 끝까지 스스로 하는 것은 처음이었는지, 꽤 공부가 되었다.
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers import Dense, Flatten, Conv2D, Activation, Dropout
from tensorflow.keras import Model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from keras import optimizers
from keras.optimizers import Adam
from keras import losses
from keras.layers import Dense, Activation
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
data1= pd.read_csv('drive/My Drive/FX/1/DAT_MT_EURUSD_M1_2019.csv', names = ["date", "time", "open", "high", "low", "close", "volume"])
datetime1 = data1["date"] + "." + data1["time"]
data2 = pd.to_datetime(datetime1, format = "%Y.%m.%d.%H:%M")
data2
data1["datetime"] = data2
data1
timeindex1 = data1.set_index('datetime', inplace=True)
data2 = data1['open'].resample("30T").first()
1분 마다의 데이터를 취했지만, 리샘플링보다, 30분 마다의 데이터로 바꾸었다. 또한 데이터의 전처리에서 nan의 값은 이전의 값과 같게 되었다. 시계열 데이터는 평균을 취하는 것보다 이런 취급이 좋다고 생각한다. 그 후, MinMaxScaler로 스케일링을 실시했다.
#データの欠損値を前の値で埋める
data3 = pd.DataFrame(data2, columns = ["open"])
data4 = data3.fillna(method='ffill')
from sklearn.preprocessing import MinMaxScaler
y = np.array(data4['open'])
# 標準化
scaler = MinMaxScaler(feature_range=(0, 1))
y1 = y.reshape(-1, 1)
y = scaler.fit_transform(y1)
x = np.arange(len(y))
input_len = 4
X, Y = [], []
for i, _ in enumerate(x):
if (i+input_len+1 >= len(x)):
break
X.append(y[i:i+input_len])
Y.append(y[i+input_len+1][0])
split_index = int(len(X)*0.7)
# 学習・テスト用データに分割
train_x = X[:split_index]
train_y = Y[:split_index]
test_x = X[split_index:]
test_y = Y[split_index:]
train_x = np.array(train_x).reshape(len(train_x), -1,1)
test_x = np.array(test_x).reshape(len(test_x), -1,1)
train_y = np.array(train_y).reshape(len(train_y),-1,1)
test_y = np.array(test_y).reshape(len(test_y),-1,1)
train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
test_x = np.asarray(test_x)
test_y = np.asarray(test_y)
train_x = np.array(train_x).reshape(len(train_x), -1, 1)
test_x = np.array(test_x).reshape(len(test_x), -1, 1)
train_y = np.array(train_y).reshape(len(train_y))
test_y = np.array(test_y).reshape(len(test_y))
# RNNの初期化
model = tf.keras.Sequential()
# 最初のLSTMとDropoutの追加
model.add(LSTM(50, return_sequences = True))
model.add(Dropout(0.2))
# 二番目のLSTMとDropoutの追加
model.add(LSTM(50, return_sequences = True))
model.add(Dropout(0.2))
# 三番目のLSTMとDropoutの追加
model.add(LSTM(50, return_sequences = True))
model.add(Dropout(0.2))
# 四番目のLSTMとDropoutの追加
model.add(LSTM(50))
model.add(Dropout(0.2))
# 出力層の追加
model.add(Dense(1))
# 学習のためのRNNモデルを設定
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
# RNNモデルを学習させる
model.fit(train_x, train_y, epochs = 10, batch_size = 32)
# モデルの評価
score = model.evaluate(test_x, test_y)
score
손실 함수는 회귀이므로 MSE를 사용했습니다.
# ラベルなどの設定
df = pd.DataFrame(data4.index.values, columns = ["datetime2"])
label_x = df.to_numpy()
label_x = label_x[len(y)-len(test_y):]
test_y = scaler.inverse_transform(np.array(test_y).reshape(-1,1))
test_y = test_y.reshape(len(test_y))
# 予測値の抽出
predict_y = model.predict(test_x)
# 元の値に戻す
predict_y = scaler.inverse_transform(predict_y)
fig, ax = plt.subplots()
ax.plot(label_x, predict_y, label="prediction", color="red")
ax.plot(label_x, test_y, label="raw data", color="blue")
plt.tick_params(axis='x', which='major', labelsize=6)
ax.legend()
plt.show()
빨간색이 예측이고 파란색이 원래 데이터입니다. 잘 예상되는 것 같습니다.
Reference
이 문제에 관하여(Forex Forecast Based on LSTM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dotlearning/items/59d1db5d3d86330414da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)