Представьте, что вы пытаетесь измерить температуру в разных странах, но у вас есть только разности температур между парами городов: "в Москве на 5° холоднее, чем в Лондоне", "в Токио на 3° теплее, чем в Париже". Можно ли на основе таких попарных сравнений восстановить абсолютную температуру в каждом городе? Оказывается, да — если у вас достаточно данных и правильный математический аппарат.
На валютном рынке мы сталкиваемся с точно такой же ��роблемой. Традиционные парные курсы (EUR/USD, USD/JPY, GBP/USD) показывают лишь относительные отношения между валютами, но ничего не говорят об их внутренней, абсолютной стоимости. Это как пытаться понять, насколько каждый город холоден, имея только разности температур.
Проект AbsCur (абсолютные валютные курсы) решает эту проблему, предлагая переход от относительных парных котировок к единой абсолютной шкале стоимости валют — аналогу температурной шкалы Кельвина в физике. В этой статье мы покажем, как с помощью метода наименьших квадратов можно "восстановить" абсолютные курсы 45 валют на основе 85 парных котировок, и как этот метод масштабируется до 153 валют в следующей версии проекта.
Эта статья — техническое продолжение наших предыдущих исследований:
Теоретическое обоснование метода абсолютных курсов (Хабр)
Подготовка данных для AbsCur3: как мы загрузили историю 287 валютных пар (Хабр)
Здесь мы сосредоточимся на математике и практической реализации: от системы уравнений до работающего кода на Python и конкретных примеров из уже функционирующего проекта Abscur.
Структура статьи:
Математический фундамент — как перейти от парных курсов к абсолютным через логарифмирование и матричное представление
Реализация на Python — построение матрицы инцидентности и ежедневный расчёт методом наименьших квадратов
Конкретный пример — разберём USD/JPY с численными значениями и покажем, как абсолютные курсы объясняют изменения парных котировок
Практическая ценность — зачем это нужно аналитикам, трейдерам и исследователям
От AbsCur2 к AbsCur3 — как метод масштабируется с 45 до 153 валют
Давайте начнём с математики, которая превращает сотни парных котировок в единую систему координат для всех валют мира.
Математическая модель: от парных курсов к абсолютным
Основное уравнение связи
Предположим, что для каждой валюты существует некая абсолютная стоимость — внутренняя мера ценности, которую мы обозначим для валюты
. В идеальном мире без транзакционных издержек и рыночных шумов парный курс между валютами
и
должен был бы в точности равняться отношению их абсолютных стоимостей:
где — наблюдаемый на рынке парный курс (например, для EUR/USD:
= EUR,
= USD).
Однако реальные рынки далеки от идеала. Арбитражные возможности, транзакционные издержки, асимметрия информации и другие факторы создают отклонения. Поэтому мы вводим ошибку :
Задача: зная множество парных курсов , найти такие значения
, которые минимизируют ошибки
по всем наблюдаемым парам.
Линеаризация через логарифмирование
Нелинейная форма уравнения сложна для непосредственного решения. Ключевой шаг — переход к логарифмам:
Обозначим:
— логарифм парного курса
— логарифм абсолютного курса
Получаем линейное уравнение:
Теперь для каждой валютной пары мы имеем линейное уравнение относительно неизвестных .
Матричное представление системы
Если у нас есть валют и
парных курсов, мы можем записать систему из
уравнений. В матричной форме это выглядит так:
где:
— вектор-столбец размерности
, содержащий логарифмы абсолютных курсов
— вектор-столбец размерности
, содержащий логарифмы парных курсов
— вектор ошибок
— матрица инцидентности размерности
Структура матрицы :
Каждая строка соответствует одной валютной паре
Каждый столбец соответствует одной валюте
В строке для пары
:
В столбце
стоит
(числитель в исходном отношении)
В столбце
стоит
(знаменатель в исходном отношении)
Все остальные элементы строки равны 0
Пример для трёх валют (USD, EUR, JPY) и двух пар (EUR/USD, USD/JPY):
Ниже изображение матрицы для 45 валют из проекта AbsCur2.

