写一个预测原油期货的程序,用GRU
时间: 2023-12-27 15:00:17 浏览: 22
作为模型
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, GRU, Dropout
# 读取数据
df = pd.read_csv('CrudeOilPrices.csv')
# 数据预处理
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df = df.asfreq('D')
df = df.interpolate()
df = df.dropna()
# 数据归一化
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)
# 划分训练集和测试集
train_size = int(len(df_scaled) * 0.8)
train = df_scaled[:train_size, :]
test = df_scaled[train_size:, :]
# 定义函数生成数据集
def create_dataset(dataset, time_steps=1):
X, y = [], []
for i in range(len(dataset) - time_steps):
X.append(dataset[i:(i + time_steps), :])
y.append(dataset[i + time_steps, :])
return np.array(X), np.array(y)
# 生成训练集和测试集
time_steps = 30
X_train, y_train = create_dataset(train, time_steps)
X_test, y_test = create_dataset(test, time_steps)
# 构建模型
model = Sequential()
model.add(GRU(units=128, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(GRU(units=64, return_sequences=True))
model.add(Dropout(0.2))
model.add(GRU(units=32))
model.add(Dropout(0.2))
model.add(Dense(units=1))
# 编译模型
model.compile(optimizer='adam', loss='mse')
# 训练模型
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1)
# 预测
y_pred = model.predict(X_test)
# 反归一化
y_pred = scaler.inverse_transform(y_pred)
y_test = scaler.inverse_transform(y_test)
# 绘制预测结果和实际结果
plt.figure(figsize=(12, 6))
plt.plot(y_test, label='Actual')
plt.plot(y_pred, label='Predicted')
plt.legend()
plt.show()