【问题标题】:Optimal time to put timeout on cancel order取消订单超时的最佳时间
【发布时间】:2023-01-11 06:21:09
【问题描述】:

我面临以下问题。
我们在交易股票,作为一家高频交易公司,需要快速取消订单。
我们也有一个指定的 T = 超时时间,如果您发送取消并且在该超时期间订单未被取消,您将重试。

鉴于我们有以下百分位数,超时通常需要多长时间:

50% 百分位数 = t1
60% 百分位数 = t2
...
90% 百分位数 = t9
99% 百分位数 = t9.9

鉴于我们有这些数字,我们可以选择最佳超时吗?
例如超时为4秒,90%为460ms,如果500ms后订单没有被取消,我们可以在500ms后重试,有90%的机会在460ms内成功,因此为500ms + 460ms。

【问题讨论】:

  • 在不知道要优化的指标的情况下,您无法选择最佳超时为了.给定两个超时策略,你如何决定哪个更好?
  • @btilly 优化平均取消时间,平均超时时间比获胜时间更好
  • 如果你想要最快的平均取消,为什么要等待超时,马上发送取消!你也会收到超时通知吗?
  • @btilly 你的意思是立即取消..你取消了,它要么在一段时间后成功,要么在你超时时超时,所以超时是你渴望等待它成功的时间
  • 所以你只能有一个“飞行中取消”?在第一个超时之前您不会发送另一个,如果第一次超时,它就不再有效。因此,您不能简单地通过垃圾邮件取消希望其中之一起作用。

标签: algorithm math statistics


【解决方案1】:

我将讨论如何安排平均取消花费尽可能少的时间。

您从本质上说的条目表开始

percentile x time out by time t

所以它可能看起来像(如果可以的话,你会想要更多的数据点):

40 | 170
50 | 200
60 | 240
70 | 290
80 | 340
90 | 400
91 | 410

等等。不难将每一行与前一行进行比较并将其转换为:

10 | 170 | 200
10 | 200 | 240
10 | 240 | 290
10 | 290 | 340
10 | 340 | 400
 1 | 400 | 410

等等

现在我们可以很容易地编写两个函数。

  1. wait(t):等待时间到t的概率乘以总和。对部分间隔使用线性插值,例如对于wait(300),我们将包括条目10 | 290 | 340的 1/5,以提供 2% 的平均等待 295 毫秒的机会。
  2. finish(t):我们按时间完成的概率t。使用线性插值。所以 finish(300) 有 70% 的机会在 290 之前完成,加上 2% 在 290 和 300 之间完成,有 72% 的机会。

    现在取消平均需要多长时间?

    最后一次取消调用所花费的时间平均为wait(t) / finish(t)

    平均有多少呼叫超时?好吧,概率1-finish(t)至少有一个。概率为(1 - finish(t))^2,至少有 2 个。概率为(1 - finish(t))^3,至少有 3 个,依此类推。对于看起来像的平均超时次数:

    (1 - finish(t)) + (1 - finish(t))^2 + (1 - finish(t))^3 + ...
    

    但是几何级数有一个技巧:

    r + r^2 + r^3 + ...
      = (r + r^2 + r^3 + ...) * (1 - r) / (1 - r)
      = ((r - r^2) + (r^2 - r^3) + (r^3 - r^4) + ...) / (1 - r)
      = (r + (-r^2 + r^2) + (-r^3 - r^3) + ...) / (1 - r)
      = r / (1 - r)
    

    在这种情况下r = 1 - finish(t)。所以...

    r / (1 - r)
        = (1 - finish(t)) / (1 - (1 - finish(t)))
        = (1 - finish(t)) / finish(t)
        = 1 / finish(t) - 1
    

    我们等待超时取消 t 次我们取消的次数。因此我们要最小化:

    wait(t) + t / finish(t) - t
    

    现在我们知道要计算什么,您可以采用两种方法。第一种是只做一个值表,然后选择最好的一个。但是第二种是希望只有一个最小值,用一种爬山的形式来解决。这是一个简单的策略,可以使用二分搜索的变体来做到这一点。

    def minimize (f, x_min, x_mid, x_max, tolerance):
        (x_min, x_mid, x_max) = sorted((x_min, x_mid, x_max))
        if x_max - x_min < tolerance:
            return x_mid
        elif x_mid - x_min < x_max - x_mid:
            x_mid2 = (x_mid + x_max)/2
            if f(x_mid) < f(x_mid2):
                return minimize(f, x_min, x_mid, x_mid2, tolerance)
            else:
                return minimize(f, x_mid, x_mid2, x_max, tolerance)
        else:
            x_mid1 = (x_min + x_mid)/2
            if f(x_mid1) < f(x_mid):
                return minimize(f, x_min, x_mid1, x_mid, tolerance)
            else:
                return minimize(f, x_mid1, x_mid, x_max, tolerance)
    
    print(minimize(lambda x: (x**2 - 2)**2, 0, 1, 2, 0.00001))
    

    (始终知道 3 个点的值,中间值低于其他两个点。每次我们选择 2 个间隔中较大的一个点,并丢弃一个点以保持该值。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多