Алгоритм определения курса - PullRequest
9 голосов
/ 30 июля 2010

Учитывая набор данных различных валютных пар, как мне эффективно рассчитать подразумеваемую скорость обмена валют для пары, не предоставленной в наборе данных?

Например, скажем, моя база данных / таблица выглядит следующим образом (этоданные обманываются):

GBP x USD = 1.5
USD x GBP = 0.64
GBP x EUR = 1.19
AUD x USD = 1.1  

Обратите внимание, что (GBP, USD)! = 1 / (USD, GBP).

Я ожидаю следующих результатов:

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 "достаточно хорош".

1 Ответ

13 голосов
/ 30 июля 2010

Вы ищете кратчайший путь в ориентированном графе, где валюты - это вершины, а заданные обменные курсы - ребра.Если обменный курс указан только для одного направления, вы можете добавить его для противоположного направления с более высокой стоимостью.

...