外汇订单简化算法

时间:2011-07-25 19:04:37

标签: c# algorithm sql-server-2008-r2 currency graph-algorithm

这是一个几乎与语言无关的问题,而不是作业。理想情况下,我会使用C#和/或SQL服务器来解决问题。

假设我有一个函数GetExchangeRate(buyCurrency, sellCurrency)。因此,如果1英镑的价值为1.6美元,那么GetExchangeRate('GBP', 'USD') = 1.6GetExchangeRate('USD', 'GBP') = 0.625

系统中的订单将表示为以下三元组:(buyCurrency, SellCurrency, buyCurrencyAmount)。因此,('GBP','USD',125.00)意味着购买125英镑但需花费很多美元。

我的目标是节省交易成本并取消订单,包括及事性。在同一对货币之间净买入和卖出很容易做到,而且很容易证明。我们只是说我可能有商业理由来简化我用美元购买英镑的订单,并且还购买带有英镑的欧元等等......

我想过渡地简化这组订单。我正在考虑构建图形数据结构(节点是货币和边缘是buyCurrencyAmounts),即使数据将存储在SQL表中,并将正确的算法应用于此。我想过先做一个简单的网络,然后在DAG上进行拓扑排序,然后从顶部开始,然后按照拓扑顺序行走,然后“挤压”订单,例如简化它们。

问题在于我不一定会有DAG。但是,当我执行算法时,我可能会简化图形结构,无论哪一个都是。

我应该使用什么样的数据结构/算法?我应该担心由此产生的精度吗?我有什么好方法可以不用掉钱吗?你能推荐一个能够解决这个问题的优秀C#库吗?仅使用SQL Server 2008尝试此操作会是疯狂/低效/太多工作吗?

编辑: 交易支付的费用都包含在价格(汇率)中。没有固定的固定费用或类似的东西。

3 个答案:

答案 0 :(得分:1)

一种可能的技术是minimum-cost flows

  1. 确定每种货币的买卖价格。

  2. 制作一个有向图,其中节点是货币,弧线是货币之间可能的转换,弧线成本捕获点差的影响(我假设列出的汇率是完全有效的,因此任何周期转换次数乘以1)。

  3. 使用所描述的多项式时间算法之一来计算最低成本流量。

答案 1 :(得分:1)

您需要实施多边支付网。 “技巧”是创建一个名为净额结算中心的新实体,并通过它重新路由所有付款。请参阅我对类似问题here的回答,了解此方法的好处。

目标是摆脱这种情况(扣网前):

before netting

到此(净额结算后):

after netting

每个子公司最终都应以其本国货币从净结算中心获得单一金额(支付或接收),这是他们欠集团中任何其他实体的所有单个发票的对价总额。

基本算法是:

  • 付款人收款人货币金额列的发票表开始。这些对应于'净额结算'方案中的流量
  • 创建一个包含实体货币金额列的子付款临时表
  • 遍历每张发票,为发票表中的每个付款人,货币,金额的临时表添加一行。
  • 然后对收据执行相同操作,添加收款人,货币和否定金额。
  • 将子付款汇总为每个实体的货币小计。
  • 转换子支付总额(必要时应用差价)
  • 临时表现在对应于“净额结算后”方案中的情况

舍入错误将被最小化,因为您只会转换总数。舍入错误的任何结果将最终出现在净结算中心账户中。净额结算中心账户将包含应与外汇银行交易的货币小计,以将其转换为基础货币,例如美元。处理的费率应该是净额结算计算中使用的费率,因此一旦与外汇银行达成协议,计算应该重做(总数将略有变化)。

(使用多边而不是双边净额结算的优点之一是,任何此类外汇要求都是由同一个实体'所需',,净额结算中心。此外,如果您选择收取差价,,买入和卖出价格不同,那么任何由此产生的“利润”也将最终出现在净额结算中心帐户)。

关于执行实际计算 - 直接在SQL中执行很简单,但您可能会发现有足够的法律和/或配置选项来保证更抽象的方法。

(例如法律问题:一些政府不允许在跨境交易中转换外币;其他政府不允许您抵消付款和收据;有些政府需要得到中央银行的许可。一些有特殊要求的国家包括巴西,中国,马来西亚,俄罗斯等)。

答案 2 :(得分:0)

听起来像是在考虑一组交易,因为图表过于复杂。只需在您的集合中进行每笔交易并添加货币(即添加所有英镑买入/卖出,所有美元买入/卖出,欧元买入/卖出)。

您最终会获得每种货币所需的净买/卖价。然后开始根据最低点差选择交易(即如果您的欧元差价最小,那么选择一笔欧元交易 - 可能会达到欧元或一些美元的水平),继续......