
Какова цена биткоина? Что заставляет цены на криптовалюту взлетать и падать? Являются ли рыночные цены различных альткоинов неразрывно связанными между собой или они в значительной степени независимы? Как предсказать, что произойдет дальше?
Статьи о цифровых валютах, таких как Bitcoin и Ethereum, сейчас изобилуют предположениями, а сотни самопровозглашенных экспертов отстаивают тенденции, которые, по их мнению, должны появиться. Во многих из этих анализов отсутствует прочная основа в виде базовых данных и статистических моделей.
Цель данной статьи — дать простое введение в анализ криптовалют с использованием Python. Мы рассмотрим простой скрипт Python для извлечения, анализа и визуализации данных по различным криптовалютам. Попутно мы откроем для себя интересные тенденции в поведении этих нестабильных рынков и пути их развития.

Это не статья, объясняющая криптовалюты, и не авторское мнение о том, какие конкретные валюты вырастут, а какие упадут. Вместо этого в этом уроке мы сосредоточимся на том, чтобы просто взять необработанные данные и раскрыть истории, скрытые в цифрах.
Это руководство предназначено для энтузиастов, инженеров и специалистов по данным всех уровней квалификации. Независимо от того, являетесь ли вы экспертом в отрасли или новичком в программировании, единственные навыки, которые вам нужны, — это базовое понимание языка программирования Python и достаточные знания операций командной строки. (Просто уметь организовать проект по анализу и обработке данных).
Помимо предоставления высококачественных источников данных с крупнейших бирж, количественная платформа Inventor FMZ.COM также предоставляет богатый набор интерфейсов API, которые помогают нам выполнять автоматизированные транзакции после завершения анализа данных. Этот набор интерфейсов включает в себя практические инструменты, такие как запрос информации о счете, запрос максимальной, минимальной, цены открытия, закрытия, объема торгов, различных часто используемых индикаторов технического анализа различных основных бирж и т. д., особенно для подключения к основным основным биржам в реальном времени. Торговые процессы. Открытый интерфейс API обеспечивает мощную техническую поддержку.
Все функции, упомянутые выше, инкапсулированы в систему, похожую на Docker. Все, что нам нужно сделать, это купить или арендовать нашу собственную службу облачных вычислений, а затем развернуть систему Docker.
В официальном названии Inventor Quantitative Platform эта система Docker называется хост-системой.
Более подробную информацию о том, как развертывать хосты и роботов, можно найти в моей предыдущей статье: https://www.fmz.com/bbs-topic/4140
Читатели, желающие приобрести собственный хост для развертывания сервера облачных вычислений, могут обратиться к этой статье: https://www.fmz.com/bbs-topic/2848
После успешного развертывания сервиса облачных вычислений и хост-системы мы установим самый мощный инструмент Python: Anaconda.
Чтобы реализовать все необходимые для этой статьи программные среды (зависимые библиотеки, управление версиями и т. д.), проще всего использовать Anaconda. Это пакетная экосистема Python для обработки и анализа данных, а также менеджер зависимостей.
Поскольку мы устанавливаем Anaconda на облачный сервис, мы рекомендуем вам установить систему Linux и версию Anaconda для командной строки на облачном сервере.
Информацию о способе установки Anaconda см. в официальном руководстве Anaconda: https://www.anaconda.com/distribution/
Если вы опытный программист на Python и не чувствуете необходимости использовать Anaconda, это совершенно нормально. Я предполагаю, что вам не нужна помощь в установке необходимых зависимостей, и вы можете перейти к Части 2.
После установки Anaconda нам необходимо создать новую среду для управления нашими зависимыми пакетами. В интерфейсе командной строки Linux вводим:
conda create --name cryptocurrency-analysis python=3
Давайте создадим новую среду Anaconda для нашего проекта.
Далее введите
source activate cryptocurrency-analysis (linux/MacOS操作)
或者
activate cryptocurrency-analysis (windows操作系统)
Чтобы активировать эту среду
Далее введите:
conda install numpy pandas nb_conda jupyter plotly
Для установки различных пакетов зависимостей, необходимых для этого проекта.
Примечание: Зачем использовать среду Anaconda? Если вы планируете запускать на своем компьютере много проектов Python, полезно разделить зависимости (библиотеки и пакеты) разных проектов, чтобы избежать конфликтов. Ananconda создает специальный каталог среды для каждого пакета зависимостей проекта, чтобы все пакеты можно было правильно управлять и различать.
После установки пакетов среды и зависимостей запустите
jupyter notebook
Чтобы запустить ядро iPython, перейдите в браузере на страницу http://localhost:8888/ и создайте новый блокнот Python, убедившись, что он использует:
Python [conda env:cryptocurrency-analysis]
Ядро

