用jupyter写一个用BP预测多维股票价格的代码,其中评价指标要有mape,mae,rmse,r2,并画出拟合效果图。
时间: 2024-04-10 16:28:14 浏览: 19
以下是使用BP神经网络进行多维股票价格预测的代码,并计算了MAPE、MAE、RMSE和R2这四个评价指标,并绘制了拟合效果图。请注意,这只是一个示例代码,实际使用中可能需要根据具体情况进行调整。
```python
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_percentage_error, mean_absolute_error, mean_squared_error, r2_score
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 加载数据
data = pd.read_csv('stock_prices.csv') # 假设数据保存在stock_prices.csv文件中
# 数据预处理
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)
# 划分训练集和测试集
train_data, test_data = train_test_split(scaled_data, test_size=0.2, shuffle=False)
# 准备训练集和测试集的输入和输出数据
train_X = train_data[:, :-1]
train_y = train_data[:, -1]
test_X = test_data[:, :-1]
test_y = test_data[:, -1]
# 构建BP神经网络模型
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=train_X.shape[1]))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='linear'))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(train_X, train_y, epochs=100, batch_size=32, verbose=0)
# 使用模型进行预测
train_pred = model.predict(train_X)
test_pred = model.predict(test_X)
# 反归一化
train_pred = scaler.inverse_transform(train_pred)
train_y = scaler.inverse_transform([train_y])
test_pred = scaler.inverse_transform(test_pred)
test_y = scaler.inverse_transform([test_y])
# 计算评价指标
mape_train = mean_absolute_percentage_error(train_y[0], train_pred[:, 0])
mape_test = mean_absolute_percentage_error(test_y[0], test_pred[:, 0])
mae_train = mean_absolute_error(train_y[0], train_pred[:, 0])
mae_test = mean_absolute_error(test_y[0], test_pred[:, 0])
rmse_train = np.sqrt(mean_squared_error(train_y[0], train_pred[:, 0]))
rmse_test = np.sqrt(mean_squared_error(test_y[0], test_pred[:, 0]))
r2_train = r2_score(train_y[0], train_pred[:, 0])
r2_test = r2_score(test_y[0], test_pred[:, 0])
print("Train MAPE: %.4f" % mape_train)
print("Test MAPE: %.4f" % mape_test)
print("Train MAE: %.4f" % mae_train)
print("Test MAE: %.4f" % mae_test)
print("Train RMSE: %.4f" % rmse_train)
print("Test RMSE: %.4f" % rmse_test)
print("Train R2: %.4f" % r2_train)
print("Test R2: %.4f" % r2_test)
# 绘制拟合效果图
plt.figure(figsize=(10, 6))
plt.plot(train_y[0], label="Actual train prices")
plt.plot(train_pred[:, 0], label="Predicted train prices")
plt.plot(len(train_y[0]) + np.arange(len(test_y[0])), test_y[0], label="Actual test prices")
plt.plot(len(train_y[0]) + np.arange(len(test_y[0])), test_pred[:, 0], label="Predicted test prices")
plt.xlabel("Time")
plt.ylabel("Stock Price")
plt.title("Stock Price Prediction")
plt.legend()
plt.show()
```
请确保将实际的股票价格数据保存在名为"stock_prices.csv"的文件中,并根据需要对代码进行适当的调整。