machine-learning - 时间序列二分类
问题描述
问题:
我有一个关于对冲基金的数据集。它包含每月对冲基金回报和一些财务指标。我计算了从 2010 年到 2019 年 12 月每个月的指标。(2889 个月度数据)我想对下个月的这些指标进行二元分类并预测对冲基金的类别基础。我想从 T 时间对 T+1 进行预测。我想使用随机森林和其他分类器(决策树、KNN、SVM、逻辑回归)。我知道这个数据集是时间序列问题,我如何将其转换为机器学习问题。
对于在建模、特征工程和编辑此数据集时应遵循的方法或方法,我愿意接受您的建议和建议。
附加问题:
1)在使用这些数据进行训练和测试时如何进行数据拆分?0,80-0,20?。您可以推荐其他任何验证方法吗?
2)有些基金是后期加进去的,所以不是所有的基金都有等长的数据,比如2015年成立的“AEB”基金,2015年之前就没有数据了。这样的基金很少,会不会有问题,还是删除它们并将它们从数据集中删除更好?我一共有27个不同的基金数据。3)另外,我已经将对冲基金的股票代码/名称更改为数字ID,是否可以进行虚拟编码,对性能会更好吗?
样本数据集:
Date | Fund Name / Ticker | sharpe | sortino | beta | alpha | target |
------------|--------------------|--------|---------|-------|-------|--------|--
31.03.2010 | ABC | -0,08 | 0,025 | 0,6 | 0,13 | 1 |
31.03.2010 | DEF | 0,41 | 1,2 | 1,09 | 0,045 | 0 |
31.03.2010 | SDF | 0,03 | 0,13 | 0,99 | -0,07 | 1 |
31.03.2010 | CBD | 0,71 | -0,05 | 1,21 | 0,2 | 1 |
30.04.2010 | ABC | 0,05 | -0,07 | 0,41 | 0,04 | 0 |
30.04.2010 | DEF | 0,96 | 0,2 | 1,09 | 1,5 | 0 |
30.04.2010 | SDF | -0,06 | 0,23 | 0,13 | 0,23 | 0 |
30.04.2010 | CBD | 0,75 | -0,01 | 0,97 | -0,06 | 1 |
: | : | : | : | : | : | : |
: | : | : | : | : | : | : |
30.12.2019 | ABC | 0,05 | -0,07 | 0,41 | 0,04 | 1 |
30.12.2019 | DEF | 0,96 | 0,2 | 1,09 | 1,5 | 0 |
30.12.2019 | SDF | -0,06 | 0,23 | 0,13 | 0,23 | 0 |
30.12.2019 | CBD | 0,75 | -0,01 | 0,97 | -0,06 | 1 |
30.12.2019 | FGF | 1,45 | 0,98 | -0,03 | 0,55 | 1 |
30.12.2019 | AEB | 0,25 | 1,22 | 0,17 | -0,44 | 0 |
我的想法和第一次尝试: 我模拟了一个例子。我使用了这样的方法,我将(-1)移回了目标变量。所以每一行都显示了下个月基金所在的班级。我这样做是因为这个,我想在那个月开始之前预测下个月。从 T 预测到 T+1。但是这个模型给出的结果很差。(%43)
此模型数据集的视图:
Date | Fund Name / Ticker | sharpe | sortino | beta | alpha | target |
------------|--------------------|--------|---------|-------|-------|--------|--
31.03.2010 | ABC | -0,08 | 0,025 | 0,6 | 0,13 | 1 |
31.03.2010 | DEF | 0,41 | 1,2 | 1,09 | 0,045 | 0 |
31.03.2010 | SDF | 0,03 | 0,13 | 0,99 | -0,07 | 1 |
31.03.2010 | CBD | 0,71 | -0,05 | 1,21 | 0,2 | 1 |
30.04.2010 | ABC | 0,05 | -0,07 | 0,41 | 0,04 | 0 |
30.04.2010 | DEF | 0,96 | 0,2 | 1,09 | 1,5 | 0 |
30.04.2010 | SDF | -0,06 | 0,23 | 0,13 | 0,23 | 0 |
30.04.2010 | CBD | 0,75 | -0,01 | 0,97 | -0,06 | 1 |
: | : | : | : | : | : | : |
: | : | : | : | : | : | : |
30.12.2019 | ABC | 0,05 | -0,07 | 0,41 | 0,04 | 0 |
30.12.2019 | DEF | 0,96 | 0,2 | 1,09 | 1,5 | 0 |
30.12.2019 | SDF | -0,06 | 0,23 | 0,13 | 0,23 | 1 |
30.12.2019 | CBD | 0,75 | -0,01 | 0,97 | -0,06 | 1 |
30.12.2019 | FGF | 1,45 | 0,98 | -0,03 | 0,55 | 0 |
30.12.2019 | AEB | 0,25 | 1,22 | 0,17 | -0,44 | ? |
解决方案
您可以找到许多方法。时间序列具有挑战性,一开始的结果很差也没关系。我建议您执行以下操作:
- 在数据集中添加一些
lags
作为附加列。你想预测t+1
并且你有t
,所以试着计算t-1
,t-2
,t-3
等等。 - 为了知道
t-x
您可以拥有的最佳数量,请尝试绘制ACF
并PACF
查看阴影区域中出现的第一个滞后 - 滞后可能会提高您的准确性
- 建模时尝试规范化/标准化您的数据
- 试试看你的时间序列是不是a
random walk
,如果是,最近有很多论文试图解决随机游走预测的问题 - 如果您的数据集足够大,请尝试使用一些神经网络,例如 LSTM、RNN、GAN 等,它们可能比您提到的浅层模型更好
- 我真的建议你在这里查看 Jason Brownlee 关于时间序列的教程Jason 非常聪明,你可以随时在他的教程中添加评论。他也反应灵敏!!
推荐阅读
- laravel - 如何在事件调用的特征中嘲笑一个类?
- crystal-lang - 如何在 Crystal 中初始化由 from_json 创建的对象
- postgresql - PostgreSQL - 对于每个循环
- c - 数组,其中每个偶数索引由 2 驱动,奇数索引由 3 驱动
- node.js - Ionic 3 Cordova android build 未显示在平台文件夹中,权限错误
- php - 如何用\n替换句子中的第三个空格
- css - 圆形阴影 CSS
- node.js - 套接字 io,node.js
- angular - Angular 4:单击一个特定项目
- arrays - 如何在 spring rest 模板中将数组作为 PathVariable 传递?