0
Подписаться
78
Подписчики

Количественный анализ рынка цифровой валюты

Создано: 2019-08-16 10:37:23, Обновлено: 2023-10-19 21:04:20
comments   3
hits   3748

Количественный анализ рынка цифровой валюты

Подход к анализу спекуляций цифровой валютой на основе данных

Какова цена биткоина? Что заставляет цены на криптовалюту взлетать и падать? Являются ли рыночные цены различных альткоинов неразрывно связанными между собой или они в значительной степени независимы? Как предсказать, что произойдет дальше?

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

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

Количественный анализ рынка цифровой валюты

Это не статья, объясняющая криптовалюты, и не авторское мнение о том, какие конкретные валюты вырастут, а какие упадут. Вместо этого в этом уроке мы сосредоточимся на том, чтобы просто взять необработанные данные и раскрыть истории, скрытые в цифрах.

Шаг 1: Создание рабочей среды для обработки данных

Это руководство предназначено для энтузиастов, инженеров и специалистов по данным всех уровней квалификации. Независимо от того, являетесь ли вы экспертом в отрасли или новичком в программировании, единственные навыки, которые вам нужны, — это базовое понимание языка программирования Python и достаточные знания операций командной строки. (Просто уметь организовать проект по анализу и обработке данных).

1.1 Установка Inventor Quant Host и настройка Anaconda

  • Изобретатель количественной системы хранения

Помимо предоставления высококачественных источников данных с крупнейших бирж, количественная платформа 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.

1.2 Создание среды проекта анализа данных Anaconda

После установки 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 создает специальный каталог среды для каждого пакета зависимостей проекта, чтобы все пакеты можно было правильно управлять и различать.

1.3 Создание блокнота Jupyter

После установки пакетов среды и зависимостей запустите

jupyter notebook

Чтобы запустить ядро ​​iPython, перейдите в браузере на страницу http://localhost:8888/ и создайте новый блокнот Python, убедившись, что он использует:

Python [conda env:cryptocurrency-analysis]

Ядро

Количественный анализ рынка цифровой валюты

1.4 Импорт зависимых пакетов

Создайте новый пустой блокнот 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)

Шаг 2: Получите информацию о цене цифровой валюты

Теперь, когда подготовка завершена, мы можем приступить к сбору данных для анализа. Во-первых, нам необходимо использовать API-интерфейс количественной платформы Inventor для получения данных о цене биткоина.

Это будет использовать функцию GetTicker. Подробности использования этих двух функций см. здесь: https://www.fmz.com/api

2.1 Написать функцию сбора данных Quandl

Для упрощения сбора данных нам необходимо написать функцию для загрузки и синхронизации данных из 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.

2.2 Получение данных о ценах криптовалют с биржи Kraken

Давайте возьмем в качестве примера биржу биткоинов 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) в качестве быстрой проверки, чтобы убедиться, что загруженные данные в целом соответствуют друг другу.

2.3 Получение данных о ценах с основных бирж биткоинов

Внимательные читатели, возможно, заметили, что в приведенных выше данных отсутствуют некоторые данные, особенно за конец 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

2.4 Интеграция всех данных в один фрейм данных

Далее мы определим специальную функцию для объединения общих столбцов из каждого фрейма данных в новый фрейм данных. Назовем ее функцией 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

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

2.5 Процесс визуализации ценовых данных

С точки зрения аналитической логики следующим шагом является сравнение этих данных посредством визуализации. Для этого нам нужно сначала определить вспомогательную функцию, которая использует данные для построения диаграммы, предоставляя однострочную команду. Назовем ее функцией 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')

Количественный анализ рынка цифровой валюты

2.6 Чистые и агрегированные данные о ценах

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

Мы знаем, что в период 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])

Количественный анализ рынка цифровой валюты

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

Шаг 3: Соберите цены на альткоины

