import os
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.layers import Conv1D, Bidirectional
from tensorflow.keras.layers import Multiply
from tensorflow.python.keras.models import *
from tensorflow.python.keras.layers import Dense, Lambda, RepeatVector, Permute, Dropout, Flatten, CuDNNLSTM
SINGLE_ATTENTION_VECTOR = False
def attention_3d_block(inputs):
# inputs.shape = (batch_size, time_steps, input_dim)
input_dim = int(inputs.shape[2])
a = inputs
# a = Permute((2, 1))(inputs)
# a = Reshape((input_dim, TIME_STEPS))(a) # this line is not useful. It's just to know which dimension is what.
a = Dense(input_dim, activation='softmax')(a)
if SINGLE_ATTENTION_VECTOR:
a = Lambda(lambda x: K.mean(x, axis=1), name='dim_reduction')(a)
a = RepeatVector(input_dim)(a)
a_probs = Permute((1, 2), name='attention_vec')(a)
# output_attention_mul = merge([inputs, a_probs], name='attention_mul', mode='mul')
output_attention_mul = Multiply()([inputs, a_probs])
return output_attention_mul
def attention_model():
inputs = Input(shape=(look_back, INPUT_DIMS))
x = Conv1D(filters=64, kernel_size=1, activation='relu')(inputs) # , padding = 'same'
x = Dropout(0.3)(x)
# lstm_out = Bidirectional(LSTM(lstm_units, activation='relu'), name='bilstm')(x)
# For GPU you can use CuDNNLSTM cpu LSTM
lstm_out = Bidirectional(CuDNNLSTM(64, return_sequences=True))(x)
lstm_out = Dropout(0.3)(lstm_out)
attention_mul = attention_3d_block(lstm_out)
attention_mul = Flatten()(attention_mul)
# output = Dense(1, activation='sigmoid')(attention_mul)
output = Dense(60, activation='linear')(attention_mul)
model = Model(inputs=[inputs], outputs=output)
return model
def fit_size(x, y):
from sklearn import preprocessing
x_MinMax = preprocessing.MinMaxScaler()
y_MinMax = preprocessing.MinMaxScaler()
x = x_MinMax.fit_transform(x)
y = y_MinMax.fit_transform(y)
return x, y, y_MinMax
def flatten(X):
flattened_X = np.empty((X.shape[0], X.shape[2]))
for i in range(X.shape[0]):
flattened_X[i] = X[i, (X.shape[1] - 1), :]
return (flattened_X)
# 预测未来60秒价格
def create_dataset(dataset, train_y, look_back):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
a = dataset[i:(i + look_back), :]
dataX.append(a)
y = train_y[(i + look_back):(i + look_back + 60), 0].tolist()
dataY.append(y)
TrainX = np.array(dataX)
Train_Y = pd.DataFrame(dataY).values
return TrainX, Train_Y
df = pd.read_csv('train_data.csv')
train_size = int(len(df) * 0.98)
train = df.iloc[:train_size, :]
test = df.iloc[train_size:, :]
train_y = df.iloc[:train_size, 0].values.reshape(train_size, 1)
test_y = df.iloc[train_size:, 0].values.reshape(-1, 1)
# 归一化
train_x, train_y, train_y_MinMax = fit_size(train, train_y)
test_x, test_y, test_y_MinMax = fit_size(test, test_y)
# TRAIN
INPUT_DIMS = 3
look_back = 240
train_X, train_Y = create_dataset(train_x, train_y, look_back)
train_X = train_X.astype('float64')
m = attention_model()
m.summary()
m.compile(loss='mae', optimizer='Adam')
# fit the network
hist = m.fit(train_X, train_Y, epochs=222, batch_size=256, validation_split=0.1,
callbacks=[EarlyStopping(monitor='loss', patience=7, restore_best_weights=True)])
file_name = str(look_back) + '_60'
m.save(r'/'+file_name + '.h5')
test_X, test_Y = create_dataset(test_x, test_y, look_back)
pred_y = m.predict(test_X)
inv_pred_y = test_y_MinMax.inverse_transform(pred_y)
one_pred_y = []
time02_index = []
time02_price = []
for i in range(0, len(inv_pred_y), 60):
one_pred_y[0:0] = inv_pred_y[i]
for n in range(len(one_pred_y) - 1):
price = one_pred_y[n]
next_price = one_pred_y[n + 1]
percent = abs((next_price - price) / price)
if percent > 0.002:
time02_index.append(n)
time02_price.append(price)
# A预测60秒内涨幅超过0.2%的买入信号,记录下时间。
# B找出60秒内跌幅超过0.2%的卖出信号,记录下时间
inv_test_Y = test_y_MinMax.inverse_transform(test_Y)
one_test_y = []
time02_index_test = []
time02_price_test = []
for i in range(0, len(inv_test_Y), 60):
one_test_y[0:0] = inv_test_Y[i]
for n in range(len(one_test_y) - 1):
price = one_test_y[n]
next_price = one_test_y[n + 1]
percent = abs((next_price - price) / price)
if percent > 0.002:
time02_index_test.append(n)
time02_price_test.append(price)
# C 绘制预测60秒后价格和真实价格对比图,标记预计涨跌时间点,同一个60秒内只绘制一次买入信号。
plt.figure(figsize=(10, 10))
plt.scatter(time02_index, time02_price, color="blue", label="Sample Point", linewidth=3)
plt.scatter(time02_index_test, time02_price_test, color="orange", label="Sample Point", linewidth=3)
plt.plot(one_pred_y, color="red")
plt.plot(one_test_y, color="green")
plt.title('real vs pred test')
plt.ylabel('price')
plt.xlabel('seconds')
plt.legend(['pred', 'real'], loc='lower right')
plt.savefig(r'/'+file_name + "_real_pred.png", dpi=500, bbox_inches='tight')
plt.show()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
有问题请关注然后私聊我,包此代码的答疑服务,基本秒回,不满意加球球包退款,可接受定制服务 此文件多输出代码示例: x = Conv1D(filters=64, kernel_size=1, activation='relu')(inputs) # , padding = 'same' x = Dropout(0.3)(x) lstm_out = Bidirectional(CuDNNLSTM(64, return_sequences=True))(x) lstm_out = Dropout(0.3)(lstm_out) attention_mul = attention_3d_block(lstm_out) attention_mul = Flatten()(attention_mul) output = Dense(60, activation='linear')(attention_mul) model = Model(inputs=[inputs], outputs=output) return model
资源推荐
资源详情
资源评论
收起资源包目录
多特征时序块多输出CNN-bilstm-attention.zip (2个子文件)
多特征时序块多输出CNN-bilstm-attention
cnn_bilstm_btc.py 5KB
train_data.csv 3.83MB
共 2 条
- 1
资源评论
AI信仰者
- 粉丝: 1w+
- 资源: 143
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功