
비트코인 가격의 추이는 어떠한가? 암호화폐 가격이 급등하거나 급락하는 원인은 무엇일까요? 다양한 알트코인의 시장 가격은 서로 밀접하게 연결되어 있습니까? 아니면 대체로 독립적입니까? 다음에 무슨 일이 일어날지 어떻게 예측할 수 있을까?
비트코인, 이더리움과 같은 디지털 통화에 대한 기사는 이제 추측으로 가득 차 있으며, 수백 명의 자칭 전문가가 자신들이 예상하는 추세를 옹호하고 있습니다. 이러한 분석에서 부족한 점은 기본 데이터와 통계 모델에 대한 튼튼한 기초입니다.
이 글의 목적은 Python을 이용한 암호화폐 분석에 대한 간단한 소개를 제공하는 것입니다. 우리는 다양한 암호화폐에 대한 데이터를 검색, 분석, 시각화하기 위한 간단한 Python 스크립트를 살펴보겠습니다. 그 과정에서 우리는 이러한 변동성 있는 시장의 행동에서 흥미로운 추세를 발견하고 이러한 추세가 어떻게 발전하는지 알아볼 것입니다.

이 글은 암호화폐를 설명하는 글이 아니며, 특정 암호화폐의 가격이 오르고 어떤 암호화폐의 가격이 떨어질지에 대한 의견을 제시하는 글도 아닙니다. 그 대신, 이 튜토리얼에서 우리가 중점을 두는 것은 단순히 원시 데이터를 가져와 숫자에 숨겨진 스토리를 발견하는 것입니다.
이 튜토리얼은 모든 기술 수준의 매니아, 엔지니어, 데이터 과학자를 위해 설계되었습니다. 업계 전문가이든 프로그래밍 초보자이든 필요한 기술은 Python 프로그래밍 언어에 대한 기본적인 이해와 명령줄 작업에 대한 충분한 지식뿐입니다. (데이터 과학 프로젝트를 설정할 수만 있으면 됩니다).
Inventor Quantitative Platform 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)
이제 준비가 완료되었으므로 분석할 데이터를 수집할 수 있습니다. 먼저, Inventor Quantitative Platform의 API 인터페이스를 사용하여 비트코인 가격 데이터를 얻어야 합니다.
이것은 GetTicker 함수를 사용합니다. 이 두 함수의 사용에 대한 자세한 내용은 https://www.fmz.com/api를 참조하세요.
데이터 수집을 용이하게 하기 위해 Quandl(quandl.com)에서 데이터를 다운로드하고 동기화하는 함수를 작성해야 합니다. 이는 해외에서는 매우 잘 알려진 무료 금융 데이터 인터페이스입니다. Inventor Quantitative Platform도 유사한 데이터 인터페이스를 제공하는데, 이는 주로 실시간 거래에 사용됩니다. 이 글은 주로 데이터 분석을 위한 것이므로, 여기서는 여전히 Quandl의 데이터를 사용합니다.
실시간으로 거래할 때 Python에서 GetTicker 및 GetRecords 함수를 직접 호출하여 가격 데이터를 얻을 수 있습니다. 사용법은 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
여기에서는 피클 라이브러리를 사용하여 데이터를 직렬화하고 다운로드한 데이터를 파일로 저장함으로써 프로그램을 실행할 때마다 동일한 데이터를 다시 다운로드하지 않도록 합니다. 이 함수는 Pandas Dataframe 형식으로 데이터를 반환합니다. 데이터 프레임의 개념에 익숙하지 않다면 강력한 Excel 스프레드시트라고 생각해 보세요.
크라켄 비트코인 거래소를 예로 들어 비트코인 가격을 알아보는 것부터 시작해 보겠습니다.
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
head() 메서드를 사용하여 데이터 프레임의 처음 5개 행을 봅니다.
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는 Matplotlib 등의 좀 더 성숙한 Python 데이터 시각화 라이브러리를 사용하는 것보다 덜 일반적인 선택이지만 완전한 대화형 차트를 위해 D3.js를 호출할 수 있기 때문에 좋은 선택입니다. 차트는 기본 설정이 매우 훌륭하고, 탐색하기 쉬우며, 웹 페이지에 삽입하기가 매우 편리합니다.
팁: 생성된 차트를 주요 거래소(OKEX, Binance, Huobi 등)의 비트코인 가격 차트와 비교하여 다운로드한 데이터가 대략적으로 일관성이 있는지 빠르게 확인할 수 있습니다.
주의 깊은 독자라면 위 데이터에서, 특히 2014년 후반과 2016년 초반의 데이터에서 누락된 데이터가 있다는 것을 알아챘을 것입니다. 이러한 데이터 격차는 크라켄 거래소에서 특히 두드러진다. 우리는 이러한 누락된 데이터가 가격 분석에 영향을 미치지 않기를 바랍니다.
디지털 화폐 거래소의 특징은 화폐의 가격이 수요와 공급에 따라 결정된다는 것입니다. 따라서 어떠한 거래가격도 시장의 ‘주류가격’이 될 수 없습니다. 이 문제를 해결하고, 위에서 언급한 데이터 누락 문제(기술적 중단이나 데이터 오류로 인한 것일 수 있음)를 해결하기 위해, 우리는 전 세계 3대 비트코인 거래소에서 데이터를 다운로드하여 비트코인의 평균 가격을 계산할 것입니다.
각 거래소의 데이터를 사전 유형으로 구성된 데이터 프레임으로 다운로드하는 것부터 시작해 보겠습니다.
# 下载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()” 메서드를 사용하여 병합된 데이터의 마지막 5개 행을 보고 데이터가 정확하고 완전한지 확인합니다.
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')

