拆分数量算法(证券交易所订单)

时间:2012-09-17 16:20:03

标签: algorithm language-agnostic

我有一个问题,我需要在一定数量的收件人之间分配多个(几千个)数量,这样每个数量必须分成整数并使用相同的比例。 我需要找到一个能够可靠而有效地实现这一目标的算法(不是我们所有人?:-))

这是为了解决金融市场(证券交易所订单)中的一个问题,即订单可能会获得数千个“填充”,并且在一天结束时必须分配给少数客户,同时保持订单的平均价格。这是一个例子:

总订单数量37300

联交所填写的数量

执行1. 16700股,价格为75.84

执行2. 5400股,价格为75.85

执行3. 4900股,价格为75.86

执行4. 10300股,价格为75.87

共计37300股平均价格=(16700 * 75.84 + 5400 * 75.85 + 4900 * 75.86 + 10300 * 75.87)/ 37300 = 75.85235925

假设我需要在3个客户端之间拆分这些数量,以便:

客户1:15000股

Client2:10000股

客户3:12300股

每个执行都必须单独拆分(我不能只按每个客户要求的数量定价平均价格)

我的第一个想法是按比例分配:

客户1获得15000/37300 = 0.402144772

客户2获得10000/37300 = 0.268096515

客户3获得12300/37300 = 0.329758713

哪会导致

Client1 - 15000 Client2 - 10000 Client3 - 12300 比率:0.402144772比率:0.268096515比率:0.329758713

Splits(抱歉格式化 - 这是我在Post编辑器中可以做的最好的事情)

+-------------+-------------+-------------+
| Client 1    | Client 2    | Client 3    | 
+-------------+-------------+-------------+ 
| 6715.817694 | 4477.211796 | 5506.970509 | 
| 2171.581769 | 1447.72118  | 1780.697051 |
| 1970.509383 | 1313.672922 | 1615.817694 |
| 4142.091153 | 2761.394102 | 3396.514745 |
+-------------+-------------+-------------+
| Totals:     |             |             |
|       15000 |       10000 |       12300 | 
+-------------+-------------+-------------+

这个问题是我不能将小数量分配给客户,所以我需要一个智能算法来调整数量,使得这些分裂的小数部分为0.我明白在许多场景中这可能是不可能的这个要求可以放松一点,以便某个客户获得更多(或更少)。

有人知道我可以用作此问题的起点的算法吗?

2 个答案:

答案 0 :(得分:1)

你可以舍入所有数字(比率[n] * totalQuantity)除了最后一个(可能是最小的)最后一个必须是totalQuantity - 其他的总和。这将为您提供整数,同时具有接近您选择的比率的正确总数。

答案 1 :(得分:0)

尝试从不同的角度来看待这个问题。您已经知道每个客户端获得了多少份额。您想要计算每个人必须支付的公平总金额,并且这样做而不会舍入错误。

因此,您希望此总计美元金额没有舍入问题,即精确到0.01。

然后可以使用美元金额计算价格并显示为所需的精确度。

相反(计算价格,然后得出金额)将始终产生与美元金额的四舍五入问题。

假设价格是每100个单位,这是实现此目的的一种方法:

  1. 计算订单总金额(16,700 * 75.84 / 100 + 5,400 * 75.85 / 100 + 4,900 * 75.86 / 100 + 10,300 * 75.87 / 100)= $ 28,292.93

  2. 根据订购的比例数量/填充数量,分配除1以外的所有客户:

  3. 客户2 = $ 28,292.93 / 37,300 * 10,000 = $ 7,585,24 价格= 7,585,24 / 10,000 * 100 = 75.8524。

    客户3 = $ 28,292.93 / 37,300 * 12,300 = $ 9,329.84 价格= $ 9,329.84 / 12,300 * 100 = 75.85235772

    1. 将最后一个客户端计算为剩余的$$$:
    2. $ 28,292.93 - ($ 7,585,24 + $ 9,329.84)= $ 11,377.85。 价格= $ 11,377.85 / 15,000 * 100 = 75.85233333

      在这里,我随意挑选了客户端1,数量最多的客户端1作为余数计算的对象。