В предыдущем посте мы проанализировали необработанные изменения цен на криптовалюты. Проблема с этим подходом заключается в том, что цены на разные криптовалюты не нормализованы, и мы не можем использовать сопоставимые показатели.
В этом посте мы описываем преимущества использования результатов журнала для анализа изменений цен. Вы можете скачать этот Блокнот 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. Есть различия, потому что:
- мы не рассчитываем средневзвешенные дневные цены
- разный период времени (ежечасно и ежедневно),
- разные источники данных (Coinbase и Poloniex).
Наблюдения
- 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 и машинном обучении.