본문 바로가기

정리/데이터 분석

[R] 비트코인 트랜드 제거하기

728x90
[R] Bitcoin Trend 제거하기

1 시작

과거 금융공학자들은 금융 상품에서 트랜드를 제거하여 변동성을 분석했다고 한다.

이에 비트코인 그래프도 Trend를 찾고 이를 제거하는 과정을 정리하려한다.

2 비트코인 그래프(11/02 ~ 11/03)

먼저 일정 시간의 비트코인 그래프를 그려보자.

source(paste0(getwd(),'/../../bitcoin/config/formarkdown_config.R'))
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
res<-callBTCWON(callConnection(), "2018-11-02","2018-11-03")
res[['candleDT']]<-1:nrow(res)  # index
res[['candleDateTime2']]<-as.POSIXct(res$candleDateTime, format = "%Y-%m-%dT%H:%M")  # character to date

breaks_n<-length(unique(substr(res$candleDateTime,1,10)))
head(res)
##                 code            candleDateTime     timestamp unit
## 1 CRIX.UPBIT.KRW-BTC 2018-11-02T00:00:00+00:00 1541116859934    1
## 2 CRIX.UPBIT.KRW-BTC 2018-11-02T00:01:00+00:00 1541116916663    1
## 3 CRIX.UPBIT.KRW-BTC 2018-11-02T00:02:00+00:00 1541116979084    1
## 4 CRIX.UPBIT.KRW-BTC 2018-11-02T00:03:00+00:00 1541117039281    1
## 5 CRIX.UPBIT.KRW-BTC 2018-11-02T00:04:00+00:00 1541117099731    1
## 6 CRIX.UPBIT.KRW-BTC 2018-11-02T00:05:00+00:00 1541117158516    1
##           candleDateTimeKst openingPrice highPrice lowPrice tradePrice
## 1 2018-11-02T09:00:00+09:00      7186000   7189000  7183000    7188000
## 2 2018-11-02T09:01:00+09:00      7188000   7189000  7184000    7188000
## 3 2018-11-02T09:02:00+09:00      7188000   7188000  7184000    7188000
## 4 2018-11-02T09:03:00+09:00      7188000   7188000  7182000    7185000
## 5 2018-11-02T09:04:00+09:00      7183000   7184000  7182000    7183000
## 6 2018-11-02T09:05:00+09:00      7184000   7185000  7181000    7183000
##   candleAccTradeVolume candleAccTradePrice candleDT     candleDateTime2
## 1               7.3204            52608784        1 2018-11-02 00:00:00
## 2               5.9614            42835977        2 2018-11-02 00:01:00
## 3               1.5492            11132489        3 2018-11-02 00:02:00
## 4               2.5430            18270120        4 2018-11-02 00:03:00
## 5               1.6415            11789150        5 2018-11-02 00:04:00
## 6               1.4798            10629456        6 2018-11-02 00:05:00
gg<-ggplot(res)
gg+geom_line(aes(x=candleDateTime2, y=openingPrice), color="black")+
  # scale_x_datetime(labels = date_format("%Y-%m-%d %HH:%MM:%SS"), breaks=pretty_breaks(n = breaks_n)(as_datetime(c(min(unique(substr(res$candleDateTime,1,10))),max(unique(substr(res$candleDateTime,1,10)))))))+
  labs(x = "Date", y = "Open Price")+
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

3 비트코인 그래프와 선형 트랜드 plot 결합

위 그래프에 선형 트랜드 Plot 을 합쳐보자. 빨간 줄이 잘 구해진 것 같다. 추세가 잘 반영된 듯 하다.

##회귀선을 구해보자
lm.res<-lm(data=res, formula=openingPrice ~ candleDateTime2)
#트랜드 파악
predicted_df <- data.frame(pred = predict(lm.res, res), time=res$candleDateTime2)
gg<-ggplot(res)
gg+geom_line(aes(x=candleDateTime2, y=openingPrice), color="black")+
  ## 트랜드 그래프
  geom_line(color='red',data = predicted_df, aes(x=time, y=pred))+
  labs(x = "Date", y = "Open Price")+
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

#트랜드를 제거한 비트코인 그래프 다음은 트랜드를 제거하는 것인데 res 에서 predicted_df 의 각각의 y 값을 빼보자.

res[['removed_trend']]<-res$openingPrice-predicted_df$pred

gg<-ggplot(res)
gg+ geom_line(aes(x=candleDateTime2, y=removed_trend), color="blue")+
  labs(x = "Date", y = "Open Price")+
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

성공했다. 위처럼 트랜드를 제거하면 일반적인 변동성을 파악 할 수 있게 된다. 하지만 조심해야 할게 있다고 한다. 추세를 제거한 뒤 선형 분석을 하는 것은 ’허구적 상관관계’에 의해 각 변인끼리 높은 상관성을 보이기도 하므로 잘못된 의사결정을 초래 할 수 있다.

4 남은 과제

단일 트랜드를 제거하는 것이 아닌 복수의 트랜드를 찾아내 제거하는 작업이 남아있다. 이는 다음 포스팅에서 해보려 한다.