В настоящей статье пойдет речь об источниках котировок для нужд проекта. Будет рассказано о построении сервиса по обеспечению проекта историческими данными о парных валютных курсах и пересчету их в абсолютные валютные курсы на регулярной автоматической основе.
В качестве полигона рассмотрим обеспечение историческими финансовыми данными проекта "Абсолютный курс". Проект занимается вопросами расчета абсолютных валютных курсов и применением их для оценки состояния мировых экономик через анализ национальных валют. В основе теории лежит утверждение о возможности перехода от относительных парных валютных курсов к абсолютным валютным курсам для каждой валюты.
В основные требования к будущей системе:
бесплатность для разработчика
высокая отказоустойчивость
предоставление данных без ограничения в сети интернет в удобной форме
ежедневный автоматический пересчет из парных валютных курсов в абсолютные
ежедневное обновление парных валютных курсов
Несмотря на довольно высокие требования сделано предположение, что все они достижимы.
О предыдущем расчете
Предыдущий источник данных был основан на котировках сервиса Yahoo Finance. Данные с расчетами располагались в таблице (см. https://docs.google.com/spreadsheets/d/1CrNvvV-p6XG7lSJXftPKk_aY4nuH4WK25rPxaNKrM3U/edit#gid=151263196) на сервисе Google.Docs. В таблице ежедневно обновлялись дневные парные валютные курсы за последние 5 лет. Всего использовалось 87 валютных пар. Из них высчитывались 45 абсолютных валютных курсов. Данные этой таблицы использовались для прорисовки графиков на основном сайте проекта (см. https://www.abscur.ru).
В феврале 2022 года котировки престали предоставляться. Соответственно пропали данные и на основном сайте. Возник вопрос перехода на новый источник данных.
Выбор источника котировок
В статье "10 источников, где можно скачать исторические данные котировок для анализа" (см. https://taxfree-livejournal-com.turbopages.org/taxfree.livejournal.com/s/2082900.html) дан анализ нескольким альтернативным источникам котировок. Из них был выбран один для дальнейшего использования в проекте - AlphaVantage (см. https://www.alphavantage.co).
Сервис позволяет по интерфейсу RestAPI скачивать исторические данные финансовых рынков. В частности предоставляется возможность получать парные валютные курсы рынка Forex. Данные предоставляются в формате JSON и CSV. Последний как раз использовался.
У сервиса есть ряд ограничений по свободной лицензии (в платной подписке таких ограничений нет). Необходимо получить ключ (см. https://www.alphavantage.co/support/#api-key). Обращаться к сервису можно не чаще 5 раз в минуту и не чаще 500 раз в день. В нашем случае этого вполне достаточно. Необходимо было обновлять данные для 85 парных валютных курсов один раз в день.
Подкачка истории парных курсов
Благодаря сервису Google.Docs имеется возможность хранить в интернете табличные данные. Объем хранимых данных согласно ограничениям может доходить до нескольких миллионов ячеек, сотен тысяч строк и сотен столбцов (см. https://support.google.com/docs/thread/88183868/google-sheets-limitations?hl=en). В настоящей задаче речь шла о 5 столбцах (дата и 4 дневных курса), и 5000 строк исторических данных для каждой валютной пары.
Таблицы Google.Docs имеют идентичный функционал с таблицами MS Excel. Данные можно располагать на множестве отдельных листов в одном файле. Соответственно было выбрано решение о хранении истории различных парных валютных курсов на различных листах одного файла (см. https://docs.google.com/spreadsheets/d/1UgC2NfKtKJPaXglsmVJET7Xnp2ZtOzJgKD9DN-VGFA8/edit#gid=0).
Для обновления данных использовался сервис Google.Apps. Сервис позволяет разрабатывать, хранить и периодически запускать скрипты на языке TypeScript. Разработанный скрипт обращается в сеть интернет для загрузки котировок, обрабатывает их и размещает на листах файла в сервисе Google.Docs.
Запуск скрипта осуществляется ежедневно в период с 3 до 12 часов по Гринвичу. Таким образом сохраняется ежедневная актуальность исторических данных для всех 85 парных валютных курсов. В процессе тестирования были удалены две валютные пары (в предыдущем расчете их было 87). Удаление связано с прекращением поступления исторических данных.
Если есть необходимость, то пользователи могут скачать к себе на компьютер копию всего файла или отдельных листов. Для этого достаточно выбрать в меню пункт "файл"-"скачать". Экспорт предоставляется сервисом Google.Docs в нескольких форматах включая XLS и CSV.
Сведение парных курсов в единую таблицу
Отдельные парные курсы не представляю интереса в рамках текущей задачи. Для расчета абсолютных валютных курсов необходимо курсы закрытия для каждой валютной пары свести в одну таблицу. Что и было сделано (см. https://docs.google.com/spreadsheets/d/1UgC2NfKtKJPaXglsmVJET7Xnp2ZtOzJgKD9DN-VGFA8/edit#gid=1474278275). В результате работы скрипта появляется единая сводная таблица со списком валютных пар в столбцах и списком дат по строкам. На пересечении дня и валютной пары ее курс закрытия в соответствующем дне.
Т.к. объем истории для разных пар валют не всегда соответствовал друг другу пришлось ограничиться пересечением по дням. Диапазоны за рамками пересечения были отброшены. В результате в своде оказался период в две тысячи дней - приблизительно за 6 последних лет.
Как и в варианте с отдельными парными курсами таблица свода тоже доступна для скачивания.
Расчет абсолютных валютных курсов
Основная цель расчета - получение абсолютных валютных курсов для всех 45 валют входящих в список 85 имеющих валютных пар.
Порядок расчета включает в себя логарифмирование парных курсов, матричное умножение на матрицу преобразования и применение экспоненты. Полностью алгоритм описан в статье "Получаем абсолютные курсы из парных кросс-курсов валют" (см. https://habr.com/ru/post/450368/). Скрипт ежедневно производит расчет абсолютных курсов и размещает на листе в файле (см. https://docs.google.com/spreadsheets/d/1UgC2NfKtKJPaXglsmVJET7Xnp2ZtOzJgKD9DN-VGFA8/edit#gid=1871847763).
В расчете необходимо было получить матрицу преобразования. Для этого воспользовались тетрадкой на сервисе Kaggle (см. https://www.kaggle.com/eavprog/abscur-converter-12-11-2022). Кстати, исходные данные в тетрадку Kaggle подгружались по ссылке из таблицы Google.Docs. По списку валютных пар из описанной выше технологии произведен расчет матрицы. Сама матрица затем была размещена в файле в сервисе Google-таблиц (см. https://docs.google.com/spreadsheets/d/1UgC2NfKtKJPaXglsmVJET7Xnp2ZtOzJgKD9DN-VGFA8/edit#gid=1345286809).
К результатам
Предыдущая система снабжения котировками работала начиная с 2021 года. Она и продолжила бы работать, если бы не отказ сервиса Yahoo Finance и дальше продолжать поставлять котировки в свободном виде. Данные из источника использовались по нескольким направлениям: для отрисовки графиков на основном сайте проекта, для расчетов на Kaggle и как интерактивное средство напрямую на сервисе Google.Docs.
Новая система уже функционирует несколько дней и не вызывает нареканий. Котировки ежедневно подгружаются. Абсолютные курсы ежедневно пересчитываются. Есть возможность выгружать копию всех данных на свой компьютер и использовать данные из таблицы онлайн в сторонних ресурсах по ссылке (таких, как Kaggle).
В основном работоспособность системы обеспечивается надежностью работы инфраструктуры сервиса Google.Docs, Google.Apps и AlphaVantage.
Таким образом сделанное в начале статьи предположение полностью подтверждается экспериментальными данными. Построение эффективного сервиса поставки котировок с нулевыми постоянными затратами возможно и не представляет большой сложности. Все это обеспечивается благодаря развитию технологий предоставляемых на безвозмездной основе большими корпорациями.