Создайте новый пустой блокнот Jupyter, и первое, что нам нужно сделать, это импортировать необходимые пакеты зависимостей.
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
Нам также необходимо импортировать Plotly и включить автономный режим.
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
Теперь, когда подготовка завершена, мы можем приступить к сбору данных для анализа. Во-первых, нам необходимо использовать API-интерфейс количественной платформы Inventor для получения данных о цене биткоина.
Это будет использовать функцию GetTicker. Подробности использования этих двух функций см. здесь: https://www.fmz.com/api
Для упрощения сбора данных нам необходимо написать функцию для загрузки и синхронизации данных из Quandl (quandl.com). Это бесплатный интерфейс финансовых данных, который очень известен за рубежом. Платформа Inventor Quantitative также предоставляет аналогичный интерфейс данных, который в основном используется для торговли в реальном времени. Поскольку эта статья в основном посвящена анализу данных, мы по-прежнему используем здесь данные Quandl.
При торговле в реальном времени вы можете напрямую вызывать функции GetTicker и GetRecords в Python для получения данных о ценах. Для их использования, пожалуйста, обратитесь к: https://www.fmz.com/api
def get_quandl_data(quandl_id):
# 下载和缓冲来自Quandl的数据列
cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(quandl_id))
except (OSError, IOError) as e:
print('Downloading {} from Quandl'.format(quandl_id))
df = quandl.get(quandl_id, returns="pandas")
df.to_pickle(cache_path)
print('Cached {} at {}'.format(quandl_id, cache_path))
return df
Библиотека pickle используется здесь для сериализации данных и сохранения загруженных данных в виде файла, чтобы программе не приходилось повторно загружать одни и те же данные при каждом запуске. Эта функция вернет данные в формате Pandas Dataframe. Если вы не знакомы с концепцией фрейма данных, представьте его как мощную электронную таблицу Excel.
Давайте возьмем в качестве примера биржу биткоинов Kraken и начнем с получения ее цены биткоинов.
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
Используйте метод head() для просмотра первых пяти строк фрейма данных.
btc_usd_price_kraken.head()
Результат:
| BTC | 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 |
Далее нам необходимо составить простую таблицу для проверки корректности данных с помощью визуализации.
# 做出BTC价格的表格
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

