Measurement of MakerDAO's DAI stablecoin volatility


Empirical measurement of Stablecoins volatilities.

Abstract (TL;DR)

Stable-price cryptocurrency also knows as stablecoin such a Tether and MakerDAO’ DAI are claimed to stable. However, strictly speaking, the real price is always volatile due to numerous reasons. The goal of this work is to explore how does this volatility looks like on different time frames, from seconds to months. It has been shown that the price movement about the average is a normal distribution with standard deviation = $0.00849. Therefore price stability mechanisms should kick in around 3 x standard deviations away from the average ($1.0254 and $0.9745). The price action has also shown to be very sudden - having low volatility for extended periods of time, then suddenly spiking. This makes sense because there is not much buying, for example, below 0.9745, and therefore not much ‘support’, so the price falls rapidly at this point.


In order to measure volatility, the overall variance and standard deviation is an essential tool. The price history of DAI/USD was scraped from Bitfinex’s API v2 - which began on April 7th 2018, whereas Dai was released mid-December 2017, so it isn’t the full set of data, but it is the only set which is directly traded against USD. This is ideal because we want to measure the volatility of Dai against its stability peg (the USD) in order to not have any ‘noise’ in the data, whereas if we calculated DAI/USD by using DAI/BTC and BTC/USD, there would be extra noise in the data due to non-instant equalization of price between 2 different marketplaces etc. Variance and standard deviation are calculated

A ‘moving-variance’ and ‘moving-standard-deviation’ is also calculated and shown by taking the 10 days previous to a given day and calculating the variance on that subset of data. This is done so that we can see how stable the variance itself is. An ideal stablecoin should have as little volatility in the variance as possible, so that fluctuation ranges are predictable.

One of the objectives of this measurement of volatility is to help determine where stabilisation mechanisms (e.g. at what price level should the stabilisation reserve kick in? When should it end?). To determine this, the trade history data was sectioned off into chunks with regular time separation - i.e. ‘candles’ in regular trading terminology. The amount of times that a candle dipped below the prices levels 0.99, 0.98, …, 0.91, 0.9, and peaked above 1.01, 1.02, …, 1.09, 1.1 were counted, and graphs drawn for this measurement for different common time frames (5 mins, 15 mins, 1 hour, 4 hours, 1 day, 1 week, 4 weeks). This can help us determine what kind of distribution the price peaks/dips follow. The tops/bottoms of candles are used instead of the close because (a) the closes of candles are completely arbitrary and carry no meaning in a 24/7 traded market and (b) we are, for the most part, interested in the extreme side of price movement as it’s the tops/bottoms of candles that will trigger stabilisation mechanisms to kick in (unless an sma/ema of price is used to trigger mechanisms, in which case this isn’t true).

NOTE: the dataset has been edited to exclude data before April 16th. This is done to exclude the volatility of the first few days that are associated with very thin order books. While it is true that this data should be included in a general measurement, we are only interested in the long term price stability, and don’t want anomalies such as the beginning of trading on Bitfinex to skew the rest of the data.

Code used to produce the result:


Variance = 0.00007215455240868523

Standard deviation = 0.008494383580265564

Average price = 0.9970394940934716

Average price (weighted by trade volume) = 1.039725945505297

Moving variance and standard deviation:

Comparison to price chart:

Since the start of our dataset is April 16th, and it is 10 days from that point until the first data point on the moving variance graph (April 26th), the jumps in variance match the jumps in the price chart. This doesn’t tell us much that we didn’t already know from looking at the price chart: a spike in price indicates volatility. In the period between price spikes, we can see the variance slowly fall from around the 60 day mark to the 115 day mark. This indicates that the volatility is perhaps moving towards an equilibrium, or minimum value, but it’s impossible to say for sure without more data. Regardless, the long term effects of price spikes are the interest of this investigation, rather than the equilibrium volatility.

The distribution of price levels for various timeframes

The amount shown for each price level is the amount of candles with wicks greater than or equal to l or less than or equal to that price level, depending on whether it’s above or below 1. E.g. if there are only 3 candles with bottoms = [0.99, 0.98, 0.97] and tops = [1.01, 1.01, 1.02], then prices = [0.97, 0.98, 0.99, 1, 1.01, 1.02, 1.03] —> counts = [1, 2, 3, N/A, , 1, 1].

Distribution of all the raw data as a histogram

Other researches:

There is an interesting review of stablecoins (on march 2018) with analysis of volatility and other parameters (russian language)


The price distribution is a normal distribution with standard deviation = 0.0084. So the vast majority of the time, the price is with the range [0.975, 1.025]. Ideally, for a stablecoin that might be used globally for things like banking as a reserve currency, this would be too much. It can be argued however that there would be much more liquidity at that size of the system, and therefore much less volatility for the exact same system at scale. Regardless, we can see that the price has never fallen below $0.96. Therefore, for choosing the activation level for the collateralized stabilisation mechanism, it would probably be prudent to put it where it will be used somewhat regularly - partly so that the reserve will gain value over time by buying low and selling high, and also because it would help tighten the volatility. If the goal of the stable crypto unit is to have the lowest volatility out of all stablecoin, then the closer the activation level is to the average, the less volatile it will be. However, since there is hardly any trade activity below 0.97, it’s very likely that the order books will be relatively thin below that point (or above 1.03). So some mechanism needs to kick in at that point to stop the price from freefalling and triggering stop losses etc. Either this could be the collateralisation itself, or it could be the 2nd mechanism. If having the lowest volatility is the goal, then the 2nd mechanism should activate around the 0.97 (or 3 sigma) level. As the system grows, the standard deviation will naturally shrink, so it would make sense to change the activation levels to be closer to the average price as time goes on.

Author: James Key (,

Reviewer: Alex Lebed (


Excellent report James & Alex. Sharing with the Maker community.