如何防止一系列整数经常具有相同的值

时间:2012-12-21 12:52:39

标签: algorithm hft

我有“在线”系列的整数,所以每隔几毫秒我就有了新的数字。未指定频率 - 有时我有很多数字,有时我没有数字。

实际上,这个数字被称为股票的“真实价格”。我在我的交易申请中使用它。

现在我只使用最后一个数字作为“真实价格”,所以我根本不跟踪系列。但这种方法存在一些问题。我们来看看这个系列:

  1. 98; last = 98
  2. 100; last = 100
  3. 101; last = 101
  4. 100; last = 100
  5. 101; last = 101
  6. 100; last = 100
  7. 101; last = 101
  8. 100; last = 100
  9. 101; last = 101
  10. 100; last = 100
  11. 99; last = 99
  12. 98; last = 98
  13. 问题在于,在很短的时间内,我的“真实价格”从100变为101并且返回太多次。真实价格的每次变化都意味着很多工作(重新计算,下单等),所以我不需要像这样改变真正的价格。这种变化(100-101-100-101)归因于“测量问题”,我需要对其进行过滤。我无法修复“测量”,所以我必须在这里修复它。

    其中一种方法是使用“3LastAverage”算法:

    1. 98; 3lastAverage = 98
    2. 100; 3lastAverage = 99
    3. 101; 3lastAverage = 99.67 => 100
    4. 100; 3lastAverage = 100.33 => 100
    5. 101; 3lastAverage = 101
    6. 100; 3lastAverage = 100
    7. 101; 3lastAverage = 101
    8. 100; 3lastAverage = 100
    9. 101; 3lastAverage = 101
    10. 100; 3lastAverage = 100
    11. 99; 3lastAverage = 100
    12. 98; 3lastAverage = 99
    13. 正如你所看到的那样,这种方法并不总是有效,我仍然有100-101-100的问题。可能我可以使用更多的数字来计算“平均值”......但是这样的方法对我来说不适用,因为这样的例子:

      1. 99; 3lastAverage = 99(我想要99)
      2. 100; 3lastAverage = 100(我想要100)
      3. 101; 3lastAverage = 100(我想要101)
      4. 102; 3lastAverage = 101(我想要102)
      5. 103; 3lastAverage = 103(我想103)
      6. 一般来说,当事情变为“OK”时,我需要将truePrice作为最后一个数字!

        所以,有了“在线”系列的整数数字,我需要计算这个系列的所谓“真值”,它以这种方式定义:

        • 如果一切正常,那么这只是最后一个数字
        • 如果串联的数字太多(因为测量问题),那么“真值”不应该经常改变。应该使用最合适的值

        我的建议是:

        • 只是禁止“真实价值”以每秒多于一次的价格。

        例如:

        1. 0.000:98;真值= 98
        2. 0.100:100;真值= 100
        3. 0.200:101;真值= 101
        4. 0.300:100;真值= 101(0.2秒前已经在步骤2使用了100)
        5. 0.400:98;真值= 101(在0.4秒前已经在步骤1使用了98)
        6. 0.500:99;真值= 99
        7. 0.600:100;真值= 99(步骤2 0.5秒前使用100)
        8. 1.500:101;真值= 101(自使用101以来经过了一秒多)。
        9. 然而,这种方法也有这样的“错误”:

          1. 99 tp = 99
          2. 100 tp = 100
          3. 101 tp = 101
          4. 102 tp = 102
          5. 103 tp = 103
          6. 102 tp = 103
          7. 101 tp = 103
          8. 100 tp = 103
          9. 99 tp = 103
          10. 98 tp = 98
          11. 97 tp = 97
          12. 这里的问题是“tp”在103级被“冻结”了太长时间。

            我真的很抱歉这么大的问题。但可能有人正在解决问题并可以分享经验。我的主要问题是我确实需要同时解决两个相反的问题:

            • “真实价格”必须是一般条件下的“最后”值
            • “真实价格”不应经常更改(因此我需要以某种方式使用先前的值)
            • 当我们有“一般”条件和我们有“测量问题”时,也很难说

            所以我的问题真的很模糊,我只是希望有人想要解决这样的问题。一如既往“常识”应该用来解决这个问题。

1 个答案:

答案 0 :(得分:4)

您希望响应价格的长期(低频)变化,但忽略小的短期(高频率)波动。所以你需要的是low-pass filter

有许多不同类型的低通滤波器具有不同的特性。移动平均线是一种低通滤波器,但它有一个问题(你观察到),它会延迟平滑延迟(为了平滑高频波动,你需要平均很长的序列,但是低频变化需要很长时间才能显现出来。)

因此,您可以试用其他低通滤镜,例如exponentially-weighted moving average,看看它们是否符合您的要求。

关于这项任务的另一个要点是,根据你在移动平均线上最接近的整数进行重新计算的决定是一件坏事,因为它会在移动平均线接近中途时放大小波动两个整数之间。 (如果移动平均线从99.49变为99.51,则舍入操作会将此小波动从99增加到100。)

您应该做的是使用hysteresis来避免这种反应。当您重新计算时,记录移动平均值 a 的当前值 a 0 ,并且在移动平均值之前不要再进行其他重新计算 a 至少移动了ε,即| a - a 0 | ≥ε