Bitcoin and USD Tether

Does Tether Printing Cause Bitcoin Price Movement?

Introduction

It has been speculated that Bitcoin price is manipulated by the altcoin “US Tether” printing itself into existence. This analysis attempts to test that hypothesis.

Image for post
Image for post

Tests for reasoning

In the Appendix below, I will test H0 by performing a Granger causality test. A variable x is said to Granger-cause a variable y if, given the past values of y, past values of x are useful for predicting y. A common method for testing Granger causality is to regress y on its own lagged values and on lagged values of x and test the null hypothesis that the estimated coefficients on the lagged values of x are jointly zero. Failure to reject the null hypothesis is equivalent to failing to reject the hypothesis that x does not Granger-cause y.

Conclusion

The results presented in the appendix indicate that — whilst the Tether printing and Bitcoin price series are cointegrated (and thus tied together intrinsically), Tether printing does not Granger cause Bitcoin price movement. However it does provide evidence to show that Bitcoin price does Granger cause Tether printing, which is a reasonable alternative hypothesis for the apparent relationship.

Appendix: Code

#R code
require
(readr)
require(aTSA)
require(lmtest)
require(xts)
cm<-c("btc","usdt") #extend as a comma seperated list for other coinsgetS2F<-function(coin) {
coinmetrics<-read_csv(paste0("https://coinmetrics.io/newdata/",coin,".csv"),col_types = cols(date = col_date(format = "%Y-%m-%d")))
coinmetrics$flow = c(rep(NA,1),diff(coinmetrics$SplyCur,1))
coinmetrics$s2f = (coinmetrics$SplyCur)/(coinmetrics$flow*365.25)
return(coinmetrics)
}
#lets get our list of tibbles
lot<-lapply(X = cm, FUN = getS2F)
names(lot)<-cm
getXTS.price<-function(coinmetrics_df) { return(as.xts(order.by=coinmetrics_df$date,coinmetrics_df$PriceUSD))}getXTS.stock<-function(coinmetrics_df) {
return(as.xts(order.by=coinmetrics_df$date,coinmetrics_df$SplyCur))}
getXTS.flow<-function(coinmetrics_df) {
return(as.xts(order.by=coinmetrics_df$date,coinmetrics_df$flow))}
getXTS.s2f<-function(coinmetrics_df) {
return(as.xts(order.by=coinmetrics_df$date,coinmetrics_df$s2f))}
mergify<-function(x, getF) {
if(getF!='p' & getF!='s'&getF!='f'&getF!='s2f') throw("Argument must be one of p, s, f or s2f")
if(getF=='p') tscoins<-lapply(x, getXTS.price)
if(getF=='f') tscoins<-lapply(x, getXTS.flow)
if(getF=='s') tscoins<-lapply(x, getXTS.stock)
if(getF=='s2f') tscoins<-lapply(x,getXTS.s2f)
merged<-do.call(cbind, tscoins)
merged
}
#get price mergify
price.merge<-mergify(lot,getF = 'p')
stock.merge<-mergify(lot,getF = 's')
flow.merge<-mergify(lot,getF = 'f')
s2f.merge<-mergify(lot, getF='s2f')
merged<-merge(price.merge, stock.merge, flow.merge,s2f.merge)
colnames(merged)<-c("btc.price","tusd.price","btc.stock","tusd.stock","btc.flow","tusd.flow","btc.s2f","tusd.s2f")
#test for order of integration via stationarty assessment on bitcoin price and tether stock
adf.test(as.ts(log(merged$btc.price)),1)
## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 2.2 0.99
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 -2.57 0.0995
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 -2.65 0.304
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(as.ts(diff(log(merged$btc.price))),1)## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 -59.9 0.01
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 -60.2 0.01
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 -60.2 0.01
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#ok btc price O(1) confirmed
adf.test(as.ts(log(merged$tusd.stock)),1)
## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 1.72 0.979
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 -3.92 0.01
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 -2.68 0.288
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
adf.test(as.ts(diff(log(merged$tusd.stock))),1)## Augmented Dickey-Fuller Test
## alternative: stationary
##
## Type 1: no drift no trend
## lag ADF p.value
## [1,] 0 -47.6 0.01
## Type 2: with drift no trend
## lag ADF p.value
## [1,] 0 -47.7 0.01
## Type 3: with drift and trend
## lag ADF p.value
## [1,] 0 -47.9 0.01
## ----
## Note: in fact, p.value = 0.01 means p.value <= 0.01
#and tether stock O(1) confirmed, can yse engle-granger and johansen methods to test for cointegrationcoint.test(log(as.vector(merged$btc.price)),log(as.vector(merged$tusd.stock)))## Response: log(as.vector(merged$btc.price))
## Input: log(as.vector(merged$tusd.stock))
## Number of inputs: 1
## Model: y ~ X + 1
## -------------------------------
## Engle-Granger Cointegration Test
## alternative: cointegrated
##
## Type 1: no trend
## lag EG p.value
## 9.0000 -2.7801 0.0639
## -----
## Type 2: linear trend
## lag EG p.value
## 9.00 1.49 0.10
## -----
## Type 3: quadratic trend
## lag EG p.value
## 9.00 -2.52 0.10
## -----------
## Note: p.value = 0.01 means p.value <= 0.01
## : p.value = 0.10 means p.value >= 0.10
#cointegration confirmed :) #what about direction?
#first, see if price granger causes tether stock
grangertest(data=merged, log(tusd.stock)~log(btc.price))
## Granger causality test
##
## Model 1: log(tusd.stock) ~ Lags(log(tusd.stock), 1:1) + Lags(log(btc.price), 1:1)
## Model 2: log(tusd.stock) ~ Lags(log(tusd.stock), 1:1)
## Res.Df Df F Pr(>F)
## 1 2283
## 2 2284 -1 5.2966 0.02146 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#so it looks like price granger causes tether stock.
#what about other way
grangertest(data=merged, log(btc.price)~log(tusd.stock))
## Granger causality test
##
## Model 1: log(btc.price) ~ Lags(log(btc.price), 1:1) + Lags(log(tusd.stock), 1:1)
## Model 2: log(btc.price) ~ Lags(log(btc.price), 1:1)
## Res.Df Df F Pr(>F)
## 1 2283
## 2 2284 -1 0.4781 0.4894
#hmm cant reject the null on that one.
#SO it looks like bitcoin price changes precede tether stock changes.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store