Работа с Anaconda на примере поиска корреляции курсов криптовалют

Работа с Anaconda на примере поиска корреляции курсов криптовалют

Цель этой статьи — предоставить легкое введение в анализ данных с использованием Anaconda. Мы пройдем через написание простого скрипта Python для извлечения, анализа и визуализации данных по различным криптовалютам.

Шаг 1 — Настройка рабочей среды.

Единственные навыки, которые вам понадобятся, это базовое понимание Python.

Шаг 1.1 — Установка Anaconda

Дистрибутив Anaconda можно скачать на официальном сайте. Установка проходит в стандартном Step-by-Step режиме.

Шаг 1.2 — Настройка рабочей среды проекта

После того, как Anaconda будет установлена, нужно создать и активировать новую среду для организации наших зависимостей.

Зачем использовать среды? Если вы планируете разрабатывать несколько проектов Python на своем компьютере, полезно хранить зависимости (программные библиотеки и пакеты) отдельно, чтобы избежать конфликтов. Anaconda создаст специальный каталог среды для зависимостей каждого проекта, чтобы все было организовано и разделено.

Сделать это можно либо через командную строку

либо через Anaconda Navigator

В данном случае среда активируется автоматически

Затем необходимо установить необходимые зависимости NumPy, Pandas, nb_conda, Jupiter, Plotly, Quandl.

либо через Anaconda Navigator, поочередно каждый пакет

Это может занять несколько минут.

Шаг 1.3 — Запуск Jupyter Notebook

Так же существует вариант через командную строку jupyter notebook и откройте браузер на http://localhost:8888/

и через Anaconda Navigator

Шаг 1.4 — Импорт зависимостей

После того, как вы откроете пустой Jupyter Notebook, первое, что нужно сделать — это импорт необходимых зависимостей.

Затем импорт и активация автономного режима Plotly.

Шаг 2 — Получение данных о ценах на биткоин

Теперь, когда все настроено, мы готовы начать извлечение данных для анализа. Начнем с того, что получим данные о ценах используя бесплатный API от Quandl.

Шаг 2.1 — Определение функции Quandl Начнем с того, что определим функцию для загрузки и кэширования наборов данных из Quandl.

Мы используем pickle для сериализации и сохранения загруженных данных в виде файла, что позволит нашему сценарию повторно не загружать одни и те же данные при каждом запуске скрипта.

Функция вернет данные в виде набора данных pandas.

Шаг 2.2 — Получение курса биткоина на бирже Kraken

Реализуем это следующим образом:

Для проверки корректности отрабатывания скрипта мы можем посмотреть первые 5 строк полученного ответа используя метод head().

Результат: Date Open High Low Close Volume (BTC) Volume (Currency) Weighted Price 2014-01-07 874.67040 892.06753 810.00000 810.00000 15.622378 13151.472844 841.835522 2014-01-08 810.00000 899.84281 788.00000 824.98287 19.182756 16097.329584 839.156269 2014-01-09 825.56345 870.00000 807.42084 841.86934 8.158335 6784.249982 831.572913 2014-01-10 839.99000 857.34056 817.00000 857.33056 8.024510 6780.220188 844.938794 2014-01-11 858.20000 918.05471 857.16554 899.84105 18.748285 16698.566929 890.671709 И построить график для визуализации полученного массива

Здесь мы используем Plotly для генерации наших визуализаций. Это менее традиционный выбор, чем некоторые из более известных библиотек, таких как Matplotlib, но я думаю, что Plotly — отличный выбор, поскольку он создает полностью интерактивные диаграммы с использованием D3.js.

Шаг 2.3 — Получение курса биткоина на нескольких биржах

Характер обмена заключается в том, что ценообразование определяется предложением и спросом, поэтому ни одна биржа не содержит «истинной цены» Биткойна. Чтобы решить эту проблему мы будем извлекать дополнительно данные из трех более крупных бирж для расчета совокупного индекса цены.

Мы будем загружать данные каждой биржи в словарь.

Шаг 2.4 — Объединение всех цен в единый набор данных

Определим простую функцию для объединения данных.

Затем объединим все данные по столбцу «Weighted Price».

Теперь посмотрим последние пять строк, используя метод tail (), чтобы убедиться, что все выглядит нормально и так как мы хотели.

Результат: Date BITSTAMP COINBASE ITBIT KRAKEN avg_btc_price_usd 2018-02-28 10624.382893 10643.053573 10621.099426 10615.587987 10626.030970 2018-03-01 10727.272600 10710.946064 10678.156872 10671.653953 10697.007372 2018-03-02 10980.298658 10982.181881 10973.434045 10977.067909 10978.245623 2018-03-03 11332.934468 11317.108262 11294.620763 11357.539095 11325.550647 2018-03-04 11260.751253 11250.771211 11285.690725 11244.836468 11260.512414 Шаг 2.5 — Сравнение наборов данных о ценах.

Следующим логическим шагом является визуализация сравнения полученных цен. Для этого мы определим вспомогательную функцию, которая построит график для каждой из бирж при помощи Plotly.

