Python 股指期货高频数据机器学习预测( 二 )


第二种方式是完全消除量纲 , 将预测任务变为变化率的预测 。即将所有与Price相关的变量都减去并除以最后一条数组的中间价 。这样就可以将量纲完全消除 。

Python  股指期货高频数据机器学习预测

文章插图
for axis in [-1, 0, 3, 4]: # MidPrice, LastPrice, BidPrice1, AskPrice1x_cur[:, axis] -= last_mpx_cur[:, axis] /= last_mp...y.append((np.mean(mid_price[k+nGiven: k+nGiven+nPredict]) - mid_price[k+nGiven-1]) / mid_price[k+nGiven-1])
是指当日累计成交数量 。在每组数据中 , 的大小差别很大 , 这主要是因为每组数据开始的时间不同 。开始 , 我试图保留时间信息和 , 来更好地利用信息 。事实上 , 虽然一天中的是相关的 , 但是几乎不可能通过时间信息来估计 , 何况高频交易簿的精度很高 。因此 , 通过加入时间信息避免对的归一化是不可行的 。
第二个尝试是利用类似于对的处理 , 将每组数据中的减去该组数据中第一条数据的 。但这样效果并不好 , 这是因为在一组中是递增的 , 将它们进行如上处理后仍是递增的 , 利用普通的归一化手段无法将它们映射在同一尺度上 。
第三种尝试是利用变化量 。将每一组数据减去上一条信息的 , 将这个特征转化为:3秒内累计成交数量 。至此 , 每组/条数据的便为同一分布了 。此外 , 对于第一条数据 , 没有办法得知它与上一条数据(没有给出)的差值 , 只能用均值填充 。具体方法是利用迄“今”(这条数据)为止得到的插值的均值 。
for i in range(nGiven-1, 0, -1):x_cur[i, 1] -= x_cur[i-1, 1]volume_sum += x_cur[i,1]volume_len += 1x_cur[0, 1] = volume_sum / volume_len
时间信息
由于时间是递增的 , 可以通过将它们映射在每一天(即 , 删除日期 , 保留时间) , 然后进行预测 。但是由于数据只有约120天 , 将它们映射在每一个时间点会导致这部分数据过于稀疏 。因此 , 在保证每组数据中 , 每连续两条数据的时间差值为3秒的情况下 , 可以直接将时间信息删除 。
此外 , 我发现在多种模型的实验中 , 是否将时间信息加入并不会有太大的改变 。
对于预测值的处理
在前文中提到过 , 将预测数值任务改变为预测变化率的任务 。这样做除了为了消除量纲 , 更主要的原因是加快收敛 。若果不进行这样的处理 , 对于CNN/DNN/RNN等基于神经网络的模型 , 需要大约才能收敛到 RMSE=0.00155 , 但是如果采取变化率预测 , 只需要一个epoch就可以收敛到RMSE=0.00149.4
因此 , 如果不进行这样的处理 , 将会极度增加训练的时间 , 对调参和模型分析造成很大困难 。
噪声
加入噪声 。对于某些数据而言——尤其是Price相关的数据 , 由于有很多组相同或相似的数组以及线性映射的不变性 , 导致处理后结果是离散的 。因此 , 我在每个值中加入±1%的噪声 , 以提高模型的泛化能力 。
x_cur *= (1 + 0.001 * (np.random.rand(nGiven, nFeature) - 0.5) * 2)# 加入噪声
降低噪声 。在固定模型的情况下 , 我发现改变任务为预测下15条数据的中间价均值 , 亦或是下10条数据的中间价均值 , 得到的成绩要优于预测下20条的数据的中间价均值 。我想这是因为通过跨度为30秒的10条数据可能无法预测到更远的时间点 , 如跨度为60秒的20条数据中的后几条数据 。在没有更多信息的情况下 , 很可能之后的数值对于预测来说是噪声 。在实验中也证明了这一点 , 后文将会详细说明 。在下文中将这个“超参数”视为MN(Magic ) 。