Four Hourly Simple Moving Average Crossover Strategy Backtest for Bitcoin

In this article I will optimize and backtest the simple moving average crossover strategy for Bitcoin four hourly data. This is a part of a series. 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. If you were a daytrader, how would you do using this strategy is the question we are attempting to answer. First, I will do the analyses for the period of January 1st 2012 – Math 6th 2021 four hourly historical price data for Bitcoin using Backtesting.py and optimize the moving average periods. Then I will use the backtest results to see how they performed in the last six months. I have to remind that this is an educational article, it is not investment or trading advice. Backtesting does not guarantee good performance.

Backtest Optimization Results

Let’s see which two numbers for short and long moving averages are maximizing our returns.

n1   n2 
5    45     1.163926e+11
     50     1.077298e+11
     40     8.872312e+10
     35     6.659061e+10
75   120    5.129846e+10
70   125    4.968772e+10
75   110    4.796958e+10
65   125    4.576299e+10
100  125    4.514021e+10
75   115    4.161445e+10

So the short period moving average is 5 x 4 hours and long one is 45 x 4 hours according to our backtest results, we will call this (5,45). Let’s visualize all possibilities with the heatmap. We are looking for the yellow zones.

Bitcoin 4 hourly data SMA crossover optimization heatmap

So how do the actual results look like for (5,45):


Start                     2011-12-31 08:00:00
End                       2021-05-06 20:00:00
Duration                   3414 days 12:00:00
Exposure Time [%]                   58.801684
Equity Final [$]          116392592474.846054
Equity Peak [$]           135778333406.039246
Return [%]                    11639159.247485
Buy & Hold Return [%]          1285717.539863
Return (Ann.) [%]                  248.280608
Volatility (Ann.) [%]              223.452176
Sharpe Ratio                         1.111113
Sortino Ratio                        7.450375
Calmar Ratio                          5.62726
Max. Drawdown [%]                  -44.121051
Avg. Drawdown [%]                   -4.404697
Max. Drawdown Duration      552 days 04:00:00
Avg. Drawdown Duration       10 days 22:00:00
# Trades                                  299
Win Rate [%]                        37.123746
Best Trade [%]                     431.999009
Worst Trade [%]                    -12.731801
Avg. Trade [%]                       3.978347
Max. Trade Duration          64 days 04:00:00
Avg. Trade Duration           6 days 12:00:00
Profit Factor                         4.49605
Expectancy [%]                       6.249282
SQN                                  2.098167

Looks very well. 11,639,159%. 11.6 million percent, compare this to 1.3 million percent of buy and hold. When we traded daily we could only see 2,7 million percent returns. This time we were only exposed 58% of the time, reducing our risk. But look at our win rate it is only about 37%, could you have handled loosing 2 out of 3 trades you made? Only 299 trades in 3414 days, that’s less than one trade every 10 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 (5,45) 4 hourly moving average crossover strategy.

Start                     2020-11-01 00:00:00                                                   
End                       2021-05-06 20:00:00
Duration                    186 days 20:00:00
Exposure Time [%]                   58.734403
Equity Final [$]                2339765.89792
Equity Peak [$]                 2725753.44372
Return [%]                          133.97659
Buy & Hold Return [%]              311.009521
Return (Ann.) [%]                  425.505369
Volatility (Ann.) [%]              380.002016
Sharpe Ratio                         1.119745
Sortino Ratio                       11.424156
Calmar Ratio                        12.828403
Max. Drawdown [%]                  -33.169006
Avg. Drawdown [%]                   -4.576993
Max. Drawdown Duration       54 days 00:00:00
Avg. Drawdown Duration        5 days 07:00:00
# Trades                                   15
Win Rate [%]                        46.666667
Best Trade [%]                      47.839314
Worst Trade [%]                     -7.163087
Avg. Trade [%]                       5.840692
Max. Trade Duration          25 days 04:00:00
Avg. Trade Duration           7 days 04:00:00
Profit Factor                        4.555034
Expectancy [%]                       7.022421
SQN                                  1.351821

This time we are below buy and hold return almost by half, but our exposure time is 59% and we only made 15 trades and 46% 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 35 and 45. Here are the results.


Start                     2020-11-01 00:00:00
End                       2021-05-06 20:00:00
Duration                    186 days 20:00:00
Exposure Time [%]                   66.042781
Equity Final [$]                3276107.97572
Equity Peak [$]                 3591007.73812
Return [%]                         227.610798
Buy & Hold Return [%]              311.009521
Return (Ann.) [%]                  913.708476
Volatility (Ann.) [%]              787.074086
Sharpe Ratio                         1.160893
Sortino Ratio                       22.345476
Calmar Ratio                         39.27454
Max. Drawdown [%]                  -23.264651
Avg. Drawdown [%]                   -4.447675
Max. Drawdown Duration       31 days 08:00:00
Avg. Drawdown Duration        3 days 16:00:00
# Trades                                   12
Win Rate [%]                        58.333333
Best Trade [%]                      88.791025
Worst Trade [%]                     -6.881533
Avg. Trade [%]                      10.427422
Max. Trade Duration          29 days 12:00:00
Avg. Trade Duration          10 days 03:00:00
Profit Factor                        9.622808
Expectancy [%]                      13.263011
SQN                                  1.624816

Better than the original optimization but we are still below buy and hold. And the top ten combinations are:


n1  n2
35  45    3.276108e+06
40  45    3.212561e+06
25  70    3.083995e+06
    65    3.064522e+06
30  50    3.010306e+06
    65    2.951431e+06
    55    2.916412e+06
5   35    2.846912e+06
10  20    2.814127e+06
25  75    2.804406e+06

n1 = 5 and n= 70 is not even in the top 10. Also none of the strategies outperformed buy and hold returns. Let’s look at the heatmap.

A second optimization for the last six months showing the heatmap

Making Sense of Backtests

Similar to the results we obtained with daily Bitcoin simple moving average crossover backtest, for four hourly backtests we found that optimization is not an easily achived. 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. Though I wonder finding n2 = 45 x 4 hour was a coincidence in both optimizations. You may want to continue reading the hourly backtest results in the series. Let me finish this again with the warning: this is not investment or trading advice.

References

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.