Skip to content

dppalomar/portfolioBacktest

Repository files navigation

portfolioBacktest

CRAN_Status_Badge CRAN Downloads CRAN Downloads Total

Automated backtesting of multiple portfolios over multiple datasets of stock prices in a rolling-window fashion. Intended for researchers and practitioners to backtest a set of different portfolios, as well as by a course instructor to assess the students in their portfolio design in a fully automated and convenient manner, with results conveniently formatted in tables and plots. Each portfolio design is easily defined as a function that takes as input a window of the stock prices and outputs the portfolio weights. Multiple portfolios can be easily specified as a list of functions or as files in a folder. Multiple datasets can be conveniently extracted randomly from different markets, different time periods, and different subsets of the stock universe. The results can be later assessed and ranked with tables based on a number of performance criteria (e.g., expected return, volatility, Sharpe ratio, drawdown, turnover rate, return on investment, computational time, etc.), as well as plotted in a number of ways with nice barplots and boxplots.

Installation

The package can be installed from CRAN or GitHub:

# install stable version from CRAN
install.packages("portfolioBacktest")

# install development version from GitHub
devtools::install_github("dppalomar/portfolioBacktest")

To get help:

library(portfolioBacktest)
help(package = "portfolioBacktest")
?portfolioBacktest

To cite portfolioBacktest in publications:

citation("portfolioBacktest")

Quick Start

Do the backtest on your own portfolio following few steps:

  • Step 1 - load package & 10 datasets
library(portfolioBacktest)
data("dataset10")
  • Step 2 - define your own portfolio
my_portfolio <- function(dataset, w_current) {
  prices <- dataset$adjusted
  N <- ncol(prices)
  return(rep(1/N, N))
}
  • Step 3 - do backtest
bt <- portfolioBacktest(my_portfolio, dataset10)
  • Step 4 - check your portfolio performance (e.g., median of the 10 individual backtests)
backtestSummary(bt)$performance
#>                            fun1
#> Sharpe ratio       1.476203e+00
#> max drawdown       8.937890e-02
#> annual return      1.594528e-01
#> annual volatility  1.218623e-01
#> Sortino ratio      2.057677e+00
#> downside deviation 8.351402e-02
#> Sterling ratio     2.122653e+00
#> Omega ratio        1.295090e+00
#> VaR (0.95)         1.101934e-02
#> CVaR (0.95)        1.789425e-02
#> rebalancing period 1.000000e+00
#> turnover           8.641594e-03
#> ROT (bps)          7.334458e+02
#> cpu time           1.230769e-03
#> failure rate       0.000000e+00

For a more detailed explanation on how to use the package with all the features, check the vignette.

Package Snapshot

This package backtests a list of portfolios over multiple datasets on a rolling-window basis, producing final results as in the following.

  • Performance table:

  • Barplot:

  • Boxplot:

Documentation

For more detailed information, please check the vignette.

Links

Package: CRAN and GitHub.

README file: GitHub-readme.

Vignette: CRAN-vignette and GitHub-vignette.