如何在scikit中自动发现时间序列数据滞后 - 使用时间序列数据进行学习和分类

时间:2016-05-11 03:42:30

标签: python scikit-learn time-series quantitative-finance

我目前拥有一个巨大的时间序列数组,其中包含多个证券和经济统计数据的时间序列数据。

我已经编写了一个使用sci-kit learn对数据进行分类的功能,但该功能仅使用非滞后的时间序列数据。

有没有办法,在Python中,使用sci-kit,自动滞后所有这些时间序列查找时间序列(如果有的话)倾向于滞后于其他数据?

我正在使用历史数据创建模型来预测未来的表现。

4 个答案:

答案 0 :(得分:2)

TLDR但是为那些关心的人提供了一些QF宝石

序幕:

“没有免费的晚餐” 所以我们必须支付一笔费用才能获得所希望的结果,但你知道这非常值得做它,因此,获得高级创意,numpy实用程序知识和scikit-learn工具准备就绪,并最大限度地转动想象力的音量按钮

接下来,不要指望该过程只需几秒钟即可提供结果。

凭借AI / ML超参数搜索作业时间表的经验,示例 DataSETs 仅约X.shape ~ ( 400, 200000 ),最佳推广ML引擎超参数化交叉验证需要在分布式多处理集群上定期工作几天。

  