Почему метод наименьших квадратов?
На практике количество уравнений обычно больше количества неизвестных
(в AbsCur2: 85 пар > 45 валют). Это означает, что система переопределена и не имеет точного решения — никакие значения
не могут одновременно удовлетворить всем уравнениям из-за рыночных шумов и несовершенств.
Метод наименьших квадратов (МНК) находит такое решение , которое минимизирует сумму квадратов ошибок:
Геометрически: мы ищем такую комбинацию абсолютных курсов, которая наилучшим образом (в смысле минимального среднеквадратичного отклонения) приближает все наблюдаемые парные отношения.
Математическое решение этой задачи хорошо известно:
Вариант такого решения имеет место, но с некоторыми оговорками. Решение через псевдообратную матрицу было реализовано в первой версии проекта и описано в статье "Абсолютные валютные курсы".
На практике для численной устойчивости мы используем встроенные функции линейной алгебры (например, numpy.linalg.lstsq), которые решают эту задачу даже в случаях, когда матрица плохо обусловлена.
Важность полного графа связей
Каждая валютная пара добавляет в систему новое уравнение, которое "привязывает" две валюты друг к другу. Чем больше связей между валютами, тем точнее решение. Идеальный случай — полный граф, где каждая валюта имеет парный курс с каждой другой.

