如何基于TensorFlow实现股票涨跌/价格预测及解读预测代码
基于LSTM的股票涨跌二分类模型:使用方法与预测逻辑解析
一、你的训练代码说明
你写的这段TensorFlow代码,核心是用过去10天的股票特征(开盘/最高/最低/收盘价、成交量),预测10天后股价是否上涨的二分类模型,代码如下:
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from tensorflow.keras.layers import Input, LSTM, Dense from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam df = pd.read_csv('....csv') input_data = df[['open', 'high', 'low', 'close', 'volume']].values targets = df['Return'].values T = 10 D = input_data.shape[1] N = len(input_data) - T Ntrain = len(input_data) * 2 // 3 scaler = StandardScaler() scaler.fit(input_data[:Ntrain + T - 1]) input_data = scaler.transform(input_data) X_train = np.zeros((Ntrain, T, D)) Y_train = np.zeros(Ntrain) for t in range(Ntrain): X_train[t, :, :] = input_data[t:t+T] Y_train[t] = (targets[t+T] > 0) X_test = np.zeros((N - Ntrain, T, D)) Y_test = np.zeros(N - Ntrain) for u in range(N - Ntrain): t = u + Ntrain X_test[u, :, :] = input_data[t:t+T] Y_test[u] = (targets[t+T] > 0) i = Input(shape=(T, D)) x = LSTM(50)(i) x = Dense(1, activation='sigmoid')(x) model = Model(i, x) model.compile( loss='binary_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy'], ) r = model.fit( X_train, Y_train, batch_size=32, epochs=300, validation_data=(X_test, Y_test), )
二、模型的两种使用方向
1. 涨跌判断(当前模型的核心能力)
当前模型是二分类模型,最后一层用sigmoid激活,输出的是「10天后股价上涨的概率」(范围0-1),判断逻辑很直接:
- 当预测概率>0.5时,判定为上涨;
- 当预测概率≤0.5时,判定为下跌。
2. 股价预测(需修改模型)
当前模型只能预测涨跌方向,不能直接预测股价数值。如果要做股价预测,需要调整3个地方:
- 把目标
targets改成t+T时刻的收盘价(或你想预测的具体价格); - 最后一层去掉
sigmoid激活,改用activation='linear'; - 损失函数换成
loss='mse'(均方误差,回归任务的常用损失)。
三、你写的预测代码逻辑拆解
先看你的预测代码:
outputs = model.predict(X_test) print(outputs.shape) predictions = outputs[:,0] plt.plot(Y_test, label='targets') plt.plot(predictions, label='predictions') plt.legend() plt.show()
逐行解释:
outputs = model.predict(X_test):用训练好的模型对测试集做预测,X_test里是每组「过去10天的特征数据」,输出的是每个样本对应的「上涨概率」,形状为(测试样本数, 1)(因为最后一层只有1个神经元)。print(outputs.shape):打印输出的维度,方便确认结果格式,比如测试集有100个样本的话,形状就是(100, 1)。predictions = outputs[:,0]:把二维数组转换成一维数组,方便后续绘图,比如把[[0.6], [0.3], ...]变成[0.6, 0.3, ...]。- 绘图部分:把真实涨跌标签(
Y_test,1代表涨,0代表跌)和预测的上涨概率画在一起,直观对比模型预测和真实情况的趋势匹配度。
四、正确的预测操作步骤
1. 对测试集做涨跌判断并验证效果
在你现有代码基础上,增加涨跌判断和准确率计算:
import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score outputs = model.predict(X_test) predictions = outputs[:,0] # 生成涨跌判断结果(1=涨,0=跌) predicted_up = (predictions > 0.5).astype(int) # 计算测试集准确率 acc = accuracy_score(Y_test, predicted_up) print(f"测试集准确率:{acc:.2f}") # 查看前10个样本的预测与真实值 print("真实涨跌:", Y_test[:10]) print("预测涨跌:", predicted_up[:10]) # 绘图对比 plt.plot(Y_test, label='真实涨跌', alpha=0.5) plt.plot(predictions, label='上涨概率', alpha=0.5) plt.plot(predicted_up, label='预测涨跌', linestyle='--') plt.legend() plt.show()
2. 对新数据做实时涨跌预测
如果要对未见过的新股票数据做预测,必须遵循和训练时一致的预处理步骤(不能重新训练标准化器):
# 假设new_data是新的股票数据,包含['open', 'high', 'low', 'close', 'volume']列 new_input = new_data[['open', 'high', 'low', 'close', 'volume']].values # 用训练时的scaler做标准化(必须用同一个!) new_input_scaled = scaler.transform(new_input) # 取最后10天的数据作为输入,预测下一天涨跌 if len(new_input_scaled) >= T: # 转换成模型需要的形状:(1, 10, 5) X_new = new_input_scaled[-T:].reshape(1, T, D) pred_prob = model.predict(X_new)[0][0] if pred_prob > 0.5: print(f"预测上涨,概率:{pred_prob:.2f}") else: print(f"预测下跌,概率:{pred_prob:.2f}") else: print("数据不足,需要至少10天的特征数据")
内容的提问来源于stack exchange,提问作者tow
相关产品推荐
相关产品推荐