作为指导进一步量子研究工作的奖励:
来自类似特征工程研究的样本, LDF()/GDF() extendedDataSET |>>> aFeatureImportancesMAP_v4( loc_PREDICTOR, X_v412 ) ID.|LDF( fI ) | GDF|HUMAN_READABLE_FEATURE_NAME[COL] min() | MAX() | var() ___|__________|____|___________________________[___]___________|__________|____________ | | | [ ] | | 0. 0.4360231 | 43%| __________xxxxxxxxxxxxxCE [216] min: ... | MAX: ... | var(): ... 1. 0.0464851 | 48%| __________xxxxxxxxxxxxx_0 [215] min: ... | MAX: ... | var(): ... 2. 0.0104704 | 49%| __________xxxxxxxxxxxxx_1 [251] min: ... | MAX: ... | var(): ... 3. 0.0061596 | 49%| __________xxxxxxxxxxxxx_3 [206] min: ... | MAX: ... | var(): ... 4. 0.0055069 | 50%| __________xxxxxxxxxxxxx_2 [203] min: ... | MAX: ... | var(): ... 5. 0.0053235 | 50%| __________xxxxxxxxxxxxx_3 [212] min: ... | MAX: ... | var(): ... 6. 0.0050404 | 51%| ________f_xxxxxxxxxxxxx_7 [261] min: ... | MAX: ... | var(): ... 7. 0.0049998 | 52%| ________f_xxxxxxxxxxxxx_7 [253] min: ... | MAX: ... | var(): ... 8. 0.0048721 | 52%| __________xxxxxxxxxxxxx_4 [113] min: ... | MAX: ... | var(): ... 9. 0.0047981 | 52%| __________xxxxxxxxxxxxx_4 [141] min: ... | MAX: ... | var(): ... 10. 0.0043784 | 53%| __________xxxxxxxxxxxxx_3 [142] min: ... | MAX: ... | var(): ... 11. 0.0043257 | 53%| __________xxxxxxxxxxxxx_4 [129] min: ... | MAX: ... | var(): ... 12. 0.0042124 | 54%| __________xxxxxxxxxxxxx_1 [144] min: ... | MAX: ... | var(): ... 13. 0.0041864 | 54%| ________f_xxxxxxxxxxxxx_8 [260] min: ... | MAX: ... | var(): ... 14. 0.0039645 | 55%| __________xxxxxxxxxxxxx_1 [140] min: ... | MAX: ... | var(): ... 15. 0.0037486 | 55%| ________f_xxxxxxxxxxxxx_8 [252] min: ... | MAX: ... | var(): ... 16. 0.0036820 | 55%| ________f_xxxxxxxxxxxxx_8 [268] min: ... | MAX: ... | var(): ... 17. 0.0036384 | 56%| __________xxxxxxxxxxxxx_1 [108] min: ... | MAX: ... | var(): ... 18. 0.0036112 | 56%| __________xxxxxxxxxxxxx_2 [207] min: ... | MAX: ... | var(): ... 19. 0.0035978 | 56%| __________xxxxxxxxxxxxx_1 [132] min: ... | MAX: ... | var(): ... 20. 0.0035812 | 57%| __________xxxxxxxxxxxxx_4 [248] min: ... | MAX: ... | var(): ... 21. 0.0035558 | 57%| __________xxxxxxxxxxxxx_3 [130] min: ... | MAX: ... | var(): ... 22. 0.0035105 | 57%| _______f_Kxxxxxxxxxxxxx_1 [283] min: ... | MAX: ... | var(): ... 23. 0.0034851 | 58%| __________xxxxxxxxxxxxx_4 [161] min: ... | MAX: ... | var(): ... 24. 0.0034352 | 58%| __________xxxxxxxxxxxxx_2 [250] min: ... | MAX: ... | var(): ... 25. 0.0034146 | 59%| __________xxxxxxxxxxxxx_2 [199] min: ... | MAX: ... | var(): ... 26. 0.0033744 | 59%| __________xxxxxxxxxxxxx_1 [ 86] min: ... | MAX: ... | var(): ... 27. 0.0033624 | 59%| __________xxxxxxxxxxxxx_3 [202] min: ... | MAX: ... | var(): ... 28. 0.0032876 | 60%| __________xxxxxxxxxxxxx_4 [169] min: ... | MAX: ... | var(): ... ... 62. 0.0027483 | 70%| __________xxxxxxxxxxxxx_8 [117] min: ... | MAX: ... | var(): ... 63. 0.0027368 | 70%| __________xxxxxxxxxxxxx_2 [ 85] min: ... | MAX: ... | var(): ... 64. 0.0027221 | 70%| __________xxxxxxxxxxxxx_1 [211] min: ... | MAX: ... | var(): ... ... 104. 0.0019674 | 80%| ________f_xxxxxxxxxxxxx_3 [273] min: ... | MAX: ... | var(): ... 105. 0.0019597 | 80%| __________xxxxxxxxxxxxx_6 [ 99] min: ... | MAX: ... | var(): ... 106. 0.0019199 | 80%| __________xxxxxxxxxxxxx_1 [104] min: ... | MAX: ... | var(): ... ... 169. 0.0012095 | 90%| __________xxxxxxxxxxxxx_4 [181] min: ... | MAX: ... | var(): ... 170. 0.0012017 | 90%| __________xxxxxxxxxxxxx_3 [ 9] min: ... | MAX: ... | var(): ... 171. 0.0011984 | 90%| __________xxxxxxxxxxxxx_4 [185] min: ... | MAX: ... | var(): ... 172. 0.0011926 | 90%| __________xxxxxxxxxxxxx_1 [ 19] min: ... | MAX: ... | var(): ... ... 272. 0.0005956 | 99%| __________xxxxxxxxxxxxx_2 [ 33] min: ... | MAX: ... | var(): ... 273. 0.0005844 | 99%| __________xxxxxxxxxxxxx_2 [127] min: ... | MAX: ... | var(): ... 274. 0.0005802 | 99%| __________xxxxxxxxxxxxx_3 [ 54] min: ... | MAX: ... | var(): ... 275. 0.0005663 | 99%| __________xxxxxxxxxxxxx_3 [ 32] min: ... | MAX: ... | var(): ... 276. 0.0005534 | 99%| __________xxxxxxxxxxxxx_1 [ 83] min: ... | MAX: ... | var(): ... ... 391. 0.0004347 |100%| __________xxxxxxxxxxxxx_2 [ 82] min: ... | MAX: ... | var(): ... 的指示符:如下所示,人们可能会认识到最高1.功能本身负责43%接下来27.功能占+ 17%和休息“360多个功能将剩下的40%添加到决策中作为重要性报告   
个别特征和预先滞后的详细信息$不是公开的,只需单独讨论,可以单独讨论)
< / p>

auto-find

所以宁愿计划&amp;保留更多的vCPU核心容量,而不是期望它在即将到来的午餐时间在笔记本电脑上运行这样的搜索......

我们有一个工作计划

由于许多原因,目标 scikit-learn 服务不属于scikit-learn,但目标是可以实现的。

