ipdb> np.count_nonzero(test==0) / len(ytrue) * 100 76.44815766923736
我有一个数据文件,包含了24000
个价格数据,用于时间序列预测问题。我没有尝试预测价格本身,而是尝试预测对数回报,即log(P_t/P_{t-1})
。我对价格以及所有特征都应用了对数回报。预测结果还不错,但趋势往往预测为零。如上所示,数据中约有76%
是零值。
现在,我的想法可能是“寻找一个零膨胀估计器:首先预测是否会是零;如果不是,则预测其值”。
具体来说,如何完美地处理过多的零值?零膨胀估计器如何帮助我解决这个问题?请注意,我原本不是概率学家。
附注 我在尝试预测对数回报,其单位是“秒”,用于高频交易研究。请注意,这是一个回归问题(不是分类问题)。
更新
那张图可能是我在对数回报上的最佳预测,即log(P_t/P_{t-1})
。尽管结果不错,但其余预测往往预测为零。如上面的问题所示,零值过多。我在特征上也应用了对数回报,即如果F
是一个特定特征,那么我应用log(F_t/F_{t-1})
,可能在特征中也存在相同的问题。
这里有一天的数据,log_return_with_features.pkl,形状为(23369, 30, 161)
。很抱歉,我无法透露特征是什么。由于我在所有特征和目标(即价格)上应用了log(F_t/F_{t-1})
,因此在应用对数回报操作之前,我在所有特征上加了1e-8
以避免除以零的情况。
回答:
好的,从你的图表来看:这是数据的自然特性,价格并不经常变化。
尝试对原始数据进行一些子采样(或许是5倍的子采样,只需查看数据),这样你通常能在每个时间刻度上看到价格变动。这应该会使任何建模变得更加容易,非常容易。
对于子采样:我建议你进行简单的定期时间域下采样。所以如果你有以秒为分辨率的价格数据(即每秒一个价格标签),那么只需每隔五个数据点取一个。然后按你通常的做法继续操作,特别是计算从这个子采样数据中价格的对数增长。记住,无论你做什么,必须在测试时可重现。
如果出于某些原因这对你来说不可行,请考虑一些能处理多时间尺度的方法,例如WaveNet或Clockwork RNN。