Здесь мы используем Plotly для завершения визуализации. Plotly — менее распространенный выбор, чем использование некоторых более зрелых библиотек визуализации данных Python, таких как Matplotlib, но это хороший выбор, поскольку он может вызывать D3.js для создания полностью интерактивных диаграмм. Диаграммы имеют очень удобные настройки по умолчанию, их легко изучать и удобно встраивать в веб-страницы.
Совет: вы можете сравнить сгенерированную диаграмму с графиком цены биткоина с крупной биржи (например, OKEX, Binance или Huobi) в качестве быстрой проверки, чтобы убедиться, что загруженные данные в целом соответствуют друг другу.
Внимательные читатели, возможно, заметили, что в приведенных выше данных отсутствуют некоторые данные, особенно за конец 2014 года и начало 2016 года. Этот пробел в данных особенно заметен на бирже Kraken. Мы, безусловно, не хотим, чтобы эти недостающие данные повлияли на наш анализ цен.
Особенностью бирж цифровых валют является то, что цена валюты определяется спросом и предложением. Поэтому ни одна цена сделки не может стать «общепринятой ценой» рынка. Чтобы решить эту проблему, а также упомянутую выше проблему отсутствия данных (возможно, из-за технических сбоев и ошибок в данных), мы загрузим данные с трех крупнейших биткоин-бирж в мире и рассчитаем среднюю цену биткоина.
Начнем с загрузки данных для каждого обмена в фрейм данных, состоящий из словаря.
# 下载COINBASE,BITSTAMP和ITBIT的价格数据
exchanges = ['COINBASE','BITSTAMP','ITBIT']
exchange_data = {}
exchange_data['KRAKEN'] = btc_usd_price_kraken
for exchange in exchanges:
exchange_code = 'BCHARTS/{}USD'.format(exchange)
btc_exchange_df = get_quandl_data(exchange_code)
exchange_data[exchange] = btc_exchange_df
Далее мы определим специальную функцию для объединения общих столбцов из каждого фрейма данных в новый фрейм данных. Назовем ее функцией merge_dfs_on_column.
def merge_dfs_on_column(dataframes, labels, col):
'''Merge a single column of each dataframe into a new combined dataframe'''
series_dict = {}
for index in range(len(dataframes)):
series_dict[labels[index]] = dataframes[index][col]
return pd.DataFrame(series_dict)
Теперь объедините все фреймы данных на основе столбца «взвешенная цена» каждого набора данных.
# 整合所有数据帧
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
Наконец, мы используем метод «tail()» для просмотра последних пяти строк объединенных данных, чтобы убедиться в правильности и полноте данных.
btc_usd_datasets.tail()
Результат:
| BTC | BITSTAMP | COINBASE | ITBIT | KRAKEN |
|---|---|---|---|---|
| 2017-08-14 | 4210.154943 | 4213.332106 | 4207.366696 | 4213.257519 |
| 2017-08-15 | 4101.447155 | 4131.606897 | 4127.036871 | 4149.146996 |
| 2017-08-16 | 4193.426713 | 4193.469553 | 4190.104520 | 4187.399662 |
| 2017-08-17 | 4338.694675 | 4334.115210 | 4334.449440 | 4346.508031 |
| 2017-08-18 | 4182.166174 | 4169.555948 | 4175.440768 | 4198.277722 |
Как вы можете видеть из таблицы выше, эти данные соответствуют нашим ожиданиям. Диапазон данных примерно тот же, но есть небольшие различия, основанные на задержке или характеристиках каждой биржи.
С точки зрения аналитической логики следующим шагом является сравнение этих данных посредством визуализации. Для этого нам нужно сначала определить вспомогательную функцию, которая использует данные для построения диаграммы, предоставляя однострочную команду. Назовем ее функцией df_scatter.
def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False):
'''Generate a scatter plot of the entire dataframe'''
label_arr = list(df)
series_arr = list(map(lambda col: df[col], label_arr))
layout = go.Layout(
title=title,
legend=dict(orientation="h"),
xaxis=dict(type='date'),
yaxis=dict(
title=y_axis_label,
showticklabels= not seperate_y_axis,
type=scale
)
)
y_axis_config = dict(
overlaying='y',
showticklabels=False,
type=scale )
visibility = 'visible'
if initial_hide:
visibility = 'legendonly'
# 每个系列的表格跟踪
trace_arr = []
for index, series in enumerate(series_arr):
trace = go.Scatter(
x=series.index,
y=series,
name=label_arr[index],
visible=visibility
)
# 为系列添加单独的轴
if seperate_y_axis:
trace['yaxis'] = 'y{}'.format(index + 1)
layout['yaxis{}'.format(index + 1)] = y_axis_config
trace_arr.append(trace)
fig = go.Figure(data=trace_arr, layout=layout)
py.iplot(fig)
Для вашего удобства в данной статье не будет подробно обсуждаться логический принцип этой вспомогательной функции. Если вы хотите узнать больше, ознакомьтесь с официальной документацией Pandas и Plotly.
Теперь мы можем легко создавать графики данных о цене биткоина!
# 绘制所有BTC交易价格
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Как видно из приведенного выше графика, хотя все четыре серии следуют примерно по одному и тому же пути, в них есть некоторые неровности, которые мы попытаемся устранить.
Мы знаем, что в период 2012-2017 гг. цена биткоина никогда не была равна нулю, поэтому сначала удаляем все нулевые значения в фрейме данных.
# 清除"0"值
btc_usd_datasets.replace(0, np.nan, inplace=True)
После перестройки фрейма данных мы видим гораздо более четкий график без пропущенных данных.
# 绘制修订后的数据框
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

Теперь мы можем рассчитать новый столбец: среднюю дневную цену биткоина на всех биржах.
# 将平均BTC价格计算为新列
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
Новая колонка — индекс цены биткоина! Давайте снова построим график, чтобы проверить, есть ли какие-то ошибки в данных.
# 绘制平均BTC价格
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])