위 그래프에서 볼 수 있듯이, 4개 시리즈는 거의 같은 경로를 따르지만, 몇 가지 불규칙성이 있습니다. 이를 해소해 보겠습니다.
2012~2017년 기간 동안 비트코인의 가격이 0이었던 적이 없다는 것을 알고 있으므로 먼저 데이터 프레임에서 모든 0 값을 제거합니다.
# 清除"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])

문제가 없는 듯하며, 나중에 이 통합된 가격 시리즈 데이터를 사용하여 다른 암호화폐와 미국 달러 간의 환율을 파악할 수 있을 것입니다.
지금까지 비트코인 가격에 대한 시계열 데이터가 있습니다. 다음으로 비트코인이 아닌 디지털 통화, 즉 알트코인의 상황에 대한 데이터를 살펴보겠습니다. 물론 알트코인이라는 용어가 너무 강할 수도 있지만 디지털 통화의 현재 발전에 관해서는 시가총액 순위 외에도 상위 10위권(비트코인, 이더리움, EOS, USDT 등)의 대부분은 알트코인이라고 할 수 있습니다. 문제 없습니다. 거래할 때 이러한 통화는 너무 혼란스럽고 기만적이기 때문에 피해야 합니다. 높음.
먼저, 폴로닉스 거래소의 API를 사용하여 디지털 화폐 거래에 대한 데이터 정보를 얻습니다. 우리는 알트코인의 관련 데이터를 얻기 위해 두 개의 보조 함수를 정의합니다. 이 두 함수는 주로 API를 통해 JSON 데이터를 다운로드하고 캐시합니다.
먼저, 주어진 URL에서 JSON 데이터를 다운로드하고 캐시하는 get_json_data 함수를 정의합니다.
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
다음으로, Poloniex API에 HTTP 요청을 하고 방금 정의한 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”)를 추출하고 두 통화의 과거 가격을 포함하는 데이터 프레임을 반환합니다.
대부분의 알트코인은 미국 달러를 사용하여 직접 구매할 수 없습니다. 개인이 이러한 디지털 통화를 얻고자 하는 경우 일반적으로 먼저 비트코인을 구매한 다음 가격 비율에 따라 알트코인으로 교환해야 합니다. 따라서 각 디지털 화폐의 환율을 비트코인으로 다운로드한 다음, 기존의 비트코인 가격 데이터를 사용하여 미국 달러로 변환해야 합니다. 우리는 이더리움, 라이트코인, 리플, 이더리움클래식, 스텔라, 대시, 시아코인, 모네로, NEM 등 9가지 주요 암호화폐에 대한 거래 데이터를 다운로드할 것입니다.
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개의 데이터 프레임을 포함하는 사전을 가지고 있으며, 각 데이터 프레임에는 알트코인과 비트코인 간의 과거 일별 평균 가격 데이터가 포함되어 있습니다.
이더리움 가격표의 마지막 몇 행을 살펴보면 데이터가 정확한지 확인할 수 있습니다.
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로 환산된 각 알트코인의 과거 가격을 직접 계산할 수 있습니다.
# 将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']
여기서는 각 알트코인에 대한 새로운 열을 데이터프레임에 추가하여 해당 USD 가격을 저장합니다.
다음으로, 앞서 정의한 merge_dfs_on_column 함수를 재사용하여 각 암호화폐의 USD 가격을 통합하는 병합된 데이터프레임을 생성할 수 있습니다.
# 将每个山寨币的美元价格合并为单个数据帧
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']
이제 우리는 검증 중인 10가지 암호화폐에 대한 일일 USD 가격을 포함하는 고유한 데이터 프레임을 갖게 되었습니다.
이전 함수인 df_scatter를 다시 호출하여 모든 알트코인의 해당 가격을 차트 형태로 표시합니다.