На данный момент у нас есть временные ряды данных по ценам биткоинов. Далее давайте рассмотрим некоторые данные о цифровых валютах, отличных от Bitcoin, а именно ситуацию с альткоинами. Конечно, термин альткоин может быть слишком сильным, но что касается текущего развития цифровых валют, в дополнение к рейтингу рыночной капитализации Большинство из первой десятки (например, Bitcoin, Ethereum, EOS, USDT и т. д.) можно назвать альткоинами. Нет проблем. Мы должны стараться держаться подальше от этих валют при торговле, потому что они слишком запутанные и обманчивые. высокий.

3.1 Определение вспомогательных функций через API биржи Poloniex

Во-первых, мы используем 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&currencyPair={}&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») и вернет фрейм данных, содержащий исторические цены обеих валют.

3.2 Загрузка данных о ценах транзакций с Poloniex

Большинство альткоинов нельзя купить напрямую за доллары США. Если люди хотят получить эти цифровые валюты, им обычно приходится сначала покупать биткоины, а затем обменивать их на альткоины на основе соотношения цен между ними. Поэтому нам придется загрузить обменный курс каждой цифровой валюты в биткоин, а затем использовать существующие данные о цене биткоина для конвертации в доллары США. Мы загрузим данные о транзакциях для 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

3.3 Все данные о ценах должны быть выражены в долларах США.

Теперь мы можем объединить данные по обменному курсу 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’), чтобы оценить данные с разных точек зрения.

3.4 Начать корреляционный анализ

Внимательные читатели, возможно, заметили, что цены на цифровые валюты, по-видимому, коррелируют, хотя их денежные стоимости сильно различаются и крайне нестабильны. Особенно после быстрого роста в апреле 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, чем другие криптовалюты.

Хорошо, теперь твоя очередь!

Приведенные выше объяснения в значительной степени носят умозрительный характер, и вы, возможно, сможете добиться большего. Опираясь на заложенный нами фундамент, вы можете продолжить изучение историй в своих данных сотнями различных способов.

Вот некоторые из моих предложений, которые читателям следует учесть при выборе направлений своих исследований:

  • Добавление данных о большем количестве криптовалют в общий анализ
  • Отрегулируйте временной диапазон и степень детализации корреляционного анализа, чтобы получить более детальные или более общие представления о тенденциях.
  • Найдите тенденции в объеме транзакций или анализе данных блокчейна. Если вы хотите спрогнозировать будущие колебания цен, вам могут понадобиться данные о соотношении объемов покупок и продаж больше, чем необработанные данные о ценах.
  • Добавьте данные о ценах на акции, товары и фиатные валюты, чтобы определить, какие из них коррелируют с криптовалютами (но помните старую поговорку «корреляция не подразумевает причинно-следственную связь»).
  • Используйте Event Registry, GDELT и Google Trends, чтобы подсчитать количество «горячих слов», окружающих конкретную криптовалюту.
  • Используйте данные для обучения модели машинного обучения, которая позволит прогнозировать завтрашнюю цену. Если вы настроены более амбициозно, вы можете даже рассмотреть возможность проведения описанного выше обучения с помощью рекуррентной нейронной сети (RNN).
  • Используйте свой анализ для создания автоматизированного торгового бота, который можно использовать на таких биржевых сайтах, как «Poloniex» или «Coinbase», через соответствующий интерфейс прикладного программирования (API). Будьте осторожны: плохо работающий бот может легко и в одно мгновение уничтожить ваши активы. Рекомендуется использовать количественную платформу изобретателя FMZ.COM.

Самое лучшее в биткоине и цифровых валютах в целом — это его децентрализованная природа, которая делает его более свободным и демократичным, чем любой другой актив. Поделитесь своим анализом в открытом доступе, примите участие в жизни сообщества или напишите сообщение в блоге! Надеюсь, теперь у вас есть навыки, необходимые для проведения собственного анализа и способности критически относиться к любым спекулятивным статьям о криптовалютах, которые вы прочтете в будущем, особенно к тем прогнозам, которые не подкреплены данными. Спасибо за чтение. Если у вас есть какие-либо комментарии, предложения или критика по поводу этого руководства, пожалуйста, оставьте сообщение на https://www.fmz.com/bbs.