Похоже, что никаких проблем нет, и мы продолжим использовать эти агрегированные данные ценового ряда в дальнейшем, чтобы иметь возможность определять обменный курс между другими криптовалютами и долларом США.
На данный момент у нас есть временные ряды данных по ценам биткоинов. Далее давайте рассмотрим некоторые данные о цифровых валютах, отличных от Bitcoin, а именно ситуацию с альткоинами. Конечно, термин альткоин может быть слишком сильным, но что касается текущего развития цифровых валют, в дополнение к рейтингу рыночной капитализации Большинство из первой десятки (например, Bitcoin, Ethereum, EOS, USDT и т. д.) можно назвать альткоинами. Нет проблем. Мы должны стараться держаться подальше от этих валют при торговле, потому что они слишком запутанные и обманчивые. высокий.
Во-первых, мы используем API биржи Poloniex для получения данных о транзакциях в цифровой валюте. Мы определяем две вспомогательные функции для получения соответствующих данных альткоинов. Эти две функции в основном загружают и кэшируют данные JSON через API.
Сначала мы определяем функцию get_json_data, которая будет загружать и кэшировать данные JSON с заданного URL.
def get_json_data(json_url, cache_path):
'''Download and cache JSON data, return as a dataframe.'''
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(json_url))
except (OSError, IOError) as e:
print('Downloading {}'.format(json_url))
df = pd.read_json(json_url)
df.to_pickle(cache_path)
print('Cached {} at {}'.format(json_url, cache_path))
return df
Далее мы определяем новую функцию, которая будет выполнять HTTP-запрос к API Poloniex и вызывать функцию get_json_data, которую мы только что определили, чтобы сохранить результат вызова.
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # 从2015年开始获取数据
end_date = datetime.now() # 直到今天
pediod = 86400 # pull daily data (86,400 seconds per day)
def get_crypto_data(poloniex_pair):
'''Retrieve cryptocurrency data from poloniex'''
json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
data_df = get_json_data(json_url, poloniex_pair)
data_df = data_df.set_index('date')
return data_df
Приведенная выше функция извлечет строковый код криптовалютной пары (например, «BTC_ETH») и вернет фрейм данных, содержащий исторические цены обеих валют.
Большинство альткоинов нельзя купить напрямую за доллары США. Если люди хотят получить эти цифровые валюты, им обычно приходится сначала покупать биткоины, а затем обменивать их на альткоины на основе соотношения цен между ними. Поэтому нам придется загрузить обменный курс каждой цифровой валюты в биткоин, а затем использовать существующие данные о цене биткоина для конвертации в доллары США. Мы загрузим данные о транзакциях для 9 основных криптовалют: Ethereum, Litecoin, Ripple, EthereumClassic, Stellar, Dash, Siacoin, Monero и NEM.
altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']
altcoin_data = {}
for altcoin in altcoins:
coinpair = 'BTC_{}'.format(altcoin)
crypto_price_df = get_crypto_data(coinpair)
altcoin_data[altcoin] = crypto_price_df
Теперь у нас есть словарь, содержащий 9 фреймов данных, каждый из которых содержит исторические данные о среднесуточных ценах между альткоинами и биткоинами.
Мы можем определить, верны ли данные, посмотрев на последние несколько строк таблицы цен Ethereum.
altcoin_data['ETH'].tail()
| ETH | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
|---|---|---|---|---|---|---|---|
| 2017-08-18 | 0.070510 | 0.071000 | 0.070170 | 0.070887 | 17364.271529 | 1224.762684 | 0.070533 |
| 2017-08-18 | 0.071595 | 0.072096 | 0.070004 | 0.070510 | 26644.018123 | 1893.136154 | 0.071053 |
| 2017-08-18 | 0.071321 | 0.072906 | 0.070482 | 0.071600 | 39655.127825 | 2841.549065 | 0.071657 |
| 2017-08-19 | 0.071447 | 0.071855 | 0.070868 | 0.071321 | 16116.922869 | 1150.361419 | 0.071376 |
| 2017-08-19 | 0.072323 | 0.072550 | 0.071292 | 0.071447 | 14425.571894 | 1039.596030 | 0.072066 |
Теперь мы можем объединить данные по обменному курсу BTC к альткоинам с нашим индексом цен на биткоины, чтобы напрямую рассчитать историческую цену каждого альткоина в долларах США.
# 将USD Price计算为每个altcoin数据帧中的新列
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
Здесь мы добавляем новый столбец в фрейм данных для каждого альткоина для хранения его соответствующей цены в долларах США.
Далее мы можем повторно использовать функцию merge_dfs_on_column, которую мы определили ранее, для создания объединенного фрейма данных, который интегрирует цену каждой криптовалюты в долларах США.
# 将每个山寨币的美元价格合并为单个数据帧
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
Сделанный!
Теперь давайте добавим цену биткоина в качестве последнего столбца в объединенный фрейм данных.
# 将BTC价格添加到数据帧
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
Теперь у нас есть уникальный фрейм данных, содержащий ежедневные цены в долларах США для десяти проверяемых нами криптовалют.
Мы снова вызываем предыдущую функцию df_scatter, чтобы отобразить соответствующие цены всех альткоинов в виде графика.

