Bitcoin’s detractors have for some time argued that the cryptocurrency’s high volatility makes it unsuitable even as a medium of exchange, because volatility increases the cost of hedging. Companies such as Bitpay and Coinbase, who process Bitcoin payments for merchants who only want to deal in dollars, take on the risk of currency fluctuations between the time they receive the coins and the time they can sell them. These companies have to hedge. They seem to be able to do so and charge fees of only 1%, so the cost of hedging can’t be prohibitively high.
Even so, it’s worth looking at Bitcoin’s volatility over time. As Bitcoin becomes more widely used and more liquid, we should expect volatility to decrease. And that is exactly what we find.
I calculated Bitcoin’s historical volatility using price data from Mt. Gox (downloaded from Blockchain.info), which is the only consistent source of pricing data over a long period. There is a clear trend of falling volatility over time, albeit with some aberrations in recent months. The trend is statistically significant: a univariate OLS regression yields a t-score on the date variable of 15.
Historical volatility is different from implied volatility—the latter uses the price of derivatives to produce an estimate of volatility going forward, while the former looks at variation in past price movements. When we get a healthy Bitcoin/USD derivatives market going, we’ll have both a better measure of volatility and probably less volatility, since such derivatives make better forms of arbitrage possible.
Bitcoin is still about ten times more volatile than, say, the Euro priced in US dollars. But if Bitcoin’s volatility kept falling in half every three and a half years, it would be as stable as the Euro in less than 15 years.
If you want to check my assumptions or build off of this work, my Stata code to produce the volatility estimate is below. Mind the line breaks!
clear * ****** INSTALL mvsumm, USED TO CALCULATE VOLATILITY, IF NOT ALREADY INSTALLED *ssc install mvsumm // uncomment this if mvsumm is not installed ****** SET WORKING DIRECTORY cd ~/Documents/Research/Bitcoin/ // This is my working directory, yours may differ ****** DOWNLOAD LATEST PRICE DATA AND IMPORT copy "http://blockchain.info/charts/market-price?showDataPoints=false×pan=all&show_header=true&daysAverageString=1&scale=0&format=csv&address=" price-mtgox.csv, replace insheet datestring price using price-mtgox.csv, comma nonames ****** FORMAT DATES AND SET TIMESERIES gen double datetime = clock(datestring,"DMYhms") format %tc datetime gen date = dofc(datetime) format %tdnn/dd/CCYY date label var date "Date" tsset date, daily tsfill // Eight dates are missing from the data set, we fill them in with missing values ****** CALCULATE LOG PRICE, DAILY RETURNS, AND STD DEV OF RETURNS OVER 30 DAY WINDOW gen logprice = log(price) gen return = D.logprice mvsumm return, generate(volatility) stat(sd) window(30) force label var volatility "Volatility" save price-mtgox, replace ****** GRAPH drop if date < 18491 // We don't want to display early dates with no trades tsline volatility || lfit volatility date, title("Bitcoin Historical Volatility") ytitle("Standard Deviation of Daily Returns (30-day Window)") scale(0.75) note("Chart by Eli Dourado https://elidourado.com/blog/bitcoin-volatility/" "Sources: Price data from Mt. Gox retrieved from Blockchain.info.") xtitle("") xlabel(,angle(45)) graph export "volatility-mtgox.png", width(1100) height(800) replace