차트는 훌륭해 보이고 지난 몇 년 동안 각 암호화폐의 거래소 가격이 어떻게 변화했는지에 대한 전체적인 그림을 제공합니다.
참고: 여기에서는 동일한 그래프에 있는 모든 암호화폐를 비교하기 위해 대수 y축을 사용했습니다. 또한 다양한 매개변수 값(예: scale=‘linear’)을 시도하여 데이터를 다양한 관점에서 이해할 수 있습니다.
주의 깊은 독자라면 디지털 화폐의 가격이 서로 상관관계가 있는 것처럼 보인다는 것을 알아챘을 것입니다. 하지만 디지털 화폐의 화폐적 가치는 매우 다양하고 변동성이 큽니다. 특히 2017년 4월의 급격한 상승 이후, 많은 작은 변동조차도 전체 시장의 변동과 연동되어 나타나는 것처럼 보입니다.
물론, 데이터로 뒷받침된 결론은 이미지에 기반한 직감보다 더 설득력이 있습니다.
우리는 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(스텔라의 토큰, 공식 명칭은 “루멘스”)입니다. 이는 XRP와 강한 상관관계(상관계수: 0.62)를 가지고 있습니다.
흥미로운 점은 스텔라와 리플은 모두 국경을 넘나드는 은행 간 자금 이체에 필요한 번거로운 단계를 줄이는 것을 목표로 하는 매우 유사한 핀테크 플랫폼이라는 점입니다. 블록체인 서비스에서 사용하는 토큰이 유사하다는 점을 감안하면, 일부 대형 기업과 헤지펀드가 스텔라와 리플에 투자할 때 비슷한 거래 전략을 사용할 가능성이 있습니다. 이것이 XRP가 다른 암호화폐보다 STR과 더 강한 상관관계를 가지는 이유일 수 있습니다.
위의 설명은 대부분 추측에 의한 것이며, 더 나은 설명이 가능할 수도 있습니다. 우리가 마련한 기반을 바탕으로 데이터의 스토리를 계속 탐색할 수 있는 수백 가지의 다양한 방법이 있습니다.
독자들이 연구 방향을 고려할 수 있도록 제가 제안하는 내용은 다음과 같습니다.
비트코인과 일반적인 디지털 통화의 가장 좋은 점은 분산화된 성격으로, 다른 자산보다 더 자유롭고 민주적입니다. 여러분의 분석을 오픈 소스로 공유하고, 커뮤니티에 참여하거나, 블로그 게시물을 작성해 보세요! 이제 여러분은 스스로 분석을 수행하고, 앞으로 읽을 모든 암호화폐 추측 기사, 특히 데이터에 뒷받침되지 않는 예측에 대해 비판적으로 생각할 수 있는 기술을 갖추었기를 바랍니다. 읽어주셔서 감사합니다. 이 튜토리얼에 대한 의견, 제안 또는 비판이 있으시면 https://www.fmz.com/bbs에 메시지를 남겨주세요.