График выглядит отлично и дает нам полную картину того, как менялась биржевая цена каждой криптовалюты за последние несколько лет.
Примечание: здесь мы использовали логарифмическую ось Y для сравнения всех криптовалют на одном графике. Вы также можете попробовать разные значения параметров (например, scale=‘linear’), чтобы оценить данные с разных точек зрения.
Внимательные читатели, возможно, заметили, что цены на цифровые валюты, по-видимому, коррелируют, хотя их денежные стоимости сильно различаются и крайне нестабильны. Особенно после быстрого роста в апреле 2017 года, даже многие небольшие колебания, похоже, происходят синхронно с колебаниями всего рынка.
Конечно, выводы, подкрепленные данными, более убедительны, чем интуиция, основанная на изображениях.
Для проверки приведенной выше гипотезы корреляции мы можем использовать функцию Pandas corr(). Этот тест вычисляет коэффициент корреляции Пирсона для каждого столбца таблицы данных с каждым другим столбцом.
2017.8.22 Примечание к редакции: этот раздел был изменен для использования дневной доходности вместо абсолютных цен при расчете коэффициентов корреляции.
Прямой расчет на основе несплошного временного ряда (например, необработанных данных о ценах) может привести к отклонениям в коэффициенте корреляции. Наше решение этой проблемы — использовать метод pct_change() для преобразования абсолютного значения каждой цены в фрейме данных в соответствующую дневную ставку доходности.
Например, рассчитаем коэффициент корреляции за 2016 год.
# 计算2016年数字货币的皮尔森相关系数
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
| Name | 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, означает, что последовательность положительно или обратно коррелирована соответственно. Коэффициент корреляции, близкий к 0, означает, что соответствующие объекты не коррелированы и их колебания независимы друг от друга.
Для лучшей визуализации результатов мы создаем новую вспомогательную функцию визуализации.
def correlation_heatmap(df, title, absolute_bounds=True):
'''Plot a correlation heatmap for the entire dataframe'''
heatmap = go.Heatmap(
z=df.corr(method='pearson').as_matrix(),
x=df.columns,
y=df.columns,
colorbar=dict(title='Pearson Coefficient'),
)
layout = go.Layout(title=title)
if absolute_bounds:
heatmap['zmax'] = 1.0
heatmap['zmin'] = -1.0
fig = go.Figure(data=[heatmap], layout=layout)
py.iplot(fig)
correlation_heatmap(combined_df_2016.pct_change(), "Cryptocurrency Correlations in 2016")

