This should be pretty simple to build. The only thing missing above is the calculation of the simple moving average. When should this take place?
Given the flexibility of bt, there is no strict rule. The average calculation could be performed in an Algo, but that would be pretty inefficient. A better way would be to calculate the moving average at the beginning - before starting the backtest. After all, all the data is known in advance.
Now that we know what we have to do, let’s get started. First we will download some data and calculate the simple moving average.
Now that we have our data, we will need to create our security selection logic. Let’s create a basic Algo that will select the securities that are above their moving average.
Before we do that, let’s think about how we will code it. We could pass the SMA data and then extract the row (from the sma DataFrame) on the current date, compare the values to the current prices, and then keep a list of those securities where the price is above the SMA. This is the most straightforward approach. However, this is not very re-usable because the logic within the Algo will be quite specific to the task at hand and if we wish to change the logic, we will have to write a new algo.
For example, what if we wanted to select securities that were below their sma? Or what if we only wanted securities that were 5% above their sma?