You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:27:53