Здесь темно-красные значения представляют сильную корреляцию (очевидно, что каждая монета сильно коррелирует сама с собой), а темно-синие значения представляют обратную корреляцию. Все цвета между ними — светло-голубой/оранжевый/серый/коричневый — имеют значения, которые представляют собой различную степень слабой корреляции или ее отсутствие.
О чем говорит нам эта фотография? На базовом уровне он показывает, как колебались цены различных криптовалют в течение 2016 года, при этом статистически значимая корреляция была незначительной.
Теперь, чтобы проверить нашу гипотезу о том, что «криптовалюты стали более коррелированными в последние месяцы», мы повторим тот же тест, используя данные за 2017 год.
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
| Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
|---|---|---|---|---|---|---|---|---|---|---|
| DASH | 1.000000 | 0.384109 | 0.480453 | 0.259616 | 0.191801 | 0.159330 | 0.299948 | 0.503832 | 0.066408 | 0.357970 |
| ETC | 0.384109 | 1.000000 | 0.602151 | 0.420945 | 0.255343 | 0.146065 | 0.303492 | 0.465322 | 0.053955 | 0.469618 |
| ETH | 0.480453 | 0.602151 | 1.000000 | 0.286121 | 0.323716 | 0.228648 | 0.343530 | 0.604572 | 0.120227 | 0.421786 |
| LTC | 0.259616 | 0.420945 | 0.286121 | 1.000000 | 0.296244 | 0.333143 | 0.250566 | 0.439261 | 0.321340 | 0.352713 |
| SC | 0.191801 | 0.255343 | 0.323716 | 0.296244 | 1.000000 | 0.417106 | 0.287986 | 0.374707 | 0.248389 | 0.377045 |
| STR | 0.159330 | 0.146065 | 0.228648 | 0.333143 | 0.417106 | 1.000000 | 0.396520 | 0.341805 | 0.621547 | 0.178706 |
| XEM | 0.299948 | 0.303492 | 0.343530 | 0.250566 | 0.287986 | 0.396520 | 1.000000 | 0.397130 | 0.270390 | 0.366707 |
| XMR | 0.503832 | 0.465322 | 0.604572 | 0.439261 | 0.374707 | 0.341805 | 0.397130 | 1.000000 | 0.213608 | 0.510163 |
| XRP | 0.066408 | 0.053955 | 0.120227 | 0.321340 | 0.248389 | 0.621547 | 0.270390 | 0.213608 | 1.000000 | 0.170070 |
| BTC | 0.357970 | 0.469618 | 0.421786 | 0.352713 | 0.377045 | 0.178706 | 0.366707 | 0.510163 | 0.170070 | 1.000000 |
Являются ли эти данные более релевантными? Достаточно ли этого, чтобы служить критерием для инвестирования? Ответ — нет.
Однако стоит отметить, что почти все криптовалюты стали все более взаимосвязанными.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")

Как вы можете видеть на картинке выше, все становится все интереснее.
Хороший вопрос! Но, честно говоря, я в этом не уверен…
Моей первой реакцией было то, что хедж-фонды недавно начали публичную торговлю на рынках криптовалют. Эти фонды держат гораздо больше капитала, чем средний трейдер. Если фонд хеджирует свой инвестиционный капитал между несколькими криптовалютами, а затем использует аналогичные факторы риска для каждой валюты на основе независимой переменной (например, фондового рынка), он будет более прибыльным. Торговля стратегии. Если рассматривать с этой точки зрения, тенденция к увеличению корреляции имеет смысл.
Более глубокое понимание XRP и STR
Например, из приведенной выше диаграммы видно, что XRP (токен Ripple) имеет самую низкую корреляцию с другими криптовалютами. Но одним заметным исключением здесь является STR (токен Stellar, официально называемый «Lumens»), который имеет сильную корреляцию с XRP (коэффициент корреляции: 0,62).
Интересно, что Stellar и Ripple — очень похожие финтех-платформы, обе из которых нацелены на сокращение громоздких этапов, связанных с переводом денег между банками через границы. Вполне возможно, что некоторые крупные игроки и хедж-фонды могут использовать схожие торговые стратегии для своих инвестиций в Stellar и Ripple, учитывая схожесть токенов, используемых блокчейн-сервисами. Возможно, именно поэтому XRP имеет более сильную корреляцию с STR, чем другие криптовалюты.
Приведенные выше объяснения в значительной степени носят умозрительный характер, и вы, возможно, сможете добиться большего. Опираясь на заложенный нами фундамент, вы можете продолжить изучение историй в своих данных сотнями различных способов.
Вот некоторые из моих предложений, которые читателям следует учесть при выборе направлений своих исследований:
Самое лучшее в биткоине и цифровых валютах в целом — это его децентрализованная природа, которая делает его более свободным и демократичным, чем любой другой актив. Поделитесь своим анализом в открытом доступе, примите участие в жизни сообщества или напишите сообщение в блоге! Надеюсь, теперь у вас есть навыки, необходимые для проведения собственного анализа и способности критически относиться к любым спекулятивным статьям о криптовалютах, которые вы прочтете в будущем, особенно к тем прогнозам, которые не подкреплены данными. Спасибо за чтение. Если у вас есть какие-либо комментарии, предложения или критика по поводу этого руководства, пожалуйста, оставьте сообщение на https://www.fmz.com/bbs.