给定dict中的利率,例如:
rates = {
'BTC/USDT' : 30000, <-- path A, hop 1
'ETH/USDT' : 1875,
'BTC/ETH' : 16, <-- path B, hop 1
'DOGE/ETH' : 0.0000342, <-- path B, hop 2
'DOGE/USDC' : 0.06267, <-- path B, hop 3
'USDT/USDC' : 1.0005 <-- path A, hop 2
}
我如何计算外汇交叉汇率递归?
def calc_fx(base_ccy: str, quote_ccy: str, rates: Dict[str, float]) -> float:
if not any([ x for x in rates if x.split('/')[0]==base_ccy or x.split('/')[-1]==base_ccy or x.split('/')[0]==quote_ccy or x.split('/')[-1]==quote_ccy]):
return None
if [ x for x in rates if x.split('/')[0]==base_ccy and x.split('/')[-1]==quote_ccy]:
return rates[f"{base_ccy}/{quote_ccy}"]
elif [ x for x in rates if x.split('/')[-1]==base_ccy and x.split('/')[0]==quote_ccy]:
return 1 / rates[f"{quote_ccy}/{base_ccy}"]
else:
# How to look up rates recursively?
return None
base_ccy : str = 'BTC'
quote_ccy : str = 'USDC'
rate = calc_fx(base_ccy, quote_ccy, rates)
print(rate)
例如,BTC/USDC =?,无法从字典中直接查找。你需要通过三个跳跃递归地完成这一点。找到跳数最少的路径?例如,将选择路径A两跳。如果没有找到路径,则返回None。
Path A
hop 1 BTC/USDT 30000
hop 2 USDT/USDC 1.0005
BTC/USDC = 30000 * 1.0005 = 30015
Path B
hop 1 BTC/ETH = 16
hop 2 DOGE/ETH = 0.0000342
hop 3 DOGE/USDC = 0.06267
BTC/USDC = 16 * (1/0.0000342) * 0.06267 = 29319.30
在上面,将选择路径A。
这个BFS/DFS问题的另一个改进是返回所有可能的路径。
我在下面发布了解决方案。
2条答案
按热度按时间r7s23pms1#
这就是:
kgqe7b3p2#
您可以使用
igraph
来获得最短路径,然后计算货币:上面的原因是能够重用存储在类中的值: