用循环神经网络预测股价
创作时间:
作者:
@小白创作中心
用循环神经网络预测股价
引用
CSDN
1.
https://blog.csdn.net/weixin_42255757/article/details/139242867
循环神经网络(RNN)和长短期记忆网络(LSTM)是处理时间序列数据的强大工具。本文将详细介绍如何使用这两种模型预测股票价格,通过对比RNN和LSTM的预测效果,展示LSTM在处理时间序列数据时的优势。
数据获取与预处理
首先,我们需要获取股票数据。这里使用akshare接口来获取数据,选择浙大网新(股票代码:600797)从2021年1月1日到当前的股票数据。
df_hs300 = ak.stock_zh_a_hist(symbol="600797", period="daily", start_date="20210101", end_date=datetime.datetime.today().strftime("%Y%m%d"), adjust="")
获取数据后,我们只需要收盘价和日期两个字段,并对收盘价进行归一化处理:
close_list = df_hs300['收盘'].values
date_list = df_hs300['日期'].values
close_list_norm=[price/max(close_list) for price in close_list]
可视化处理后的数据:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(close_list_norm)
plt.title('hs_300')
plt.xlabel('date')
plt.ylabel('colse price')
plt.show()
数据集定义
接下来,定义一个Dataset和DataLoader,选择前10天的收盘价来预测下一个交易日的收盘价,使用前700个数据作为训练数据集:
from torch.utils.data import Dataset, DataLoader
class StockDataset(Dataset):
def __init__(self, data_list, time_step = 10, transform=None):
self.data = data_list
self.features = []
self.targets = []
for i in range(len(self.data)-time_step):
feature = [x for x in self.data[i:i+time_step]]
y = self.data[i+time_step]
self.features.append(feature)
self.targets.append(y)
self.features = torch.tensor(self.features)
self.features = self.features.reshape(-1, time_step, 1)
def __len__(self):
return len(self.features)
def __getitem__(self, idx):
return self.features[idx], self.targets[idx]
transform = transforms.Compose([transforms.ToTensor()])
dataset = StockDataset(close_list_norm[:700], time_step=10, transform=transform)
dataloader = torch.utils.data.DataLoader(dataset=dataset, batch_size=1, shuffle=True)
RNN模型定义与训练
定义一个简单的RNN模型:
time_step = 10
batch_size = 1
input_size,hidden_size,output_size=1,20,1
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.rnn=nn.RNN(
input_size=input_size,
hidden_size=hidden_size,
num_layers=1,
batch_first=True
)
self.linear=nn.Linear(hidden_size,output_size)
def forward(self,X,hidden_prev):
out,ht=self.rnn(X,hidden_prev)
batch_size, seq, hidden_size = out.shape
out = self.linear(out[:, -1, :])
return out
训练模型:
model=Net()
model=model.cuda()
criterion=nn.MSELoss()
learning_rate,epochs=0.01,500
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)
for epoch in range(epochs):
losses = []
for X,y in dataloader:
X = X.cuda()
y = y.cuda()
y=y.to(torch.float32)
X=X.to(torch.float32)
optimizer.zero_grad()
yy=model(X,hidden_prev)
yy=yy.cuda()
loss = criterion(y, yy)
model.zero_grad()
loss.backward()
optimizer.step()
losses.append(loss.item())
epoch_loss=sum(losses)/len(losses)
if epoch%50==0:
print("epoch:{},loss:{:.8f}".format(epoch+1,epoch_loss))
torch.save(model, "model2.pt")
验证RNN模型
定义验证数据集:
transform = transforms.Compose([transforms.ToTensor()])
val_dataset = StockDataset(close_list_norm[700:], time_step=10, transform=transform)
val_dataloader = torch.utils.data.DataLoader(dataset=val_dataset, batch_size=1, shuffle=False)
验证模型:
model = torch.load('model2.pt')
Val_y,Val_predict=[],[]
Val_max_price=max(close_list)
for X,y in val_dataloader:
with torch.no_grad():
X = X.cuda()
y=y.to(torch.float32)
X=X.to(torch.float32)
predict=model(X,hidden_prev)
y=y.cpu()
predict=predict.cpu()
Val_y.append(y[0][0]*Val_max_price)
Val_predict.append(predict[0][0]*Val_max_price)
fig=plt.figure(figsize=(8,5),dpi=80)
plt.plot(Val_y,linestyle='--',color='r')
plt.plot(Val_predict,color='g')
plt.title('stock price')
plt.xlabel('time')
plt.ylabel('price')
plt.show()
LSTM模型定义与训练
定义LSTM模型:
class Net_LSTM(nn.Module):
def __init__(self):
super(Net_LSTM,self).__init__()
self.lstm=nn.LSTM(
input_size=input_size,
hidden_size=hidden_size,
num_layers=1,
batch_first=True
)
self.linear=nn.Linear(hidden_size,output_size)
def forward(self,X):
out,ht=self.lstm(X)
batch_size, seq, hidden_size = out.shape
out = self.linear(out[:, -1, :])
return out
由于训练和验证的函数与RNN基本一致,这里不再赘述。下面是LSTM模型在验证集上的表现:
结论
可以看到,LSTM的效果确实比简单RNN要好很多。然而,需要注意的是,这只是一个简单的预测模型,不建议根据这个结果去进行投资。预测结果在细节上和原始数据还是有不少差别的,而且只能验证下一个交易日的情况,如果预测时间稍微拉长,效果就会急剧下降。此外,模型无法捕捉突发事件的影响。
热门推荐
博物学史焕发生机,研究前沿在哪儿?
郑成功收复台湾时带2.5万人,岛上荷兰仅千余人,为何打了8个月?
经济观察丨农业增效益、农民增收入、农村增活力, “川字号”特色产业图强
领匠酒文化课堂:酱香型白酒取酒的流程是什么?
离子交换色谱的原理介绍和实际操作
大学不同专业录取分数线一样吗?录取分数线和专业分数线用哪个?
核聚变100问(75):氚增殖技术对解决聚变堆的燃料供应问题有何贡献?
金球奖历史最佳11人中场:马拉多纳、贝利、哈维、马特乌斯
帕斯特·马尔多纳多在 F5 中的 1 个著名时刻
如何正确选择柔性拖链电缆?
鹿肉的营养价值与功效
减肥期间可以吃糖果吗?这份指南告诉你答案
此乃目前为止,氛围营造最牛逼的“伪人”游戏
ISP(Image Signal Processor)——HDR技术总结
可转换公司债券的概念和类型是什么
如何进行论文的文献综述写作?
js如何设置文本框页面自适应
如何通过亲密的父子称谓加深父子关系:孩子成长中的影响与价值
中段尿培养能检查什么
个人工资流水账单证明图片:详解及应用场景
漫画角色心理分析:从英雄到反派的成长轨迹
苦瓜点煮好?4招除苦味+两个简易食谱 保留苦瓜营养功效!
助力青年创业者!马驹计划聚焦大学生“文化+科技”赛道创新
OpenAI及Anthropic确认:AI模型发布前提交美国政府进行安全评估
全国各地科学教育活动精彩纷呈
生肖文化中的浪漫密码:如何用生肖头像展现独特情侣CP
天人合一,太极拳修炼中的内外能量!
如何评估国有企业的市场表现?广州国企在行业中的地位如何?
户外酒精炉使用技巧有哪些,还需要注意什么吗?
如何计算汽车油耗公式