如何根据机器学习模型并行化交易策略的回溯测试?

时间:2016-12-10 17:39:49

标签: python machine-learning parallel-processing scikit-learn algorithmic-trading

为了回溯测试交易策略,基于机器学习模型,我想并行计算模型的再训练程序。

  

现在我的问题是:

是否有机会提高算法的速度?

使用scikit-learn在python中实现。回测程序定义如下:

  1. 在900(前三年)数据点上训练模型
  2. 预测第二天t + 1
  3. 在下一个数据点t + 1
  4. 上重新训练模型
  5. 再次使用t + 2
  6. 的模型进行预测
  7. 重新塑造模型....
  8. 做出预测......
  9. 简单地说,预测下一个数据点并重新训练该数据点上的模型。然后执行此操作直到当天(最后一个数据点)。对于某些库存预测,这可能高达5000个数据点,这意味着通过使用在前900个数据点上训练的模型开始此回测试程序,我需要重新训练并预测模型4100次。

    要并行化我正在使用多处理的过程。我有机会使用一个提供40个CPU内核的服务器。所以我正在做的是:

    1. 将数据点4100分成40份
    2. 在运行1部分
    3. 程序的每个内核上启动一个进程
    4. 完成程序后,将结果写在磁盘上
    5. 收集每个结果并将其组合在一起
    6. Python代码:

      pool = Pool()
      results = []
      
      for i in range(len(parts)):
          try:
              result = pool.apply_async(classify_parts,[parts[i], parts[i+1]])
              results.append(result)
          except IndexError:
              continue
      
      for result in results:
          result.get()
      

      方法 classify_parts ,启动给定范围的过程。 例如,如果我有500个数据点并且将通过在100个数据点上训练模型来开始整个回测试,那么我有400个数据点(天)用于回测,这意味着:

      1. 将40个数据点分成40个部分[10,20,30,...,380,390,400]
      2. 在每个内核上启动一个进程:
        • classify_parts( 10, 20 ),...,classify_parts( 390, 400 )
      3. 从磁盘收集结果并将它们放在一起
      4. 希望我能以清晰的方式说明我的概念。

          

        所以我最大的问题是,如果有另一种更有效的方法来使用机器学习模型进行回溯测试,那么会在每个下一个数据点(白天)进行重新训练吗?因为有了这个概念,5000个数据点的一个回测程序运行时间超过10分钟。

        也许增量/在线学习是可行的方法吗?

1 个答案:

答案 0 :(得分:0)

首先,这不是并行化进程安排。

如果怀疑,可以重新审视理论细节 SERIAL PARALLEL "只是" -CONCURRENT 流程安排在进一步阅读之前。

用简单的英语

事情可能按原则(通过意图)或某种资源限制进入 SERIAL 操作模式。如果要输入一个单词" parallel "在键盘上,字母 p ,下一个 a ,下一个 r ...等必须一个接一个地接触,否则输入过程无法提供有保证的正确结果 - 即单词& #34;的 parallel "在屏幕上(让我们假设我们忘记了使用 Shift 键的机会,以明确这个例子。)

任何人都可以测试,产生什么,如果一个人试图在同一时刻按下所有按键,或成对,或者当一只猫站在你的键盘上......所有其他想法都欢迎亲自动手实验

SERIAL流程不能更快

在任何其他情况下,除了通过更快的处理资源和/或通过降低进程间传输延迟(或者如果存在新的,更智能的算法并且对​​于类型程序员已知并且还显示为可行的在可用资源上实施。)

什么是PARALLEL流程?

