-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
最近MASTER项目发现了数据预处理的一些重要错误不知道对于MATCC有没有影响 #4
Comments
MASTER更新之后,原始数据集变为开源的数据了,也更新了手动drop Extreme label的操作。如果要是对比的话,可以有两种方法:
|
仔细看了一下代码好像确实有问题,这个问题在https://github.com/cq-dong/DFT_25中也有讨论,而且gsyyysg的stockformer也存在同样的问题,就是前几天MASTER项目作者刚刚发现的预处理的重大bug,就是对于DropExtremeLabel这个数据预处理processor并没有针对训练集进行fit学习最大最小值参数,而是对于整个数据集进行了去掉5%的最到最小值,这个是会有严重的信息泄漏的,可以参考gsyyysg/stockformer的issue,也是存在同样的问题,原文是:“数据处理方法在别的issue有人介绍过是当前值除以OCHL中的最大值,我记得我之前有验证过确实是这样。这种处理方法对未来泄漏的信息严重程度反而与历史数据相关,有违常理:只要模型越确信某个标的接近1的价格不在过去,那必然在未来。极端点,按这种数据处理方法,只要检查标的历史数据,做多价格越低的标的,做空价格越高的标的就行 def forward(self, df): def call(self, df): def is_for_infer(self) -> bool: def readonly(self): |
这里我的理解是在DropExtremeLabel类中对于is_for_infer返回了True,那么就是对于全局数据进行了去极值操作
其中:
由于is_for_infer返回了True,那么处理器DropExtremeLabel将对整个数据集都做去极值的操作,这样就让无论是训练集还是测试集都看到了全局的统计特征了,这样应该就造成了数据泄漏了 |
您是说,丢弃5%极端值不能在数据预处理时,这样可能会数据泄露,而应该在跟master一样训练过程中去动态drop当前切面的extremelabel,即生成[stock_num, time, model_dim]样本时进行丢弃是吗? |
我在https://github.com/cq-dong/DFT_25 的讨论中看到有人说是:“数据泄漏跟全局统计特征关系不大,跟时间序列中每个时间步中drop掉的数据用上一个时间步的数据填充有关。” “qlib的处理过程,t-1时间步切面被drop的股票,会拿t-2的数据去填充,则t-1和t-2是相同的,” 然而,由于前面是针对某一日的某只股票的整行数据的删除,所以这里应该不存在任何NaN的情况需要填充,需要填充的是特征列中存在NaN的情况,所以这里的填充是与删除5%的极大极小标签值无关的操作。 |
如果股票在交易日t被删除了, 但是前一天t-1这个股票存在的话,在idx_df中t天这个股票是nan,前一天是有值的,那么'ffill+bfill'会将t天的nan用t-1天填充 |
最近MASTER项目在readme中更新了数据预处理的一些重要错误,不知道对于MATCC有没有影响
The text was updated successfully, but these errors were encountered: