我用一早上时间做了个股价预测,居然这么准?

本文介绍了利用LSTM进行时间序列预测,如IBM股价和英镑汇率。通过训练2006-2016年的IBM股价数据,模型在2017年的测试集上表现良好。对于汇率预测,使用过去180天的数据预测接下来30天的趋势,虽然能捕捉到变化趋势,但具体数值预测存在误差。实际应用中,需要注意学习率调整以适应汇率数据的小幅波动。

最近因为做项目的需要,要做一些数据预测,因此就去学习了一下相关的知识。主要就是采用LSTM来做时间序列的预测。

IBM股价预测

数据集选择的是IBM2006-2018年的股价数据,我这里算的是每日的最高股价。其中,2006-2016年的数据是训练集,2017年的是测试集。

模型搭建如下:

然后就是对数据进行预处理(归一化),接着进行训练。在训练的时候采用了一些小技巧:采用了学习率逐渐衰减的方式,使得loss更小。

在不同epoch下,对2017年的数据进行预测的结果像下面的图片中所示的那样:(根据之前60天的真实数据来预测第二天的数据)

其中,蓝色的是真实曲线,绿色的是预测曲线。

500个epoch

5000个epoch

10000个epoch

12000个epoch

最终可以看到,12000个epoch之后,预测曲线和真实曲线已经非常的贴近了,说明,这个简单的模型,确实能够达到一个很不错的预测效果。

预测接下来一个月的英镑汇率

上面的股价预测,是基于前面60天的真实数据来预测下一天的真实数据。那么要是预测接下来一个月的汇率呢?

从理论上来讲,只需要将模型的输出数据从1个数据,修改成30个数据的序列,就能预测接下来一个月的汇率了。

汇率和股票相比,它的变化幅度不大,因此,如果我们的learning rate开的还像股票预测那么大的话,就很难收敛。

首先是去英为财情的网站下载了2005年1月1日到今天(2022年1月3日)的汇率数据。然后,丢进去训练了2200个epoch。

我设计的是根据过去180天的数据来预测接下来一个月的价格走势。由于预测的是接下来的30天,并且汇率本身的变化程度就比较小(每天相差几分钱),因此,在测试集上,只能说是预测的变化趋势基本一致,但是具体的值的话,预测的不准。

于是乎,我就预测了一下接下来一个月的英镑汇率:

具体它准不准,那就看看接下来的汇率是不是这么一回事吧!

大概率是不准确的,大家不要把这个当成投资的依据,否则一切后果自负

2022年1月4日,汇率:8.586546897888184
2022年1月5日,汇率:8.583914756774902
2022年1月6日,汇率:8.588775634765625
2022年1月7日,汇率:8.57702350616455
2022年1月8日,汇率:8.591371536254883
2022年1月9日,汇率:8.568089485168457
2022年1月10日,汇率:8.572650909423828
2022年1月11日,汇率:8.583415985107422
2022年1月12日,汇率:8.590611457824707
2022年1月13日,汇率:8.589016914367676
2022年1月14日,汇率:8.576234817504883
2022年1月15日,汇率:8.588798522949219
2022年1月16日,汇率:8.577808380126953
2022年1月17日,汇率:8.56200885772705
2022年1月18日,汇率:8.592248916625977
2022年1月19日,汇率:8.568221092224121
2022年1月20日,汇率:8.589277267456055
2022年1月21日,汇率:8.568589210510254
2022年1月22日,汇率:8.582256317138672
2022年1月23日,汇率:8.5689115524292
2022年1月24日,汇率:8.572840690612793
2022年1月25日,汇率:8.592175483703613
2022年1月26日,汇率:8.570953369140625
2022年1月27日,汇率:8.586837768554688
2022年1月28日,汇率:8.586097717285156
2022年1月29日,汇率:8.574344635009766
2022年1月30日,汇率:8.566436767578125
2022年1月31日,汇率:8.553132057189941
2022年2月1日,汇率:8.57451343536377
2022年2月2日,汇率:8.544835090637207

转载请注明原文:使用LSTM进行股价、汇率预测 | 龙进的博客