Теперь удалим все нулевые значения, так как мы знаем, что цена никогда не была равна нулю в периоде, который мы рассматриваем.

И пересоздадим график

Шаг 2.6 — Расчет средней цены

Теперь мы можем вычислить новый столбец, содержащий среднесуточную цену биткоина на всех биржах.

Этот новый столбец является нашим индексом цены биткоина. Построим его график, чтобы убедиться, что он выглядит нормально.

Мы будем использовать эти данные позже, чтобы конвертировать обменные курсы других криптовалют в USD.

Шаг 3 — Получение данных по альтернативным криптовалютам

Теперь, когда у нас есть массив данных с ценами биткойна, давайте возьмем некоторые данные об альтернативных криптовалютах.

Шаг 3.1 — Определение функций для работы с Poloniex API.

Для получения данных мы будем использовать API Poloniex. Определим две вспомогательные функции для загрузки и кэширования JSON данных из этого API.

Сначала мы определим функцию get_json_data , которая будет загружать и кэшировать данные JSON из предоставленного URL.

Затем мы определим функцию для форматирования HTTP-запросов Poloniex API и вызова нашей новой функции get_json_data для сохранения полученных данных.

Эта функция на входе получает пару криптовалют например, «BTC_ETH» и вернет исторические данные по обменному курсу двух валют.

Шаг 3.2 — Загрузка данных из Poloniex

Некоторые из рассматриваемых альтернативных криптовалют нельзя купить на биржах напрямую за USD. По этой причине мы будем загружать обменный курс на биткоин для каждой из них, а затем будем использовать существующие данные о ценах биткоина для преобразования этого значения в USD.

Мы загрузим данные об обмене для девяти популярных криптовалют — Ethereum, Litecoin, Ripple, Ethereum Classic, Stellar, Dash, Siacoin, Monero, and NEM.

Теперь у нас есть 9 наборов данных, каждый из которых содержит исторические среднедневные биржевые соотношения биткона к альтернативной криптовалюте.

Мы можем просмотреть последние несколько строк таблицы цен на Ethereum, чтобы убедиться, что она выглядит нормально.

date close high low open quoteVolume volume weightedAverage 2018-03-01 0.079735 0.082911 0.079232 0.082729 17981.733693 1454.206133 0.080871 2018-03-02 0.077572 0.079719 0.077014 0.079719 18482.985554 1448.732706 0.078382 2018-03-03 0.074500 0.077623 0.074356 0.077562 15058.825646 1139.640375 0.075679 2018-03-04 0.075111 0.077630 0.074389 0.074500 12258.662182 933.480951 0.076149 2018-03-05 0.075373 0.075700 0.074723 0.075277 10993.285936 826.576693 0.075189 Шаг 3.3 — Конвертирование цен в USD.

Так как теперь у нас есть обменный курс на биткоин для каждой криптовалюты и у нас есть индекс исторических цен биткоина в USD, мы можем напрямую рассчитать цену в USD для каждой альтернативной криптовалюты.

Этим мы создали новый столбец в каждом наборе данных альтернативных криптовалют с ценами в USD.

Затем мы можем повторно использовать нашу функцию merge_dfs_on_column , чтобы создать комбинированный набор данных о цене в USD для каждой из криптовалют.

Теперь добавим в набор данных цены биткоина в качестве конечного столбца.

В результате мы имеем набор данных, содержащий ежедневные цены в USD для десяти криптовалют, которые мы рассматриваем.

Используем нашу функцию df_scatter , чтобы отобразить все цены криптовалют на графике.

Этот график дает довольно солидную «общую картину» того, как обменные курсы каждой валюты менялись в течение последних нескольких лет.

В данном примере мы используем логарифмическую шкалу оси Y, чтобы сравнить все валюты на одном и том же участке. Вы можете попробовать различные значения параметров (например, scale = 'linear'), чтобы получить разные точки зрения на данные.

Шаг 3.4 — Вычисление корреляции криптовалют.

Вы можете заметить, что обменные курсы криптовалюты, несмотря на их совершенно разные ценности и волатильность, кажутся слегка коррелированными. И как видно по всплеску в апреле 2017 года, даже небольшие колебания, похоже, происходят синхронно на всем рынке.

Мы можем проверить нашу корреляционную гипотезу, используя метод Pandas corr () , который вычисляет коэффициент корреляции Пирсона для каждого столбца в наборе данных по отношению друг к другу. При вычислении также используем метод pct_change () , который преобразует каждую ячейку в наборе данных из абсолютного значения цены в процентное изменение.

Сначала мы вычислим корреляции для 2016 года.

