Let's take a look at the data with a simple plot. We put two plots on one and manipulate the margins to fit better.
png('btc_plot_daily_cl-vol.png')
par(mfrow = c(2, 1))
par(mar = c(3, 2, 3, 2))
plot(rawdailyohlc$Close, main = "Bitcoin USD Close")
plot(rawdailyohlc$Volume, main = "Bitcoin Volume")
dev.off()
Using the PerformanceAnalytics package we can get a quick summary of our time series variable.
library(PerformanceAnalytics)
table.Stats(rawdailyohlc)
The output looks like the following. Volume is in scientific notation.
Open High Low Close Volume
Observations 2253.0000 2253.0000 2253.0000 2253.0000 2.253000e+03
NAs 0.0000 0.0000 0.0000 0.0000 0.000000e+00
Minimum 2.2200 2.2700 1.5000 2.2400 2.500000e-01
Quartile 1 88.0400 90.6600 81.5000 88.1600 3.012206e+03
Median 349.9900 359.0000 340.0100 350.0000 6.745395e+03
Arithmetic Mean 699.7319 724.3399 676.8089 704.7470 9.908925e+03
Geometric Mean 192.3329 197.9920 186.0529 193.1077 4.705933e+03
Quartile 3 635.1600 652.7900 618.6700 635.0000 1.303740e+04
Maximum 10875.6800 11800.0100 10637.6900 11180.7800 1.370702e+05
SE Mean 27.3959 28.6678 26.4880 27.7876 2.392046e+02
LCL Mean (0.95) 646.0081 668.1219 624.8654 650.2551 9.439841e+03
UCL Mean (0.95) 753.4558 780.5578 728.7525 759.2389 1.037801e+04
Variance 1690954.3066 1851606.2422 1580741.6520 1739652.5330 1.289141e+08
Stdev 1300.3670 1360.7374 1257.2755 1318.9589 1.135403e+04
Skewness 3.8896 3.9671 3.9006 3.9386 3.533900e+00
Kurtosis 17.5976 18.5721 17.6967 18.1663 2.235400e+01
We can also calculate daily returns from the closing values of the Bitcoin USD value:
dailyret <- dailyReturn(Cl(rawdailyohlc))
table.Stats(dailyret)
The result looks like this:
daily.returns
Observations 2253.0000
NAs 0.0000
Minimum -0.4852
Quartile 1 -0.0109
Median 0.0024
Arithmetic Mean 0.0047
Geometric Mean 0.0034
Quartile 3 0.0201
Maximum 0.5613
SE Mean 0.0011
LCL Mean (0.95) 0.0026
UCL Mean (0.95) 0.0068
Variance 0.0026
Stdev 0.0514
Skewness 0.3289
Kurtosis 19.2614
Monthly returns can also be calculated from the daily raw data in xts format.
monthret <- monthlyReturn(Cl(rawdailyohlc))
table.Stats(monthret)
They look like this:
monthly.returns
Observations 76.0000
NAs 0.0000
Minimum -0.3461
Quartile 1 -0.0708
Median 0.0771
Arithmetic Mean 0.1743
Geometric Mean 0.1042
Quartile 3 0.2408
Maximum 4.5002
SE Mean 0.0681
LCL Mean (0.95) 0.0386
UCL Mean (0.95) 0.3100
Variance 0.3527
Stdev 0.5939
Skewness 5.4655
Kurtosis 36.0110
Let's quickly plot the daily returns to see what they look like:
png('btc_plot_daily_retspanel.png')
par(mfrow = c(2,2))
par(mar = c(3, 2, 3, 2))
plot(Cl(rawdailyohlc))
plot(dailyret)
hist(dailyret, breaks = 100)
qqnorm(as.vector(dailyret))
qqline(as.vector(dailyret))
dev.off()
We might want to compare the distribution of daily returns to a normal distribution to see how different they are:
png('btc_plot_daily_hist.png')
f.den <- function(t) dnorm(t,mean(as.vector(dailyret), na.rm = TRUE),sqrt(var(as.vector(dailyret), na.rm = TRUE)))
curve(f.den, xlim=c(-0.2,0.2))
hist(as.vector(dailyret), prob = T, add = T, breaks = 100)
dev.off()
What are the extreme daily returns that you might see at a 2.5% probability
quantile(dailyret, probs = c(.025), na.rm = TRUE)
quantile(dailyret, probs = c(.975), na.rm = TRUE)
2.5%
-0.09403481
97.5%
0.1092761
Moving on to calculating some summary statistics in rolling windows: Preliminary return analysis with rolling windows
You can also jump to each section directly from here:
- Introduction to Bitcoin analysis with R
- Retrieving Bitcoin transaction data
- Part 2 - Reading the bitcoin data in to R
- Using the xts package and dates
- Using xts to summarize Bitcoin transaction data
- Setting up Bitcoin data in OHLC format
- Charting Bitcoin data
- Prliminary return analysis with plots
- Preliminary return analysis with rolling windows
- Technical analysis plots of Bitcoin
- Bitcoin's future price path
- Evaluating a portfolio
- Evaluating a stock portfolio
- Copulas and extreme values with Bitcoin
- Copulas and extreme value, many assets