Use a backtesting engine in MATLAB® to run a backtest on an investment strategy over a time series of market data. You can define a backtesting engine by using backtestEngine
object. A backtestEngine
object sets properties of the backtesting environment, such as the risk-free rate, and holds the results of the backtest. In this example, you can create a backtesting engine to run a simple backtest and examine the results.
Create Strategy
Define an investment strategy by using the backtestStrategy
function. This example builds a simple equal-weighted investment strategy that invests equally across all assets. For more information on creating backtest strategies, see backtestStrategy
.
strategy =
backtestStrategy with properties:
Name: "EqualWeighted"
RebalanceFcn: [function_handle]
RebalanceFrequency: 20
TransactionCosts: [0.0025 0.0050]
LookbackWindow: 0
InitialWeights: [1x0 double]
Set Backtesting Engine Properties
The backtesting engine has several properties that you set by using parameters to the backtestEngine
function.
Risk-Free Rate
The RiskFreeRate
property holds the interest rate earned for uninvested capital (that is, cash). When the sum of portfolio weights is below 1, the remaining capital is invested in cash and earns the risk-free rate. The risk-free rate is defined as the "per-time-step" rate, meaning that it is the interest rate that cash earns for each step of the backtest, not the annualized rate. For this example, you run the backtest using daily data and the risk-free interest rate is 2% annualized, so set the RiskFreeRate
property to 0.02
/ 252
to approximate the daily interest rate.
Cash Borrow Rate
The CashBorrowRate
property sets the interest accrual rate applied to negative cash balances. If at any time the portfolio weights sum to a value greater than 1, then the cash position is negative by the amount in excess of 1. This behavior of portfolio weights is analogous to borrowing capital on margin to invest with leverage. Like the RiskFreeRate
property, the CashBorrowRate
property is defined as the per-time-step rate, you must provide the annualized rate divided by the number of time steps per year.
Initial Portfolio Value
The InitialPortfolioValue
property sets the value of the portfolio at the start of the backtest for all strategies. The default is $10,000.
Create Backtest Engine
Using the prepared properties, create the backtesting engine using the backtestEngine
function.
backtester =
backtestEngine with properties:
Strategies: [1x1 backtestStrategy]
RiskFreeRate: 7.9365e-05
CashBorrowRate: 2.3810e-04
InitialPortfolioValue: 1000000
NumAssets: []
Returns: []
Positions: []
Turnover: []
BuyCost: []
SellCost: []
Several additional properties of the backtesting engine are initialized to empty. The backtesting engine populates these properties, which contain the results of the backtest, upon completion of the backtest.
Load Data and Run Backtest
Run the backtest over daily price data from the 30 component stocks of the DJIA.
Run the backtest using the runBacktest
function.
backtester =
backtestEngine with properties:
Strategies: [1x1 backtestStrategy]
RiskFreeRate: 7.9365e-05
CashBorrowRate: 2.3810e-04
InitialPortfolioValue: 1000000
NumAssets: 30
Returns: [250x1 timetable]
Positions: [1x1 struct]
Turnover: [250x1 timetable]
BuyCost: [250x1 timetable]
SellCost: [250x1 timetable]
Examine Results
The backtesting engine populates the read-only properties of the backtestEngine
object with the backtest results. Daily values for portfolio returns, asset positions, turnover, and transaction costs are available to examine.