我们将使用以下适应步骤,这将使我们能够使其发挥作用:

  1. 我们将依靠 learner 能力搜索[hyperparameters + numpy] 的最佳串联定义明确的AI / ML问题

  2. 我们将依赖 scikit-learn 权力,以明显支持scikit-learn阶段的理由

  3. 我们将依赖于合适的pipeline AI / ML引擎处理&amp;过程控制(GridSearchCVfor等),这些大规模攻击的低级别性能优于迄今为止,而不是试图依赖于“外部”纵向的< strong> DataSET -looping(失去了所有宝贵的缓存/数据位置进展)并且已知具有显着的性能劣势。

  4. 我们将通过快速,一步,先验scikit-learn改编

  5. 替换所希望的自动发现
  6. 我们会让DataSET决定(定量表示)哪些预先滞后的特征,人工合成为[4]中详细阐述的化合物DataSET最终最佳预测能力

  7. [4] numpy适应智能DataSET辅助工具:

    您的DataSET[i,:]包含未指定的TimeSeries数据。对于每一个这样的,你假设一些预先滞后可能有更好的预测能力,你想要找到(定量支持这样的选择,对于最终的ML预测器)。

    因此,让我们首先为DataSET的{​​{1}}的源部分中的每个TimeSerie DataSET 构建,其中包含>>> def generate_TimeSERIE_preLAGs( aTimeSERIE, pre_lag_window_depth ): ... # ... # COURTESY & THANKS TO: ... # Nicolas P. Rougier, INRIA ... # Author: Joe Kington / Erik Rigtorp ... # ... shape = ( aTimeSERIE.size - pre_lag_window_depth + 1, ... pre_lag_window_depth ... ) ... strides = ( aTimeSERIE.itemsize, ... aTimeSERIE.itemsize ... ) ... return np.lib.stride_tricks.as_strided( aTimeSERIE, ... shape, ... strides = strides ... ) ... >>> xVECTOR = np.arange( 10 ) >>> >>> pre_laggz_on_xVECTOR = generate_TimeSERIE_preLAGs( xVECTOR, 4 ) >>> >>> pre_laggz_on_xVECTOR array([[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9]]) >>> 的扩展部分这个TimeSerie的版本:

    extendedDataSET

    通过扩展(更广泛,你知道很多)但静态 TimeSERIE,现在包含原始[1.A]向量和所有希望测试预先滞后的版本,你的ML搜索开始。

    阶段scikit-learn
    最初使用[1.B]工具进行支持您的假设的最佳功能选择
    + 阶段[1.B]
    下一步启动超参数优化以获得最佳效果交叉验证结果支持学习者的最大泛化能力。

    阶段extendedDataSET,自然应该在scikit-learn的子集上运行(因为在特征选择阶段{[1.A]评估时故意扩展{{1}} 1}})。

    结语:
    Memento mori: Quants不喜欢这个......但是

    为了您对TimeSeries分析的进一步兴趣,定量建模,you might be interested in the best answer on this >>>

    enter image description here

    相关性并不意味着因果关系,因此在做出决策时需要更加谨慎(纸张总能处理得比市场更多:o))。

答案 1 :(得分:1)

没有。在Python中,没有办法使用sci-kit来自动延迟所有这些时间序列,以查找哪些时间序列(如果有)倾向于滞后于其他数据。 您必须编写一些代码

答案 2 :(得分:1)

试试这个

import pandas as pd
import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin

class InsertLags(BaseEstimator, TransformerMixin):
    """
    Automatically Insert Lags
    """
    def __init__(self, lags):
        self.lags = lags

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        original_cols=list(range(len(X[0,:])))
        for lag in self.lags:
            X_lagged=pd.DataFrame(X[:,original_cols]).shift(lag).as_matrix()
            X=np.concatenate((X,X_lagged), axis=1)
        return X

然后测试

add_lags=InsertLags([1,2,3])

test=np.array([[1,3,5,7,9],
      [2,4,6,8,10]]).T

test

add_lags.fit_transform(test)

这应该创建一个自动创建滞后的sklearn变换器。如果需要,可以将original_cols作为类初始化函数的一部分,以便可以有选择地滞后变量。

答案 3 :(得分:0)

您只需使用numpy.roll()即可。不要忘记擦除缠绕的元素,例如你不想[6,7,1,2,3,4,5]而是[NA,NA,1,2,3,4,5]