另一方面,必须组织一些事情,以便恰好发生在光谱的另一端 - 如果所有事情只需要开始+发生+同时完成,否则过程的结果是认为错了。什么可以作为一个例子?

  • 想象一些视觉上简单且可读的#34;例子 - Red Arrows的展示 - 一组9架喷气式飞机,展示高引航的数字和演习

    enter image description here

    或Frecce Tricolori

    enter image description here

    所有飞机在同一时间完全以给定(相同)的方式移动,否则可爱的表演将会失败。

  • 想象一场必须举办的音乐会。这正是最终的 PARALLEL 过程,如果不是

    ,人们会立刻意识到这将是多么的破坏性。

    enter image description here

  • 想象一个用于多个自由度的机器人控制系统,其中所有运动都必须执行,并且必须保持在闭环[演员 - 探测器 - 执行器]子系统的控制之下。同步,协调所有几个编程控制轴。系统必须将所有NC轴一起控制为PARALLEL过程 - 否则机器人臂将永远无法跟随黑线 - the defined, curved, spatio-temporal trajectory in +4-D space ( best to view in real-time ).

    enter image description here

机器人控制示例显示,我们离特技飞行或交响乐示例越远,我们有一些直接经验(或者想象力可以提供一些理解),PARALLEL流程调度可能看起来更难以理解或意识到,但是当质疑一个问题是否确实是一个真正的并行时,交响乐似乎是最好的提醒。

只要问问自己,如果只有一半的合奏在19:00开始播放,或者如果一些小提琴以加速的速度播放会发生什么,那么会发生什么?或者是什么会发生这种情况,如果玩家将按顺序开始只播放一个音符并让他/她的左邻居发挥他/她的音符,等待播放顺序返回到同一个播放器以执行他/她的下一个音符音乐会上的音符。正确,这将是纯SERIAL调度。 )

那么,40-CPU核心是否会以某种方式加速我的问题?

问题仍然取决于处理。

enter image description here

如果学习方法(在未公开的MCVE中)具有内在依赖性,例如,如果classify_parts( 20, 30 )需要获得一些输入或一条信息,则从"以前"进入classify_parts( 10, 20 ),然后答案是否定的。

如果学习方法是独立的,在上面定义的意义上,那么就有机会将过程安排为"只是" -CONCURRENT并从有更多&#34的事实中受益;高速公路上的自由车道,允许车辆不仅在一条车道上行驶,而且在从开始到结束的路上允许车辆超越另一车道。橄榄球队可以从城市A移动到城市B"更快"如果城市A体育场有2个或3个或更多4个座位的汽车,那么比只有1个并且它必须去在那里和来回将所有球员成功地移动到B市。

接下来,即使有足够的车辆可以移动到所有玩家的城市B,持续时间也会非常高,以防从A到B只有一条车道,而且相反方向的交通流量很大。 B到A(不允许超车)和单个拖拉机,也从A到B,但速度为1英里/小时。

警告:(如果在寻找真正的快速处理时,最快的可能性更高)

尽管如此,即使以上都没有草图"外部"障碍,一个人必须非常小心,不要失去更大的"更大的"机器+"更广泛"高速公路(可用的资源更多),用于"只是" -CONCURRENT 进程安排。

是的,这里的问题与编程工具有关。

Python可以为快速原型设计提供很多帮助,但要注意全局解释器锁( GIL )代码执行的含义。

在您的情况下,使用40个线程的 Pool() 可能看起来很有吸引力,但仍会等待GIL获取/释放,所有工作将转为{{ 1}}再一次,只是因为忽略了 SERIAL 的python-threads上已知的GIL机制。

是的,还有其他更有希望的替代方案,例如 Pool() 等,但不仅代码相关的GIL步进会破坏您加快流程速度的努力,而且共享数据结构是一个值得关注和避免的问题。此外, ThreadPool() 天真复制的环境可能会超出系统RAM容量,并且交换机制将产生这样的尝试,以加速完全无法使用的进程。 无需任何分享,否则你加速处理的梦想将失去分享机制,你又回到了1号广场。

最好的方法是将代码设计为独立进程,具有零共享,无阻塞(MEM,IO)操作。

鉴于上述所有内容,40-CPU内核可能有助于加速“#C; CONCURRENT”流程。