m0_74420115 2024-05-07 19:16 采纳率: 71.9%
浏览 2
已结题

python对股票价格进行分析

用LSTM预测股票价格,怎么用python对这个预测的结果进行分析,看这个模型拟合的好不好

import pandas as pd
def parse_date(date_string):
    return pd.Timestamp(date_string.replace('_', '-'))
df = pd.read_csv('D:/LSTMdata.csv', index_col='Date', parse_dates=True, date_parser=parse_date)
df.sort_index(inplace=True)
def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):
    df.dropna(inplace=True)
    df.sort_index(inplace=True)
    df['label']= df['Close'].shift(-pre_days)
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    sca_X=scaler.fit_transform(df.iloc[:,:-1])
    
    
    mem_his_days = 10
    
    from collections import deque
    deq = deque(maxlen=mem_his_days)
    
    X = []
    for i in sca_X:
        deq.append(list(i))
        if len(deq)==mem_his_days:
            X.append(list(deq))
    X_lately = X[-pre_days:]
    X = X[:-pre_days]
    y = df['label'].values[mem_his_days-1:-pre_days]
    
    
    import numpy as np
    X = np.array(X)
    y = np.array(y)
    return X,y,X_lately
X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,5,10)
print(len(X))
print(len(y))
print(len(X_lately))
pre_days = 10
mem_days=[5,10,15]
lstm_layers=[1,2,3]
dense_layers=[1,2,3]
units = [16,32]
# mem_days=[10]
# lstm_layers=[1]
# dense_layers=[1]
# units = [32]

from tensorflow.keras.callbacks import ModelCheckpoint
for the_mem_days in mem_days:
    for the_lstm_layers in lstm_layers:
        for the_dense_layers in dense_layers:
            for the_units in units:
                filepath=filepath=f"./theLSTMbestmodel1/{{val_mape:.2f}}{{epoch:02d}}men{the_mem_days}lstm{the_lstm_layers}dense{the_dense_layers}unit{the_units}.keras"
                checkpoint = ModelCheckpoint(
                    filepath=filepath,
                    save_weights_only=False,
                    monitor='val_mape',
                    mode='min',
                    save_best_only=True)
                X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,the_mem_days,pre_days)
                from sklearn.model_selection import train_test_split
                X_train,X_test,y_train,y_test = train_test_split(X,y,shuffle=False,test_size=0.1)
                import tensorflow as tf
                from tensorflow.keras.models import Sequential
                from tensorflow.keras.layers import LSTM,Dense,Dropout
                model = Sequential()
                model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))
                model.add(Dropout(0.1))
                for i in range(the_lstm_layers):
                    model.add(LSTM(the_units,activation='relu',return_sequences=True))
                    model.add(Dropout(0.1))
                
                model.add(LSTM(the_units,activation='relu'))
                model.add(Dropout(0.1))
                for i in range(the_dense_layers):
                    model.add(Dense(the_units,activation='relu'))
                    model.add(Dropout(0.1))
                
                model.add(Dense(1))
                model.compile(optimizer='adam',
                             loss='mse',
                             metrics=['mape'])
                model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])
from tensorflow.keras.models import load_model
best_model = load_model('./theLSTMbestmodel1/2.4436men10lstm1dense1unit32.keras')
best_model.summary()
best_model.evaluate(X_test,y_test)
pre = best_model.predict(X_test)
print(len(pre))
import matplotlib.pyplot as plt
df_time = df.index[- len(y_test):]
plt.plot(df_time,y_test,color='red',label='price')
plt.plot(df_time,pre,color='green',label='predict')
plt.show()

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-07 19:16
    关注

    引自免费微信小程序:皆我百晓生

    在Python中使用LSTM(长短期记忆)网络预测股票价格后,我们可以通过几个步骤来评估模型的性能并分析其拟合情况。首先,我们需要了解一些基本指标,如均方误差(MSE)、平均绝对百分比误差(MAPE)以及绘制实际值与预测值的时间序列图表。接下来,我将逐步解释如何执行这些操作。

    1. 计算评估指标: 我们可以使用evaluate()函数来获取模型在测试集上的MSE和MAPE。
    # 获取模型的MSE和MAPE
    loss, mape = best_model.evaluate(X_test, y_test)
    print(f"MSE: {loss}")
    print(f"MAPE: {mape * 100}%")  # 将MAPE转换为百分比形式
    
    1. 绘制时间序列图表: 绘制实际价格与预测价格的时间序列可以帮助我们直观地观察模型的预测效果。
    # 定义绘图函数
    def plot_price_predictions(df_time, actual, predicted, title):
        plt.figure(figsize=(12, 6))
        plt.plot(df_time, actual, color='red', label='Actual Price')
        plt.plot(df_time, predicted, color='green', label='Predicted Price')
        plt.title(title)
        plt.xlabel("Time")
        plt.ylabel("Price")
        plt.legend()
        plt.grid(True)
        plt.show()
    
    # 绘制实际价格与预测价格的时间序列
    plot_price_predictions(df_time, y_test, pre, 'Stock Price Predictions')
    
    1. 可视化不同参数组合的效果: 如果你想要比较不同模型参数(如内存历史天数、LSTM层数量、全连接层数量和单元大小)下的表现,可以创建一个表格或折线图来展示不同配置下的MAPE。这有助于选择最佳的模型架构。
    # 假设你已经有了所有模型的MAPE结果存储在一个列表中,例如:all_mapes
    all_mapes = [...]  # 这里应替换为你之前训练的所有模型的MAPE
    
    # 创建一个DataFrame来保存结果
    results_df = pd.DataFrame({
        'Memory Days': mem_days,
        'LSTM Layers': lstm_layers,
        'Dense Layers': dense_layers,
        'Units': units,
        'MAPE': all_mapes
    })
    
    # 按照MAPE排序
    results_df = results_df.sort_values(by='MAPE')
    
    # 打印结果
    print(results_df)
    
    # 绘制折线图
    results_df.plot(x=['Memory Days', 'LSTM Layers', 'Dense Layers', 'Units'], y='MAPE', kind='line', legend=False)
    plt.title('Model Performance Comparison')
    plt.xlabel('Parameters')
    plt.ylabel('MAPE')
    plt.xticks(rotation=90)
    plt.show()
    

    通过以上步骤,你可以全面评估LSTM模型对股票价格预测的性能,并根据可视化结果判断模型是否良好地拟合了数据。如果需要进一步优化,可以根据上述分析结果调整模型参数,然后重新训练和评估。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 5月7日