Excel Trading Spreadsheet for Backtesting Strategies

[box type=”bio”] Jayantha has been selected as Campus Ambassador at AlgoJi- 2017. He is pursuing B.Tech. + M.Tech. (Dual Degree) from IIT BHU. His hobbies include maths and music.[/box]Excel Trading Spreadsheet shows you how to code and backtest a strategy in Excel using simple programming. In the Excel trading spreadsheet, we have taken the example of moving average strategy. However, you can also code & backtest strategies for other technical indicators in this tutorial.

Contents

Indicators for Excel Trading Spreadsheet

One of the best ways to make a profit in the markets is to just spot a trend, and based on whether it is a downtrend or an uptrend, enter a position in either long or short, and stay with the position till the trend reverses.

But how do you design an algorithm so that it can recognize trends?

Excel Trading Spreadsheet

The above image is a chart of SBI Hourly Closing Stock price plotted along with its 8 Period Moving Average and 21 Period Moving Average. Try to observe what happens to the 8 period SMA and 21 period SMA when the trend changes. We can observe that whenever there is a reversal, and the trend changes to an uptrend, the 8 Period SMA crosses the 21 Period SMA and becomes more than 21 Period SMA. And whenever the trend changes to a downtrend, the 8 Period SMA dips below the 21 Period SMA.

So now we have a strategy –

If 8 Period SMA > 21 Period SMA AND current position is Short, then exit Short position and Go Long on the same amount of shares of the stock.

If 8 Period SMA < 21 Period SMA AND current position is Long, then exit Long position and go Long on the same amount of shares of the stock.

Backtesting Excel Trading Spreadsheet

Now lets backtest our algorithm on historical data to see how it would have performed in the past. The data we are going to be using is hourly closing prices of SBIN starting from 2009 until 2017.

Let us write a macro/subroutine which runs on the data, and writes all the trades and the PnL statements in another sheet. This is how our data looks like

Excel Trading Spreadsheet Data

Now, Create a sheet named as “Trades”. This is where we will enter our trades. This is how the sheet “Trades” should look like

Excel Trading Spreadsheet Trades

We will record the date, time, position and prices for entry as well as exit of he position. In the next column we will also calculate the PnL( i.e. Profit or Loss). Before you see the code given below, we encourage you to try to implement the algorithm yourself first.

Here is the code which will enter the trades into the second sheet –