В AbsCur2 мы использовали 85 пар для 45 валют — это связный граф, где каждая валюта связана хотя бы с несколькими другими. В AbsCur3 мы переходим к 287 парам для 153 валют, что значительно повышает точность расчётов, особенно для экзотических валют.
Ежедневный расчёт и одноразовое решение
Важный нюанс: мы не можем решить систему "раз и навсегда". Валютные рынки постоянно меняются, и абсолютные курсы должны отражать текущую ситуацию. Поэтому мы решаем систему отдельно для каждого торгового дня:
где — конкретная дата,
— вектор парных курсов на эту дату.
Это даёт нам временной ряд абсолютных курсов для каждой валюты, который мы можем анализировать, сравнивать и визуализировать.
Ключевые выводы раздела:
Парные курсы выражаются через отношения абсолютных стоимостей валют
Логарифмирование превращает нелинейную задачу в линейную
Матрица
кодирует структуру валютных пар
Метод наименьших квадратов находит оптимальные абсолютные курсы
Решение вычисляется ежедневно для отражения текущих рыночных условий
В следующем разделе мы перейдём от математики к коду и покажем, как это реализовано на Python в рамках проекта AbsCur.
Реализация на Python: от матрицы до временных рядов
Теперь, когда мы разобрались с математикой, давайте посмотрим, как эта модель реализована в коде проекта AbsCur2. Мы будем использовать реальный код из Kaggle-ноутбука, который рассчитывает абсолютные курсы для 45 валют на основе 85 парных котировок.
Структура данных
Прежде чем строить матрицу, нам нужно подготовить данные. В проекте AbsCur2 исторические данные по парным курсам хранятся в DataFrame pairs_close, где:
Строки — торговые даты
Столбцы — валютные пары (например,
EURUSD,USDJPY)Значения — цены закрытия (close) для каждой пары на каждую дату
Также у нас есть два списка:
pairs— список всех валютных пар (85 элементов)curs— список всех валют (45 элементов)
Построение матрицы M
Вот код, который строит матрицу инцидентности, описанную в предыдущем разделе:
# Строим матрицу перехода от абсолютных курсов к парным
M = np.zeros([len(pairs), len(curs)])
for pair in pairs:
cur1, cur2 = pair[:3], pair[3:] # Разделяем тикер пары на две валюты
pair_index = pairs.index(pair)
cur1_index = curs.index(cur1)
cur2_index = curs.index(cur2)
M[pair_index, cur1_index] = 1 # Валюта в числителе получает +1
M[pair_index, cur2_index] = -1 # Валюта в знаменателе получает -1
Пояснения:
pair[:3]иpair[3:]— разделение строки типа"EURUSD"на"EUR"и"USD". Это возможно потому, что все тикеры валют состоят из 3 букв.pairs.index(pair)— находим индекс текущей пары в общем списке пар (от 0 до 84)curs.index(cur1)иcurs.index(cur2)— находим индексы валют в общем списке валют (от 0 до 44)M[pair_index, cur1_index] = 1— для валюты в числителе ставим +1M[pair_index, cur2_index] = -1— для валюты в знаменателе ставим -1
Результат: матрица размером 85×45, где каждая строка имеет ровно два ненулевых элемента: +1 и -1.
Ежедневный расчёт абсолютных курсов методом наименьших квадратов
После построения матрицы мы можем рассчитать абсолютные курсы для каждого дня:
abscur = pd.DataFrame(columns=curs, index=pd.to_datetime(pairs_close.index), dtype='float64')
for i in range(pairs_close.shape[0]):
lnA, _, _, _ = np.linalg.lstsq(M, np.log(pairs_close.iloc[i,:].values), rcond=None)
abscur.iloc[i,:] = np.exp(lnA)
Пояснения:
pd.DataFrame(columns=curs, ...)— создаём пустой DataFrame для хранения абсолютных курсов, с валютами в столбцах и датами в строках.Цикл
for i in range(pairs_close.shape[0])— итерируемся по всем датам (строкам) в исторических данных.np.log(pairs_close.iloc[i,:].values)— берём все парные курсы на датуiи применяем к ним логарифм (это векторpиз нашей математической модели).np.linalg.lstsq(M, ..., rcond=None)— решаем систему линейных уравнений методом наименьших квадратов. Функция возвращает:lnA— вектор решений (логарифмы абсолютных курсов)Остальные значения (которые мы обозначили
_, _, _) — служебная информация о решении
np.exp(lnA)— применяем экспоненту к результату, чтобы перейти от логарифмов к самим абсолютным курсам.abscur.iloc[i,:] = ...— сохраняем рассчитанные абсолютные курсы для датыi.
Особенности реализации
Ежедневная независимость
Важно отметить, что расчёт для каждого дня выполняется независимо. Мы не используем данные предыдущих дней для расчёта текущих абсолютных курсов. Это гарантирует, что временной ряд абсолютных курсов отражает именно ежедневные рыночные условия без накопления ошибок.
Численная устойчивость
Функция numpy.linalg.lstsq использует устойчивые алгоритмы линейной алгебры (как правило, основанные на SVD-разложении), которые хорошо работают даже с плохо обусловленными матрицами. Это важно, потому что матрица M для 85 пар и 45 валют может быть вырожденной или близкой к вырожденной.
Эффективность
Для 20+ лет истории (около 5000 торговых дней) и 85 пар этот код выполняется достаточно быстро — обычно в пределах нескольких минут. В AbsCur3 с 287 парами и 153 валютами время расчёта увеличивается, но остаётся приемлемым благодаря эффективным библиотекам линейной алгебры в NumPy.
Сохранение результатов
После расчёта абсолютные курсы сохраняются в CSV-файл:
abscur.to_csv("abscur.csv")
Этот файл затем используется для:
Построения графиков на сайте Abscur
Расчёта рейтингов валют (стабильность, рост, доходность)
Формирования валютных портфелей
Корреляционного анализа
Визуализация процесса
Парные курсы на дату t
↓
Логарифмирование: ln(P)
↓
Решение МНК: M × a = ln(P)
↓
Вектор логарифмов абсолютных курсов: a
↓
Экспоненцирование: A = exp(a)
↓
Абсолютные курсы на дату t
Ключевые моменты реализации:
Матрица
Mстроится один раз и используется для всех датДля каждой даты решается своя система уравнений
Использование логарифмов и экспонент обеспечивает переход между мультипликативной и аддитивной моделями
Результаты сразу готовы для анализа и визуализации
Что мы получили в результате?
Временной ряд абсолютных курсов для 45 валют
Данные, очищенные от "валютного шума" третьих валют
Основу для всех последующих аналитических инструментов проекта
В следующем разделе мы разберём конкретный пример — пару USD/JPY — и покажем, как абсолютные курсы помогают понять, какие именно валюты двигают парный курс.
Конкретный пример: разбор USD/JPY
Теперь, когда мы понимаем, как рассчитываются абсолютные курсы, давайте посмотрим на конкретный пример из работающего проекта AbsCur2. Возьмём одну из самых торгуемых пар — USD/JPY (Доллар США / Японская йена).
Уравнение связи на конкретную дату
На странице USD/JPY проекта Abscur для последнего доступного дня расчётов приводится следующее уравнение:
Разберём каждый компонент:
— фактическое значение парного курса USD/JPY на расчётную дату
— абсолютный курс доллара США (USD)
— абсолютный курс японской йены (JPY)
— теоретическое значение парного курса, рассчитанное из абсолютных курсов
— погрешность (разница между фактическим и теоретическим значениями)
Что это значит на практике?
Абсолютный курс USD =
— это "вес" доллара в единой системе измерения
Абсолютный курс JPY =
— это "вес" йены в той же системе
Отношение этих весов даёт теоретический курс USD/JPY =
Фактический рыночный курс (
) почти совпадает с теоретическим
Маленькая погрешность
(менее 0.001%) показывает высокую точность метода
Визуализация: два синхронизированных графика

