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

В этом посте мы описываем преимущества использования результатов журнала для анализа изменений цен. Вы можете скачать этот Блокнот Jupyter и данные.

Если вы пропустили другие мои статьи на эту тему:



Вот несколько ссылок, которые могут вас заинтересовать:

- Labeling and Data Engineering for Conversational AI and Analytics
- Data Science for Business Leaders [Course]
- Intro to Machine Learning with PyTorch [Course]
- Become a Growth Product Manager [Course]
- Deep Learning (Adaptive Computation and ML series) [Ebook]
- Free skill tests for Data Scientists & Machine Learning Engineers

Некоторые из приведенных выше ссылок являются партнерскими, и если вы перейдете по ним, чтобы совершить покупку, я буду получать комиссию. Имейте в виду, что я связываю курсы из-за их качества, а не из-за комиссии, которую я получаю от ваших покупок.

Требования

О других требованиях см. Мой первый пост в блоге из этой серии.

Загрузите данные

import pandas as pd
df_btc = pd.read_csv('BTC_USD_Coinbase_hour_2017-12-24.csv', index_col='datetime')
df_eth = pd.read_csv('ETH_USD_Coinbase_hour_2017-12-24.csv', index_col='datetime')
df_ltc = pd.read_csv('LTC_USD_Coinbase_hour_2017-12-24.csv', index_col='datetime')
df = pd.DataFrame({'BTC': df_btc.close,
                   'ETH': df_eth.close,
                   'LTC': df_ltc.close})
df.index = df.index.map(pd.to_datetime)
df = df.sort_index()
df.head()

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

Определим возврат как:

Рассчитать доходность журнала

Автор книги Почему возвращаются данные журнала описывает несколько преимуществ использования результатов журнала вместо результатов, поэтому мы преобразуем уравнение возврата в уравнение возврата журнала:

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

import numpy as np
# shift moves dates back by 1
df_change = df.apply(lambda x: np.log(x) - np.log(x.shift(1)))
df_change.head()

Визуализировать возврат журнала

Строим нормализованные изменения цен закрытия за последние 50 часов. Различия в журналах можно интерпретировать как изменение в процентах.

df_change[:50].plot(figsize=(15, 10)).axhline(color='black', linewidth=2)

Цены на LTC распределяются логарифмически нормально?

Если предположить, что цены распределяются нормально логарифмически, то лог (1 + ri) удобно распределены нормально (подробности см. В разделе Почему лог возвращается).

На графике ниже мы изображаем распределение почасовых цен закрытия LTC. Мы также оцениваем параметры логнормального распределения и наносим на график предполагаемое логнормальное распределение красной линией.

from scipy.stats import lognorm
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
values = df['LTC']
shape, loc, scale = stats.lognorm.fit(values) 
x = np.linspace(values.min(), values.max(), len(values))
pdf = stats.lognorm.pdf(x, shape, loc=loc, scale=scale) 
label = 'mean=%.4f, std=%.4f, shape=%.4f' % (loc, scale, shape)
ax.hist(values, bins=30, normed=True)
ax.plot(x, pdf, 'r-', lw=2, label=label)
ax.legend(loc='best')

Нормально ли распределяются отчеты LTC?

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

import pandas as pd
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
values = df_change['LTC'][1:]  # skip first NA value
x = np.linspace(values.min(), values.max(), len(values))
loc, scale = stats.norm.fit(values)
param_density = stats.norm.pdf(x, loc=loc, scale=scale)
label = 'mean=%.4f, std=%.4f' % (loc, scale)
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(values, bins=30, normed=True)
ax.plot(x, param_density, 'r-', label=label)
ax.legend(loc='best')

Корреляция Пирсона с возвратами журнала

Мы вычисляем корреляцию Пирсона из результатов журнала. Корреляционная матрица ниже имеет те же значения, что и матрица Sifr Data. Есть различия, потому что:

Наблюдения

  • BTC и ETH имеют умеренно положительные отношения,
  • LTC и ETH имеют прочные положительные отношения.
import seaborn as sns
import matplotlib.pyplot as plt
# Compute the correlation matrix
corr = df_change.corr()
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(10, 10))
# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, annot=True, fmt = '.4f', mask=mask, center=0, square=True, linewidths=.5)

Заключение

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

Прежде чем ты уйдешь

Следуйте за мной в Twitter, где я регулярно пишу твиты о Data Science и машинном обучении.