Учитывая набор данных различных валютных пар, как я эффективно вычисляю подразумеваемый fx уровень для пары, не предоставленной в наборе данных?
Например, скажите, что моя база данных/таблица похожа на это (от этих данных уклоняются):
GBP x USD = 1.5
USD x GBP = 0.64
GBP x EUR = 1.19
AUD x USD = 1.1
Заметьте что (фунт стерлингов, доллар США)! = 1 / (ДОЛЛАР США, ФУНТ СТЕРЛИНГОВ).
Я ожидал бы следующие результаты:
print rate('GBP','USD')
> 1.5
print rate('USD','GBP')
> 0.64
print rate('GBP','EUR')
> 1.19
#now in the absence of an explicit pair, we imply one using the inverse
print rate('EUR','GBP')
> 0.84
Это простые случаи, это становится более интересным:
#this is the implied rate from (GBP,EUR) and (GBP,USD)
print rate('EUR','USD')
> 1.26
Или еще более сложный пример находит самый эффективный перевод с помощью 3 или больше пар:
print rate('EUR','AUD')
> 1.38
Я думаю, что детализирует связанные аспекты программирования этой проблемы. Я предположил бы, что существует эффективная или умная рекурсия, которая может быть сделана здесь. Единственное требование - то, что наименьшее количество количества пар используется для прибытия в попросивший пары (это должно уменьшить ошибку). Если никакая явная инверсия не дана, то инвертирование пары ничего не стоит Вам.
Мотивация
В идеальном финансовом мире валютные рынки эффективны. В действительности это на 99% верно. Часто времена, нечетные валютные пары не заключаются в кавычки, или они нечасто заключаются в кавычки. Если явная кавычка существует, мы должны использовать ее в наших произвольных вычислениях. В противном случае мы должны подразумевать самую точную пару, к стольким десятичным разрядам, сколько мы можем. Кроме того, они не всегда умножаются к 1 (на самом деле, они никогда не умножаются к 1); это отражает предлагать/спрашивать распространение на рынке. Таким образом, мы сохраняем столько пар, сколько мы можем в обоих направлениях, но хотели бы смочь кодировать в целом за все валюты.
Я думаю, что у меня есть достойное реализованное решение для грубой силы. Это работает, но я думал, что проблема была интересна и задавалась вопросом, думал ли кто-либо еще, что это было интересно/сложно. Я лично работаю в Python, но это - больше осуществление, чем реализация, таким образом, код psuedo "достаточно хорош".
Вы ищете кратчайший путь в направленном графе, где валюты - вершины, а заданные курсы обмена - ребра. Если обменный курс задан только для одного направления, вы можете добавить курс для противоположного направления с большей стоимостью.