Здесь представлены два синхронизированных графика:
Верхний график: историческая динамика парного курса USD/JPY
Нижний график: историческая динамика абсолютных курсов USD и JPY (на разных осях)
Как это помогает анализу?
Рассмотрим гипотетическую ситуацию: парный курс USD/JPY вырос на 10%. Без абсолютных курсов мы видим только общее изменение. С абсолютными курсами мы можем определить:
Рост вызван укреплением USD (абсолютный курс USD вырос)
Рост вызван ослаблением JPY (абсолютный курс JPY упал)
Комбинация обоих факторов (USD укрепился и JPY ослаб одновременно)
Пример из графика: Если на определённом отрезке времени парный курс USD/JPY растёт, а на нижнем графике мы видим:
Линия USD идёт вверх
Линия JPY остаётся относительно плоской
Тогда мы делаем вывод: рост пары в основном обусловлен укреплением доллара, а не ослаблением йены.
Практическая ценность для трейдеров и аналитиков
Разделение факторов — понимание, какая именно валюта движет парой
Выявление перекупленности/перепроданности — если парный курс сильно отклоняется от отношения абсолютных курсов
Сравнительный анализ — можно сравнить динамику абсолютных курсов USD и JPY с другими валютами
Прогнозирование — анализ трендов абсолютных курсов может помочь в прогнозировании парных движений
О чём говорит маленькая погрешность Δ?
Погрешность в нашем уравнении исключительно мала. Это означает:
Рынок эффективен — арбитражные возможности быстро исчезают
Метод точен — абсолютные курсы хорошо описывают рыночную реальность
Данные качественные — используемые парные котировки не содержат аномалий
Для экзотических пар с низкой ликвидностью погрешность может быть больше, что также информативно — это указывает на рыночные неэффективности или проблемы с ликвидностью.
От теории к практике
Этот конкретный пример показывает, что математическая модель, описанная в предыдущих разделах:
Работает на реальных рыночных данных
Точна — погрешности минимальны для мажорных пар
Полезна — даёт информацию, недоступную при анализе только парных курсов
Парный курс USD/JPY
↓
Раскладывается на:
├─ Абсолютный курс USD (числитель)
└─ Абсолютный курс JPY (знаменатель)
↓
Изменение парного курса = Изменение USD - Изменение JPY
Ключевой вывод: Абсолютные курсы превращают парный курс из "чёрного ящика" в понятную сумму двух компонентов, каждый из которых можно анализировать отдельно.
В следующем разделе мы рассмотрим, как абсолютные курсы используются на практике — для анализа, рейтингов и построения портфелей.
Практическое применение: от анализа к портфелям
Абсолютные курсы — это не просто теоретическая концепция, а рабочий инструмент, который уже сегодня используется в проекте Abscur для решения практических задач. Вот основные направления их применения:
Анализ и рейтинги
На основе абсолютных курсов строятся сравнительные рейтинги валют по ключевым параметрам:
Рост/падение — какие валюты укрепляются, а какие дешевеют в абсолютном выражении
Стабильность — какие валюты проявляют наименьшую волатильность
Доходность — какие валюты приносят наибольшую доходность с учётом риска
Пример: Рейтинг роста валют на сайте Abscur показывает, какие валюты показали наибольший рост за различные периоды.
Портфельный анализ
Абсолютные курсы позволяют сравнивать валюты как самостоятельные активы, что открывает возможности для портфельной оптимизации:
Формирование валютных портфелей с оптимальным соотношением риск/доходность
Диверсификация по абсолютной стоимости, а не по парным отношениям
Использование коэффициентов Шарпа и Сортино для оценки эффективности
Исследовательские инструменты
Корреляционный анализ — выявление структурных связей между валютами
Визуализация графов — отображение валютных взаимосвязей
Сравнение с другими активами — товарами, акциями в единой системе измерения
Преимущества для пользователей
Трейдеры получают инструмент для анализа силы отдельных валют
Аналитики могут исследовать рыночные структуры без искажений от парных отношений
Исследователи имеют уникальный dataset для финансовых исследований
Инвесторы могут формировать диверсифицированные валютные портфели
Более детально эти приложения будут рассмотрены в следующих статьях серии.
Ключевой момент: Абсолютные курсы создают единую систему координат для всего валютного рынка, позволяя перейти от анализа парных отношений к изучению внутренней динамики каждой валюты.
Далее мы рассмотрим, как эта методика масштабируется в следующей версии проекта — AbsCur3.
От AbsCur2 к AbsCur3: масштабирование метода
Математическая модель, описанная в этой статье, не ограничивается 45 валютами и 85 парами. Её красота в масштабируемости: один и тот же алгоритм работает для любого количества валют и пар. Проект AbsCur3 демонстрирует это, расширяя охват до 153 валют и 287 валютных пар.
Что меняется при масштабировании?
Матрица M становится больше: 287 строк (пары) × 153 столбца (валюты)
Система уравнений становится богаче: больше уравнений → точнее решение МНК
Охват рынка становится полнее: включаются экзотические валюты и пары
Схема: "Эволюция проекта AbsCur"
AbsCur2 (2021) → AbsCur3 (2025)
├─ 45 валют → 153 валюты
├─ 85 пар → 287 пар
├─ Матрица 85×45 → Матрица 287×153
└─ Решение МНК для 45 переменных → для 153 переменных
Математическая модель остаётся прежней
Уравнение для каждой пары по-прежнему:
Матричная форма:
Код на Python остаётся практически идентичным — меняются только размерности массивов.
Новые возможности AbsCur3
Полный граф для 153 валют: каждая валюта связана с несколькими другими, что повышает точность расчётов, особенно для экзотических валют
Более точные абсолютные курсы: больше уравнений → меньше влияние выбросов и шумов
Расширенный анализ: можно строить рейтинги и портфели для большего числа валют
Технические вызовы и их решения
Масштабирование до 153 валют потребовало решения нескольких технических задач:
Сбор данных: как получить историю 287 пар при ограничениях API (8 запросов в минуту)
Вычислительная эффективность: решение СЛАУ 287×153 для 5000+ дней
Хранение и обработка: работа с ~1 млн строк OHLC-данных
Эти задачи были решены в рамках подготовки данных для AbsCur3, о чём мы подробно писали в статье "Как мы загрузили историю 287 валютных пар".
Веб-интерфейс как конечная цель
Все расчёты в AbsCur3 будут доступны через веб-интерфейс, который предоставит:
Интерактивные графики абсолютных курсов для всех 153 валют
Сравнительные рейтинги по различным метрикам
Визуализацию графа валютных связей
Экспорт данных для собственных исследований
Открытая архитектура
Как и AbsCur2, проект AbsCur3 полностью открыт:
Исходный код на GitHub: github.com/prog815/abscur3
Данные доступны для скачивания
Методология полностью прозрачна
Ключевой вывод: Одна и та же математическая модель — метод наименьших квадратов для логарифмированной системы уравнений — работает как для 45, так и для 153 валют. Масштабирование увеличивает точность и охват, но не меняет фундаментальных принципов.
В заключительном разделе мы подведём итоги и покажем, где можно использовать абсолютные курсы уже сегодня.
Заключение и возможности для использования
В этой статье мы рассмотрели, как метод наименьших квадратов позволяет перейти от парных валютных курсов к абсолютной шкале стоимости валют.
Краткое резюме метода
Исходная проблема: парные курсы показывают только отношения между валютами, но не их внутреннюю стоимость
Математическое решение: переход к логарифмам и построение матрицы инцидентности графа валютных пар
Алгоритм: ежедневное решение переопределённой системы уравнений методом наименьших квадратов
Результат: временные ряды абсолютных курсов, очищенные от "валютного шума"
Что это даёт на практике
Разделение факторов: возможность анализировать вклад каждой валюты в изменение парного курса
Сравнительный анализ: прямое сопоставление любых валют на единой шкале
Основа для аналитики: построение рейтингов, портфелей, корреляционных графов
Например, на основе абсолютных курсов уже сейчас работает рейтинг стабильности валют, показывающий самые стабильные валюты за различные периоды.
От теории к работающей системе
Представленный метод не является чисто теоретическим — он реализован в проекте AbsCur2, который:
Рассчитывает абсолютные курсы для 45 валют на основе 85 пар
Предоставляет интерактивные графики и аналитические инструменты
Демонстрирует высокую точность (погрешность для мажорных пар менее 0.01%)
Развитие методологии
В проекте AbsCur3 метод масштабируется до 153 валют и 287 пар, что:
Увеличивает точность расчётов
Расширяет охват рынка
Открывает новые возможности для анализа экзотических валют
Ресурсы для дальнейшего изучения
Теоретические основы: Абсолютный валютный курс: теория метода
Подготовка данных для AbsCur3: Как мы загрузили историю 287 валютных пар
Работающий проект AbsCur2: https://www.abscur.ru/
Исходный код AbsCur3: https://github.com/prog815/abscur3
Перспективы развития
Метод абсолютных курсов создаёт основу для новых направлений исследований:
Анализ структурных изменений на валютных рынках
Разработка мультивалютных торговых стратегий
Исследование взаимосвязей между валютами, товарами и акциями
Создание систем раннего предупреждения о валютных кризисах
Итог: Абсолютные валютные курсы — это не просто математическая абстракция, а практический инструмент, который меняет способ анализа валютных рынков, переводя его с уровня парных отношений на уровень анализа внутренней динамики каждой валюты.
