The goal of AssetAllocation is to perform backtesting of customizable asset allocation strategies. The main function that the user interacts with is backtest_allocation().
You can install the development version of AssetAllocation from GitHub with:
# install.packages("devtools")
::install_github("rubetron/AssetAllocation") devtools
Simple example using pre-loaded strategy (see the vignette for other examples):
library(AssetAllocation)
#> Registered S3 method overwritten by 'quantmod':
#> method from
#> as.zoo.data.frame zoo
## Example 1: backtesting one of the asset allocations in the package
<- asset_allocations$static$us_60_40
us_60_40
# test using the data set provided in the package
<- backtest_allocation(us_60_40,
bt_us_60_40 $Prices,
ETFs$Returns,
ETFs$risk_free)
ETFs
# plot returns
library(PerformanceAnalytics)
#> Loading required package: xts
#> Loading required package: zoo
#>
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#>
#> as.Date, as.Date.numeric
#>
#> Attaching package: 'PerformanceAnalytics'
#> The following object is masked from 'package:graphics':
#>
#> legend
chart.CumReturns(bt_us_60_40$returns,
main = paste0("Backtest of the ",
$strat$name,
bt_us_60_40" portfolio"),
ylab = "Cumulative returns"
)
# show table with performance metrics
$table_performance
bt_us_60_40#> United.States.60.40
#> Annualized Return 0.0803
#> Annualized Std Dev 0.1013
#> Annualized Sharpe (Rf=1.18%) 0.6669
#> daily downside risk 0.0045
#> Annualised downside risk 0.0718
#> Downside potential 0.0019
#> Omega 1.1466
#> Sortino ratio 0.0618
#> Upside potential 0.0022
#> Upside potential ratio 0.6175
#> Omega-sharpe ratio 0.1466
#> Semi Deviation 0.0046
#> Gain Deviation 0.0046
#> Loss Deviation 0.0053
#> Downside Deviation (MAR=210%) 0.0100
#> Downside Deviation (Rf=1.18%) 0.0045
#> Downside Deviation (0%) 0.0045
#> Maximum Drawdown 0.3260
#> Historical VaR (95%) -0.0093
#> Historical ES (95%) -0.0155
#> Modified VaR (95%) -0.0086
#> Modified ES (95%) -0.0086
Another example creating a strategy from scratch, retrieving data from Yahoo Finance, and backtesting:
library(AssetAllocation)
# create a strategy that invests equally in momentum (MTUM), value (VLUE), low volatility (USMV) and quality (QUAL) ETFs.
<- list(name = "EW Factors",
factors_EW tickers = c("MTUM", "VLUE", "USMV", "QUAL"),
default_weights = c(0.25, 0.25, 0.25, 0.25),
rebalance_frequency = "month",
portfolio_rule_fn = "constant_weights")
# get data for tickers using getSymbols
<- get_data_from_tickers(factors_EW$tickers,
factor_ETFs_data starting_date = "2013-08-01")
#> 'getSymbols' currently uses auto.assign=TRUE by default, but will
#> use auto.assign=FALSE in 0.5-0. You will still be able to use
#> 'loadSymbols' to automatically load data. getOption("getSymbols.env")
#> and getOption("getSymbols.auto.assign") will still be checked for
#> alternate defaults.
#>
#> This message is shown once per session and may be disabled by setting
#> options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
# backtest the strategy
<- backtest_allocation(factors_EW,factor_ETFs_data$P, factor_ETFs_data$R)
bt_factors_EW
# plot returns
charts.PerformanceSummary(bt_factors_EW$returns,
main = bt_factors_EW$strat$name,
)
# table with performance metrics
$table_performance
bt_factors_EW#> EW.Factors
#> Annualized Return 0.1233
#> Annualized Std Dev 0.1731
#> Annualized Sharpe (Rf=0%) 0.7125
#> daily downside risk 0.0078
#> Annualised downside risk 0.1246
#> Downside potential 0.0032
#> Omega 1.1652
#> Sortino ratio 0.0664
#> Upside potential 0.0037
#> Upside potential ratio 0.5665
#> Omega-sharpe ratio 0.1652
#> Semi Deviation 0.0081
#> Gain Deviation 0.0077
#> Loss Deviation 0.0094
#> Downside Deviation (MAR=210%) 0.0125
#> Downside Deviation (Rf=0%) 0.0078
#> Downside Deviation (0%) 0.0078
#> Maximum Drawdown 0.3499
#> Historical VaR (95%) -0.0161
#> Historical ES (95%) -0.0266
#> Modified VaR (95%) -0.0151
#> Modified ES (95%) -0.0168