본문 바로가기
파이썬/가상화폐

Python으로 코인간 상관관계 계산 Pearson Coefficient of Correlation / 비트코인

by 행복론자 2020. 3. 5.

대폭락자을 제외하고 보통 하락장이라고 하는 주식 시황을 보면

어느 주식은 떨어지는 반면 그 와중에도 꽤나 잘 오르거나 버티는 주식이 있기 마련인 것 같습니다. 

 

하지만 코인시장을 보면 내가 보유한 코인이 떨어진다 싶어서 보면 나머지 대부분의 코인들도 다같이 줄줄이 떡락.. 해버리는 것 같은 느낌을 많이 받습니다. 

 

이를 확인해보기 위해 코인간 가격 움직임을 바탕으로 상관성을 계산해보고 진짜 연관이 있는지를 살펴보겠습니다. 

이 과정에서 피어슨 상관 계수(Pearson Coefficient of Correlation)를 사용하겠습니다. 

피어슨 상관 계수는 두 변수가 함께 변하는 정도를 각자 변하는 정도로 나눠 상관성을 계산하는 방식으로 두 변수가 서로 인과관계가 있음을 의미하는 것은 아닙니다. 

 

여기서 상관 계수가 1에 가까울수록 강한 상관성이 있고 (A가 오르면 보통 B도 오르고 또 B가 오르면 A도 오르는)

-1에 가까울수록 서로 반대의 관계이고 (A가 오르면 B가 내려가는)

0이면 전혀 상관이 없다고 할 수 있습니다.

 

먼저 코인들의 가격 정보를 받기 위해서는 pybithumb 패키지를 사용했습니다.

import pybithumb

 

 

상관성 분석에 사용할 코인들은 비트코인, 리플, 이더리움, 이더리움클래식 (BTC, XRP, ETH, ETC)이므로 

각각 가격을 받아옵니다.

# 비트코인 BTC
df_BTC = pybithumb.get_ohlcv("BTC")

# 리플 XRP
df_XRP = pybithumb.get_ohlcv("XRP")

# 이더리움 ETH
df_ETH = pybithumb.get_ohlcv("ETH")

# 이더리움클래식 ETC
df_ETC = pybithumb.get_ohlcv("ETC")

 

 

상관성 분석에 사용할 기준값은 각 코인별 종가 변화(%)로 삼고 이를 각각 계산해보겠습니다.

# 비트코인 BTC
df_BTC = pybithumb.get_ohlcv("BTC")
df_BTC['price_change'] = (df_BTC['close'] - df_BTC['close'].shift(1)) / df_BTC['close'] * 100

# 리플 XRP
df_XRP = pybithumb.get_ohlcv("XRP")
df_XRP['price_change'] = (df_XRP['close'] - df_XRP['close'].shift(1)) / df_XRP['close'] * 100

# 이더리움 ETH
df_ETH = pybithumb.get_ohlcv("ETH")
df_ETH['price_change'] = (df_ETH['close'] - df_ETH['close'].shift(1)) / df_ETH['close'] * 100

# 이더리움클래식 ETC
df_ETC = pybithumb.get_ohlcv("ETC")
df_ETC['price_change'] = (df_ETC['close'] - df_ETC['close'].shift(1)) / df_ETC['close'] * 100

 

 

이렇게 가져온 데이터를 엑셀로 확인해보면 잘 가져왔음을 확인할 수 있습니다.

그런데 리플은 이중 가장 나중에 거래소에 상장되었기 때문에 2017-06-01일부터 price_change 값을 갖고 있어 나머지 코인들도 이에 맞춰줍니다.

df_BTC = df_BTC[(df_BTC.index >= '2017-06-01')]
df_XRP = df_XRP[(df_XRP.index >= '2017-06-01')]
df_ETH = df_ETH[(df_ETH.index >= '2017-06-01')]
df_ETC = df_ETC[(df_ETC.index >= '2017-06-01')]

 

 

마지막으로 각기 다른 DataFrame을 하나로 합쳐서 상관성을 계산해보겠습니다.

df_concat = pd.concat([df_BTC['price_change'].rename('btc_change'), df_XRP['price_change'].rename('xrp_change'), df_ETH['price_change'].rename('eth_change'), df_ETC['price_change'].rename('etc_change')], axis=1)
correlation_matrix = df_concat[['btc_change', 'xrp_change', 'eth_change', 'etc_change']].corr(method='pearson')

 

 

