楼主: duanll13
1081 2

[源码分享] 【转载+评论】Keras深度学习LSTM模型 预测黄金主力收盘价 [推广有奖]

  • 4关注
  • 0粉丝

本科生

98%

还不是VIP/贵宾

-

威望
0
论坛币
105 个
通用积分
2.2006
学术水平
1 点
热心指数
3 点
信用等级
0 点
经验
5099 点
帖子
51
精华
0
在线时间
169 小时
注册时间
2014-2-28
最后登录
2023-11-28

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
评论:直接预测价格很容易收敛至前一时刻的价格,即用t-1时刻的价格来预测t时刻价格,不过本文可作为keras入门参考


原文地址:https://www.joinquant.com/view/community/detail/2e996d21c95a409ba23a651085ab9f61
1 数据源:黄金主力数据 来源于JQData

2 数据清洗

3 使用黄金主力数据 进⾏预测的2个实验

数据集:70%用做训练集 训练模型 ;30%测试集。

模型:Keras框架, 用LSTM模型对收盘价进行预测
循环神经⽹网络,RNN(Recurrent Neural Network)中的LSTM(Long Short-Term Memory)

实验结果:是测试集的结果。test为测试集的真实收盘价,pred为模型预测的收盘价

实验1:

使用历史前5个时刻的收盘价

预测当前时刻的收盘价
每组输入包括5个step,每个step对应⼀一收盘价,输出⼀一维,即 [None, 5, 1] => [None, 1]
from keras.layers import Input, Dense, LSTM
from keras.models import Model
output_dim = 1
batch_size = 256
epochs = 10
seq_len = 5
hidden_size = 128
X_train = np.array([data_train[i : i + seq_len, 0] for i in range(data_train.shape[0] - seq_len)])[:, :, np.newaxis]
y_train = np.array([data_train[i + seq_len, 0] for i in range(data_train.shape[0]- seq_len)])
X_test = np.array([data_test[i : i + seq_len, 0] for i in range(data_test.shape[0]- seq_len)])[:, :, np.newaxis]
y_test = np.array([data_test[i + seq_len, 0] for i in range(data_test.shape[0] - seq_len)])
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
X = Input(shape=[X_train.shape[1], X_train.shape[2],])
h = LSTM(hidden_size, activation='relu')(X)
Y = Dense(output_dim, activation='sigmoid')(h)
model = Model(X, Y)
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, shuffle=False)
y_pred = model.predict(X_test)
print('MSE Train:', model.evaluate(X_train, y_train, batch_size=batch_size))
print('MSE Test:', model.evaluate(X_test, y_test, batch_size=batch_size))
plt.plot(y_test, label='test')
plt.plot(y_pred, label='pred')
plt.legend()
plt.show()
实验结果:是测试集的结果。test为测试集的真实收盘价,pred为模型预测的收盘价
实验1.png

实验2:

使⽤历史前5个时刻的 open close high low volume money
预测当前时刻的收盘价,
即 [None, 5, 6] => [None, 1]
from keras.layers import Input, Dense, LSTM
from keras.models import Model
output_dim = 1
batch_size = 256
epochs = 10
seq_len = 5
hidden_size = 128

X_train = np.array([data_train[i : i + seq_len, :] for i in range(data_train.shape[0] - seq_len)])
y_train = np.array([data_train[i + seq_len, 0] for i in range(data_train.shape[0]- seq_len)])
X_test = np.array([data_test[i : i + seq_len, :] for i in range(data_test.shape[0]- seq_len)])
y_test = np.array([data_test[i + seq_len, 0] for i in range(data_test.shape[0] - seq_len)])

print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)


X = Input(shape=[X_train.shape[1], X_train.shape[2],])
h = LSTM(hidden_size, activation='relu')(X)
Y = Dense(output_dim, activation='sigmoid')(h)
model = Model(X, Y)


model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, shuffle=False)
y_pred = model.predict(X_test)
print('MSE Train:', model.evaluate(X_train, y_train, batch_size=batch_size))
print('MSE Test:', model.evaluate(X_test, y_test, batch_size=batch_size))
plt.plot(y_test, label='test')
plt.plot(y_pred, label='pred')
plt.legend()
plt.show()
实验结果:是测试集的结果。test为测试集的真实收盘价,pred为模型预测的收盘价 实验2.png







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
quartier13 发表于 2019-12-24 12:19:03 |只看作者 |坛友微信交流群
这个事情我之前也做过,感觉不靠谱。。。。
我之前做的情况是,节选一段区间,放大来看,预测的结果就是滞后TRUE LABEL的情况.

类似于pd.Series.shift(x)的样子。

然后可能还会把你的波动给降低,估计和trend和seasonality的判定有关。

可解释性不是特别高。

我感觉可以加入汇率,利率等宏观因子。但是这样一搞,feature和label的频率就不对了。

使用道具

藤椅
quartier13 发表于 2019-12-24 12:21:24 |只看作者 |坛友微信交流群
而且他这个LSTM_INPUT写的很糟糕,还不如看GOOGLE官网如下/。

https://www.tensorflow.org/tutorials/structured_data/time_series

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 21:37