Sub SMAStrategy()
Dim fastPeriod As Long '8
Dim slowPeriod As Long '21
Dim fastAvg As Double
Dim slowAvg As Double
Dim highestHigh As Double
Dim lowestLow As Double
fastPeriod = 8
slowPeriod = 21
Dim row As Long
Dim pnlRow As Long
pnlRow = 2
Dim position As String
Dim noOfSignals As Long
For row = 2 To Application.WorksheetFunction.CountA(Columns("A")) 
    If row > fastPeriod Then
        fastAvg = Application.WorksheetFunction.Average _
        (Range("F" & row - fastPeriod + 1 & ":F" & row))
    'Range("F2:F9")
    End If
    If row > slowPeriod Then
        slowAvg = Application.WorksheetFunction.Average _
        (Range("F" & row - slowPeriod + 1 & ":F" & row))
    End If
    If row > slowPeriod Then 
        If position = "" Then
            If fastAvg > slowAvg Then
                position = "Long"
                noOfSignals = noOfSignals + 1
                Sheets("Trades").Cells(pnlRow, 1) = DateValue(Cells(row, 1).Value)  'Date
                Sheets("Trades").Cells(pnlRow, 2) = Cells(row, 2)  'Time
                Sheets("Trades").Cells(pnlRow, 3) = "Long"         'Action
                Sheets("Trades").Cells(pnlRow, 4) = Cells(row, 6)  'Price
            ElseIf fastAvg < slowAvg Then
                position = "Short"
                noOfSignals = noOfSignals + 1
                Sheets("Trades").Cells(pnlRow, 1) = DateValue(Cells(row, 1).Value)
                Sheets("Trades").Cells(pnlRow, 2) = Cells(row, 2)
                Sheets("Trades").Cells(pnlRow, 3) = "Short"
                Sheets("Trades").Cells(pnlRow, 4) = Cells(row, 6)
            End If
        End If
        If position = "Long" And fastAvg < slowAvg Then
                position = "Short"
                noOfSignals = noOfSignals + 1
                Sheets("Trades").Cells(pnlRow, 5) = DateValue(Cells(row, 1).Value)
                Sheets("Trades").Cells(pnlRow, 6) = Cells(row, 2)
                Sheets("Trades").Cells(pnlRow, 7) = "LongExit"
                Sheets("Trades").Cells(pnlRow, 8) = Cells(row, 6)
                Sheets("Trades").Cells(pnlRow, 9) = _
                Sheets("Trades").Cells(pnlRow, 8) - Sheets("Trades").Cells(pnlRow, 4)
                pnlRow = pnlRow + 1
                Sheets("Trades").Cells(pnlRow, 1) = DateValue(Cells(row, 1).Value)
                Sheets("Trades").Cells(pnlRow, 2) = Cells(row, 2)
                Sheets("Trades").Cells(pnlRow, 3) = "Short"
                Sheets("Trades").Cells(pnlRow, 4) = Cells(row, 6)
        End If
        If position = "Short" And fastAvg > slowAvg Then
                position = "Long"
                noOfSignals = noOfSignals + 1
                Sheets("Trades").Cells(pnlRow, 5) = DateValue(Cells(row, 1).Value)
                Sheets("Trades").Cells(pnlRow, 6) = Cells(row, 2)
                Sheets("Trades").Cells(pnlRow, 7) = "ShortExit"
                Sheets("Trades").Cells(pnlRow, 8) = Cells(row, 6)
                Sheets("Trades").Cells(pnlRow, 9) = _
                Sheets("Trades").Cells(pnlRow, 4) - Sheets("Trades").Cells(pnlRow, 8)
                pnlRow = pnlRow + 1
                Sheets("Trades").Cells(pnlRow, 1) = DateValue(Cells(row, 1).Value)
                Sheets("Trades").Cells(pnlRow, 2) = Cells(row, 2)
                Sheets("Trades").Cells(pnlRow, 3) = "Long"
                Sheets("Trades").Cells(pnlRow, 4) = Cells(row, 6)
        End If
    End If
Next row
End Sub

After running this subroutine, this is how the sheet “Trades” should look like –

Excel Trading Spreadsheet Tradelist

Select the column I. You will see the statistics of this column near the lower right.

The total number of trades made were 774, The average return per trade was 0.638 Rupees. The overall return was 493.26.

In the J column, enter the following formula into cell J2 – =I2/D2, and drag the formula to the rest of the cells in the column. This will give the returns in percentage. You should find the average return per trade to be 0.3%.

Equity Curve for Excel Trading Spreadsheet

In the first cell of the column K, enter the value of the trading price of the first trade(which is 109.68). In the second cell enter the formula – =K1+I2, and drag it to the rest of the cells.

You will observe that the last value of this equity curve is 602.94.

Overall percentage of return is = 602.94/109.68 = 5.497 = 449.7 % increase in the value of portfolio over a period of 8.25 years.

Which gives an annualized return of around 22.95% .

To finally plot the equity curve, select all the cells in column K containing the value of portfolio, click on the Insert tab, select line chart.

Your chart should look like this –

Excel Trading Spreadsheet Equity Curve

 

Further Improving the Excel Trading Spreadsheet

Now you have a knowledge of one of the most basic algorithms, you can improve on this by adding several indicators such as ADX, RSI, MACD, etc. To know more about such indicators and how to implement them in excel click here(embed the link to the article on Technical Analysis in excel).

Also note that in this article we have not considered brokerage fees and slippage costs, and these may have a significant impact on profitability.

Caution is advised while implementing such strategies in real life. Such strategies often may work only in the short term and tend to have huge drawdowns. We can see in the equity graph that we have a maximum drawdown of about 100, if we had stopped running this algorithm in June 2016, our portfolio would have ended up at a value of around 700. i.e. we would have ended up with  around 638% of the initial investment instead of just 549% . So before investing your money, make sure you can handle the drawdowns.