介绍完上一节的理论后,我们来实际运用一下,运用ETFs的开高低收四个来预测下一个工作日的收盘价。此文只是写lstm的运用的一个例子,请不要运用于真实预测。。。因为ETFs,stock的价格不仅仅只是时序序列这么简单。
这个项目主要用了pytorch,是一个我本人比较喜欢感觉比较容易上手的深度学习框架。
- 数据读取以及处理:
# 导入相关包
读入ETFs数据,把时间作为index,只留下开高低收四个变量用于后续:
dates = pd.date_range('2010-10-11','2017-10-11',freq = 'B')
df_main = pd.DataFrame(index = dates)
df_aaxj = pd.read_csv("data/ETFs/aaxj.us.txt", parse_dates=True, index_col=0)
df_main = df_main.join(df_aaxj)
sel_col = ['Open', 'High', 'Low', 'Close']
df_main = df_main[sel_col]
得到df_main:
进行minmaxscaler,防止在之后的训练过程中不收敛:
df_main = df_main.fillna(method='ffill')
scaler = MinMaxScaler(feature_range=(-1, 1))
for col in sel_col:
df_main[col] = scaler.fit_transform(df_main[col].values.reshape(-1,1))
创造需要预测的序列。因为我们要预测下一个时间的收盘价,所以把close向上shift1个单位:
df_main['target'] = df_main['Close'].shift(-1)
df_main.dropna()
df_main = df_main.astype(np.float32)
接下来要根据LSTM需要的数据格式来创造数据集。Lstm需要的输入是一个3D array[x,y,z],其中x是样本数,y是seq length,即需要看多少天的数据,z是特征数。
def create_seq_data(data_raw,seq):
data_feat,data_target = [],[]
for index in range(len(data_raw) - seq):
# 构建特征集
data_feat.append(data_raw[['Open'