This post is an introduction to a series of posts on analyzing Bitcoin data with R
read moreRetrieving Bitcoin transaction data
Bitcoin data is easily available e.g. via (http://api.bitcoincharts.com/v1/csv/).
Specifically I used the file bitstampUSD.csv.gz
which contains transactions on the Bitstamp exchange.
At the time of writing the file size is a 474 MB download and 2.60 GB when unzipped.
Reading the data into R is simple, although it does take awhile due to the file size.
setwd('C:/MyFileLocation/')
rawdata <- read.csv('.bitstampUSD.csv', sep = ',', dec = '.', head=FALSE)
Setup the data in a time series format for ease of use and structure it in a typical OHLCV (Open, High, Low, Close, Volume) format:
colnames(rawdata) <- c('timesec', 'USD', 'Volume')
sec_to_date = function(sec) {
as.POSIXct(sec, origin = '1970-01-01', tz = 'UTC')
}
Sys.setenv(TZ = "UTC")
rawdata$datetime <- sec_to_date(rawdata[,1])
rawdata <- xts(x = rawdata[,2:3], order.by = rawdata$datetime, tz = "UTC")
#Open
startpoints <- function (x, on = "months", k = 1) {
head(endpoints(x, on, k) + 1, -1)
}
rawdailyopen <- rawdata$USD[startpoints(rawdata, "days")]
tclass(rawdailyopen) <- "Date"
#High
rawdailymax <- period.apply(rawdata$USD, INDEX = endpoints(rawdata, "days"), FUN = max)
tclass(rawdailymax) <- "Date"
#Low
rawdailymin <- period.apply(rawdata$USD, INDEX = endpoints(rawdata, "days"), FUN = min)
tclass(rawdailymin) <- "Date"
#Close
rawdailyclose <- rawdata$USD[endpoints(rawdata, "days")]
tclass(rawdailyclose) <- "Date"
#Volume
rawdailyvol <- period.apply(rawdata$Volume, INDEX = endpoints(rawdata, "days"), FUN = sum)
tclass(rawdailyvol) <- "Date"
.index(rawdailyopen) <- .index(rawdailyclose)
rawdailyohlc <- merge.xts(rawdailyopen, rawdailymax, rawdailymin, rawdailyclose, rawdailyvol)
colnames(rawdailyohlc) <- c("Open", "High", "Low", "Close", "Volume")
Last time we did the analysis with data up to approximately to the end of the year 2017. We now have five more years of data in 2022.
dailyret <- dailyReturn(Cl(rawdailyohlc))
store <- table.Stats(dailyret["/2017-12-29"])
store <- cbind(store, table.Stats(dailyret["2018-01-01/"]))
store <- cbind(store, table.Stats(dailyret))
colnames(store) <- c('2011-2017', '2017-2022', '2011-2022')
store
Summary statistics for daily returns of Bitcoin during two different subperiods and the full sample:
2011-2017 2017-2022 2011-2022
Observations 2279.0000 1779.0000 4060.0000
NAs 0.0000 0.0000 0.0000
Minimum -0.4852 -0.3898 -0.4852
Quartile 1 -0.0110 -0.0165 -0.0138
Median 0.0024 0.0010 0.0018
Arithmetic Mean 0.0048 0.0009 0.0031
Geometric Mean 0.0034 0.0001 0.0020
Quartile 3 0.0201 0.0186 0.0194
Maximum 0.5613 0.1945 0.5613
SE Mean 0.0011 0.0009 0.0007
LCL Mean (0.95) 0.0027 -0.0009 0.0016
UCL Mean (0.95) 0.0069 0.0028 0.0045
Variance 0.0027 0.0016 0.0022
Stdev 0.0518 0.0400 0.0471
Skewness 0.3622 -0.4100 0.1890
Kurtosis 18.5765 7.3008 17.1983
It is also relevant because Bitcoin is going through it's third largest drawdown in history.
table.Drawdowns(dailyret, top = 5, digits = 3, geometric = TRUE)
The third drawdown is the one that is ongoing since 2021-11-09 and is still not over. It is approaching the longest drawdowns that started in 2013 and 2017.
From Trough To Depth Length To Trough Recovery
1 2013-12-05 2015-01-14 2017-02-23 -0.849 1174 403 771
2 2017-12-17 2018-12-15 2020-11-30 -0.834 1080 364 716
3 2021-11-09 2022-11-09 <NA> -0.765 372 366 NA
4 2013-04-10 2013-07-06 2013-11-05 -0.710 210 88 122
5 2011-09-26 2011-10-20 2012-01-05 -0.630 84 18 66
We could consider the following questions:
- Is the distribution of daily / monthly Bitcoin returns different?
- Is bitcoin more or less correlated with the SP500 than it used to be?
- Do the new return dynamics indicate a different portfolio allocation?