首页 > 解决方案 > 我可以用 cuda 找到价格地板和天花板吗

问题描述

背景

我正在尝试将算法从顺序转换为并行,但我被卡住了。

点数图

点数图

我正在创建点和图图表。

减少
当股票下跌时,每次突破地板时添加一个 O。

增加
当股票上涨时,每次突破上限时添加一个X。

反转
如果股票反转方向,但变化小于反转阈值(3 个单位),则什么也不做。如果变化大于反转阈值,则开始新列(X 或 O)

顺序与并行

因此,这非常简单。我为地板和天花板保留了一个变量。如果当前价格突破了下限或上限,或者变化幅度超过了反转阈值,我可以采取适当的行动。

我的问题是,有没有办法同时找到这些反转点?我对并行思考还很陌生,所以如果这是微不足道的,我很抱歉。我试图在 CUDA 中做到这一点,但我已经被困了好几个星期。我尝试使用 NVidia 的有限差分算法。这些会产生局部最大值/最小值,但不会产生反转点。小的波动会产生大量的相对最大值/最小值,但大多数都是微不足道的,因为变化不大于反转大小。

标签: cudathrust

解决方案


我的问题是,有没有办法同时找到这些反转点?

一种可能的方法:

  1. 使用推力::unique 删除价格数值恒定的时期
  2. 使用推力::adjacent_difference 产生第一个差异数据
  3. 对第一个差分数据使用thrust::adjacent_difference 得到第二个差分数据,即斜率符号发生变化的点。
  4. 使用这些斜率符号的变化点来识别单独的数据区域 - 从中​​构建一个关键向量(例如,使用前缀总和)。这个关键向量将价格数据分割成“运行”,其中价格变化在特定方向。
  5. 在第一个差异数据上使用推力::exclusive_scan_by_key,以产生运行的净变化
  6. 只要运行的净变化超过阈值,就标记为“反转”

您对什么构成逆转的描述也可能有点不清楚。上述方法不会标记您可能归类为反转的某些数据模式的反转。我怀疑您正在超越我在此处定义的单次运行。如果是这种情况,可能还有一种方法可以解决这个问题——有更多的步骤。


推荐阅读