Результат: DASH ETC ETH LTC SC STR XEM XMR XRP BTC DASH 1.000000 0.003992 0.122695 -0.012194 0.026602 0.058083 0.014571 0.121537 0.088657 -0.014040 ETC 0.003992 1.000000 -0.181991 -0.131079 -0.008066 -0.102654 -0.080938 -0.105898 -0.054095 -0.170538 ETH 0.122695 -0.181991 1.000000 -0.064652 0.169642 0.035093 0.043205 0.087216 0.085630 -0.006502 LTC -0.012194 -0.131079 -0.064652 1.000000 0.012253 0.113523 0.160667 0.129475 0.053712 0.750174 SC 0.026602 -0.008066 0.169642 0.012253 1.000000 0.143252 0.106153 0.047910 0.021098 0.035116 STR 0.058083 -0.102654 0.035093 0.113523 0.143252 1.000000 0.225132 0.027998 0.320116 0.079075 XEM 0.014571 -0.080938 0.043205 0.160667 0.106153 0.225132 1.000000 0.016438 0.101326 0.227674 XMR 0.121537 -0.105898 0.087216 0.129475 0.047910 0.027998 0.016438 1.000000 0.027649 0.127520 XRP 0.088657 -0.054095 0.085630 0.053712 0.021098 0.320116 0.101326 0.027649 1.000000 0.044161 BTC -0.014040 -0.170538 -0.006502 0.750174 0.035116 0.079075 0.227674 0.127520 0.044161 1.000000 Коэффициенты, близкие к 1 или -1, означают, что данные сильно коррелируют или обратно коррелируют соответственно, а коэффициенты, близкие к нулю, означают, что значения имеют тенденцию колебаться независимо друг от друга.

Чтобы визуализировать эти результаты, мы создадим еще одну вспомогательную функцию.

Здесь темно-красные значения представляют собой сильные корреляции, а синие значения представляют собой сильные обратные корреляции. Все остальные цвета представляют собой разную степень слабых/несуществующих корреляций.

Что говорит нам этот график? По сути, это показывает, что было очень мало статистически значимой связи между тем, как цены разных криптовалют колебались в течение 2016 года.

Теперь, чтобы проверить нашу гипотезу о том, что криптотермины стали более коррелированными в последние месяцы, повторим те же тесты, используя данные за 2017 и 2018 года.

Результат: DASH ETC ETH LTC SC STR XEM XMR XRP BTC DASH 1.000000 0.387555 0.506911 0.340153 0.291424 0.183038 0.325968 0.498418 0.091146 0.307095 ETC 0.387555 1.000000 0.601437 0.482062 0.298406 0.210387 0.321852 0.447398 0.114780 0.416562 ETH 0.506911 0.601437 1.000000 0.437609 0.373078 0.259399 0.399200 0.554632 0.212350 0.410771 LTC 0.340153 0.482062 0.437609 1.000000 0.339144 0.307589 0.379088 0.437204 0.323905 0.420645 SC 0.291424 0.298406 0.373078 0.339144 1.000000 0.402966 0.331350 0.378644 0.243872 0.325318 STR 0.183038 0.210387 0.259399 0.307589 0.402966 1.000000 0.339502 0.327488 0.509828 0.230957 XEM 0.325968 0.321852 0.399200 0.379088 0.331350 0.339502 1.000000 0.336076 0.268168 0.329431 XMR 0.498418 0.447398 0.554632 0.437204 0.378644 0.327488 0.336076 1.000000 0.226636 0.409183 XRP 0.091146 0.114780 0.212350 0.323905 0.243872 0.509828 0.268168 0.226636 1.000000 0.131469 BTC 0.307095 0.416562 0.410771 0.420645 0.325318 0.230957 0.329431 0.409183 0.131469 1.000000

DASH ETC ETH LTC SC STR XEM XMR XRP BTC DASH 1.000000 0.775561 0.856549 0.847947 0.733168 0.717240 0.769135 0.913044 0.779651 0.901523 ETC 0.775561 1.000000 0.808820 0.667434 0.530840 0.551207 0.641747 0.696060 0.637674 0.694228 ETH 0.856549 0.808820 1.000000 0.700708 0.624853 0.630380 0.752303 0.816879 0.652138 0.787141 LTC 0.847947 0.667434 0.700708 1.000000 0.683706 0.596614 0.593616 0.765904 0.644155 0.831780 SC 0.733168 0.530840 0.624853 0.683706 1.000000 0.615265 0.695136 0.626091 0.719462 0.723976 STR 0.717240 0.551207 0.630380 0.596614 0.615265 1.000000 0.790420 0.642810 0.854057 0.669746 XEM 0.769135 0.641747 0.752303 0.593616 0.695136 0.790420 1.000000 0.744325 0.829737 0.734044 XMR 0.913044 0.696060 0.816879 0.765904 0.626091 0.642810 0.744325 1.000000 0.668016 0.888284 XRP 0.779651 0.637674 0.652138 0.644155 0.719462 0.854057 0.829737 0.668016 1.000000 0.712146 BTC 0.901523 0.694228 0.787141 0.831780 0.723976 0.669746 0.734044 0.888284 0.712146 1.000000

И вот мы видим то, о чем и предполагали — почти все криптовалюты стали более взаимосвязанными друг с другом по всем направлениям.

На этом будем считать, что введение в работу с данными в Anaconda успешно пройдено.

📎📎📎📎📎📎📎📎📎📎