아래는 수행 결과입니다.

print(correlation_matrix)
'''
            btc_change  xrp_change  eth_change  etc_change
btc_change    1.000000    0.565755    0.722908    0.648832
xrp_change    0.565755    1.000000    0.632550    0.550197
eth_change    0.722908    0.632550    1.000000    0.758878
etc_change    0.648832    0.550197    0.758878    1.000000
'''

 

 

각 코인의 가격 움직임으로만 놓고 보았을 때 피어슨 상관 계수는 모두 0.3 이상으로 꽤 뚜렷한 관계임을 알 수 있습니다.

 

특히 이더리움과 이더리움클래식이 제일 높은 상관성을 보여줍니다. 

이렇게 확인해보니 폭락하면 대부분 폭락하거나 오르면 다 같이 오르는 것이 기분 탓만은 아니라는 것을 알 수 있었습니다.

 

아래는 전체 코드입니다. 다른 것도 해보느라 위에서 첨부하지 않은 부분도 있습니다.

import pybithumb
import pandas as pd

# 비트코인 BTC
df_BTC = pybithumb.get_ohlcv("BTC")
df_BTC['price_change'] = (df_BTC['close'] - df_BTC['close'].shift(1)) / df_BTC['close'] * 100
df_BTC['volume_change'] = (df_BTC['volume'] - df_BTC['volume'].shift(1)) / df_BTC['volume'] * 100
df_BTC['volatility'] = (df_BTC['high'] - df_BTC['low']) / df_BTC['close'] * 100

# 리플 XRP
df_XRP = pybithumb.get_ohlcv("XRP")
df_XRP['price_change'] = (df_XRP['close'] - df_XRP['close'].shift(1)) / df_XRP['close'] * 100
df_XRP['volume_change'] = (df_XRP['volume'] - df_XRP['volume'].shift(1)) / df_XRP['volume'] * 100
df_XRP['volatility'] = (df_XRP['high'] - df_XRP['low']) / df_XRP['close'] * 100

# 이더리움 ETH
df_ETH = pybithumb.get_ohlcv("ETH")
df_ETH['price_change'] = (df_ETH['close'] - df_ETH['close'].shift(1)) / df_ETH['close'] * 100
df_ETH['volume_change'] = (df_ETH['volume'] - df_ETH['volume'].shift(1)) / df_ETH['volume'] * 100
df_ETH['volatility'] = (df_ETH['high'] - df_ETH['low']) / df_ETH['close'] * 100

# 이더리움클래식 ETC
df_ETC = pybithumb.get_ohlcv("ETC")
df_ETC['price_change'] = (df_ETC['close'] - df_ETC['close'].shift(1)) / df_ETC['close'] * 100
df_ETC['volume_change'] = (df_ETC['volume'] - df_ETC['volume'].shift(1)) / df_ETC['volume'] * 100
df_ETC['volatility'] = (df_ETC['high'] - df_ETC['low']) / df_ETC['close'] * 100

df_BTC = df_BTC[(df_BTC.index >= '2017-06-01')]
df_XRP = df_XRP[(df_XRP.index >= '2017-06-01')]
df_ETH = df_ETH[(df_ETH.index >= '2017-06-01')]
df_ETC = df_ETC[(df_ETC.index >= '2017-06-01')]

df_BTC.to_csv('btc.csv')
df_XRP.to_csv('xrp.csv')
df_ETH.to_csv('eth.csv')
df_ETC.to_csv('etc.csv')

# 각 코인당 가격과 거래량의 움직임의 상관관계 구하기
data_BTC = df_BTC[['price_change', 'volume_change']]
correlation_BTC = data_BTC.corr(method='pearson')
data_XRP = df_XRP[['price_change', 'volume_change']]
correlation_XRP = data_XRP.corr(method='pearson')

df_concat = pd.concat([df_BTC['price_change'].rename('btc_change'), df_XRP['price_change'].rename('xrp_change'), df_ETH['price_change'].rename('eth_change'), df_ETC['price_change'].rename('etc_change')], axis=1)
correlation_matrix = df_concat[['btc_change', 'xrp_change', 'eth_change', 'etc_change']].corr(method='pearson')

print(correlation_matrix)

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글