<think>好的,我现在需要帮助用户使用PyTorch构建一个RNN股价预测模型。首先,我得回顾一下用户之前的对话历史。用户之前已经询问过如何写一个基础的RNN网络,我给出了详细的步骤和代码示例。现在用户的问题更具体了,是关于股价预测的,所以需要结合RNN在时间序列预测中的应用。 首先,我需要确定用户的需求是什么。股价预测通常属于时间序列预测问题,RNN在这里的应用主要是处理序列数据,捕捉时间上的依赖关系。用户可能希望得到一个端到端的模型,从数据预处理到模型构建、训练和预测的全流程指导。 接下来,我得考虑用户可能的背景。用户可能已经了解了一些RNN的基础知识,但需要具体的应用实例。他们可能对如何处理时间序列数据、如何设计网络结构、如何评估模型效果等方面存在疑问。此外,用户可能对实际应用中的注意事项,比如数据归一化、窗口划分、过拟合处理等不太清楚。 然后,我需要规划回答的结构。通常,一个完整的指南应该包括数据预处理、模型构建、训练循环、预测与可视化等部分。同时,还需要指出RNN在股价预测中的局限性,比如处理长期依赖的能力较弱,可能推荐使用LSTM或GRU,并给出改进方向。 在数据预处理部分,需要说明如何加载数据、归一化处理、划分时间窗口生成输入输出对。这里要注意的是,股价数据通常是单变量的,所以输入特征可能只有过去几天的价格,输出是未来一天的价格。需要指导用户如何将时间序列转化为有监督学习的数据格式。 模型构建方面,用户之前已经有一个基础的RNN实现,所以可以在此基础进行调整,比如修改输入输出的维度,添加Dropout层防止过拟合,或者直接使用LSTM单元。需要解释为什么选择某些参数,比如hidden_size的大小,以及如何堆叠多层RNN。 训练过程中,要选择合适的损失函数(如均方误差)和优化器,设置合适的学习率和训练轮次。还需要提到如何监控训练损失,进行早停等技巧。预测阶段需要将输出反归一化,恢复原始数据尺度,并可视化结果。 同时,必须强调股价预测的挑战性,比如市场的高随机性,模型只能捕捉趋势而非预测,避免用户有过高期望。此外,给出改进建议,比如使用更多特征(成交量、技术指标)、尝试Transformer模型等,帮助用户进一步探索。 最后,检查代码示例的正确性,确保用户可以直接运行,并指出可能的错误点,比如数据归一化的范围、张量形状的匹配问题。还要提醒用户在实际应用中的注意事项,如实时数据更新、模型重新训练等。 现在,我需要将这些思考整理成一个结构化的回答,确保步骤清晰,代码可执行,并覆盖用户可能关心的所有方面。同时,保持语言简洁,用中文表达,符合用户的要求。</think>以下是一个使用PyTorch实现RNN股价预测模型的完整指南,包含数据预处理、模型构建和训练的全流程: --- ### **1. 数据预处理(关键步骤)** #### **(1) 加载股价数据** ```python import pandas as pd import numpy as np # 示例数据(替换为真实数据路径) data = pd.read_csv("stock_prices.csv") prices = data['Close'].values.astype(float) ``` #### **(2) 数据归一化** ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(-1, 1)) # RNN对零中心化数据更敏感 scaled_prices = scaler.fit_transform(prices.reshape(-1, 1)) ``` #### **(3) 创建时间窗口** ```python def create_sequences(data, window_size=60): sequences = [] labels = [] for i in range(len(data)-window_size): sequences.append(data[i:i+window_size]) labels.append(data[i+window_size]) return np.array(sequences), np.array(labels) window_size = 60 # 使用60天数据预测第61天 X, y = create_sequences(scaled_prices, window_size) ``` #### **(4) 数据集划分** ```python split = int(0.8 * len(X)) X_train, X_test = X[:split], X[split:] y_train, y_test = y[:split], y[split:] ``` --- ### **2. PyTorch模型实现** #### **(1) 定义RNN模型** ```python class StockPredictor(nn.Module): def __init__(self, input_size=1, hidden_size=64, output_size=1, num_layers=2): super().__init__() self.rnn = nn.RNN( input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True, dropout=0.2 # 防止过拟合 ) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(self.rnn.num_layers, x.size(0), self.rnn.hidden_size) out, _ = self.rnn(x, h0) out = self.fc(out[:, -1, :]) # 取最后一个时间步 return out ``` #### **(2) 模型参数** | 参数 | 典型值 | 说明 | |----------------|---------|------------------------| | `input_size` | 1 | 单变量时间序列(收盘价) | | `hidden_size` | 64 | 隐藏层维度(可调超参数) | | `num_layers` | 2 | RNN堆叠层数 | | `window_size` | 60 | 历史窗口天数 | --- ### **3. 模型训练** #### **(1) 数据转换** ```python train_data = torch.Tensor(X_train).unsqueeze(-1) # 形状:(样本数, 窗口数, 特征数) test_data = torch.Tensor(X_test).unsqueeze(-1) train_labels = torch.Tensor(y_train) ``` #### **(2) 训练配置** ```python model = StockPredictor() criterion = nn.MSELoss() # 回归任务使用均方误差 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` #### **(3) 训练循环** ```python epochs = 100 for epoch in range(epochs): model.train() outputs = model(train_data) loss = criterion(outputs, train_labels) optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5) # 梯度裁剪 optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') ``` --- ### **4. 预测与评估** #### **(1) 进行预测** ```python model.eval() with torch.no_grad(): test_preds = model(test_data) test_loss = criterion(test_preds, torch.Tensor(y_test)) print(f'Test Loss: {test_loss.item():.4f}') ``` #### **(2) 结果反归一化** ```python real_preds = scaler.inverse_transform(test_preds.numpy()) real_labels = scaler.inverse_transform(y_test) ``` #### **(3) 可视化** ```python import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) plt.plot(real_labels, label="True Price") plt.plot(real_preds, label="Predicted Price") plt.legend() plt.show() ``` --- ### **5. 改进方向** 1. **特征工程**: - 添加成交量、移动平均线等特征 - 使用技术指标(RSI、MACD) 2. **模型升级**: - 替换为LSTM/GRU:`nn.LSTM`或`nn.GRU` - 添加注意力机制 3. **训练优化**: - 使用滑动窗口验证 - 添加早停机制(Early Stopping) 4. **多变量输入**: ```python input_size = 5 # 包含开盘价、收盘价、最高价、最低价、成交量 ``` --- ### **6. 注意事项** 1. **股价预测的局限性**: - 金融市场具有强随机性 - 模型主要捕捉趋势而非精预测 2. **数据时效性**: - 需定期用新数据重新训练 3. **过拟合防范**: - 使用Dropout层 - 监控训练/验证损失曲线 完整代码需要结合实际数据调整参数。建议优先尝试LSTM实现(将`nn.RNN`改为`nn.LSTM`),其对长期依赖的处理能力更强。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值