In this article I will optimize and backtest the simple moving average crossover strategy for Bitcoin hourly data. I did the analyses for the period of January 1st 2012 – May 5th 2021 hourly historical price data for Bitcoin using Backtesting.py and optimize the moving average periods. Afterwards I used the backtest results to see how they performed in the last six months. For the conceptual background of the simple average crossover strategy and the python code please read the first article in the series in which similar analyses are made for daily data. I have to remind that this is an educational article, it is not investment or trading advice, backtesting may not be reliable.
Backtest Optimization Results
Let’s see which two numbers are maximizing our returns.
n1 n2
15 155 1.938680e+11
160 1.728041e+11
150 1.687099e+11
10 165 1.470637e+11
175 1.313821e+11
15 180 1.310179e+11
185 1.305704e+11
175 1.290040e+11
10 170 1.237129e+11
160 1.116725e+11
So the short period moving average is 15 hours and long one is 155 according to our backtest results, we will call this (15,155). Let’s visualize all possibilities with the heatmap. We are looking for the yellow zones.

So how do the actual results look like for (15,155):
Start 2011-12-31 09:00:00
End 2021-05-06 23:00:00
Duration 3414 days 14:00:00
Exposure Time [%] 58.261812
Equity Final [$] 193868024868.845459
Equity Peak [$] 208891713676.42807
Return [%] 19386702.486885
Buy & Hold Return [%] 1285717.539863
Return (Ann.) [%] 267.818009
Volatility (Ann.) [%] 237.705807
Sharpe Ratio 1.126678
Sortino Ratio 8.064977
Calmar Ratio 5.404598
Max. Drawdown [%] -49.553737
Avg. Drawdown [%] -3.101874
Max. Drawdown Duration 654 days 03:00:00
Avg. Drawdown Duration 4 days 23:00:00
# Trades 370
Win Rate [%] 32.972973
Best Trade [%] 393.626379
Worst Trade [%] -12.416737
Avg. Trade [%] 3.34526
Max. Trade Duration 63 days 15:00:00
Avg. Trade Duration 5 days 07:00:00
Profit Factor 4.399904
Expectancy [%] 5.217638
SQN 2.108866
Unbelievable. 19,386,702%. 19 million percent, compare this to 1.3 million percent of buy and hold. It looks good. When we traded daily we could only see 2,7 million percent returns and when we used four hourly data we obtained 11.6 million percent. This time we were only exposed 58% of the time, reducing our risk. But look at our win rate it is only about 33%, could you have handle loosing 2 out of 3 trades you made. Only 370 trades in 3414 days, that’s almost one trade every 9 days. Could you wait that long if you were a day trader? But we surely curve fit, didn’t we? Let’s check to see if we did by using these parameters for the last 6 months.
Backtesting for the last six months
Let’s only look 6 months back this time. Not include the data before. Had we entered the Bitcoin market last year how would our optimized strategy perform, using (15,155) hourly moving average crossover strategy.
Start 2020-11-01 00:00:00
End 2021-05-06 23:00:00
Duration 186 days 23:00:00
Exposure Time [%] 61.898396
Equity Final [$] 2428866.41374
Equity Peak [$] 2717607.20868
Return [%] 142.886641
Buy & Hold Return [%] 307.571211
Return (Ann.) [%] 465.273233
Volatility (Ann.) [%] 369.92888
Sharpe Ratio 1.257737
Sortino Ratio 13.029614
Calmar Ratio 25.941468
Max. Drawdown [%] -17.935501
Avg. Drawdown [%] -3.192582
Max. Drawdown Duration 54 days 00:00:00
Avg. Drawdown Duration 2 days 20:00:00
# Trades 34
Win Rate [%] 44.117647
Best Trade [%] 23.347799
Worst Trade [%] -6.189641
Avg. Trade [%] 2.675659
Max. Trade Duration 9 days 10:00:00
Avg. Trade Duration 3 days 09:00:00
Profit Factor 3.179813
Expectancy [%] 2.911525
SQN 2.162449
This time we are below buy and hold return almost by half, but our exposure time is 62% and we only made 34 trades and 44% are winning trades. This doesn’t look as amazing as the previous run does it? What if we optimized only for this period? The best parameters were 10 and 125. Here are the results.
Start 2020-11-01 00:00:00
End 2021-05-06 23:00:00
Duration 186 days 23:00:00
Exposure Time [%] 63.5918
Equity Final [$] 3494285.27992
Equity Peak [$] 3693813.69762
Return [%] 249.428528
Buy & Hold Return [%] 307.571211
Return (Ann.) [%] 1049.650362
Volatility (Ann.) [%] 818.845853
Sharpe Ratio 1.281866
Sortino Ratio 30.762862
Calmar Ratio 55.647357
Max. Drawdown [%] -18.862537
Avg. Drawdown [%] -2.732061
Max. Drawdown Duration 31 days 00:00:00
Avg. Drawdown Duration 2 days 03:00:00
# Trades 23
Win Rate [%] 47.826087
Best Trade [%] 58.308743
Worst Trade [%] -5.456185
Avg. Trade [%] 5.64439
Max. Trade Duration 21 days 12:00:00
Avg. Trade Duration 5 days 04:00:00
Profit Factor 6.475452
Expectancy [%] 6.719754
SQN 1.804575
Better than the original optimization but we are still below buy and hold. And the top ten combinations are:
n1 n2
10 125 3.494285e+06
120 3.430349e+06
115 3.274591e+06
5 120 3.246864e+06
125 3.200323e+06
110 190 3.180469e+06
5 65 3.180198e+06
130 3.158930e+06
10 105 3.136170e+06
130 3.126782e+06
n1 = 15 and n= 155 is not even in the top 10. Also none of the strategies outperformed buy and hold returns. Let’s look at the heatmap.

Making Sense of Backtests
Similar to the results we obtained with daily Bitcoin simple moving average crossover backtest, for hourly backtests we found that optimization is not an exact science. It may or may not be better than a simple buy and hold. The strategy you develop may not necessarily be as successful in upcoming periods. You may want to continue reading the 5 minute data backtest results for bitcoin. Let me finish this again with the warning: this is not investment or trading advice.