** mvport package v2
* cbacktest command
* Author: Alberto Dorantes, July, 2016
* cdorante@itesm.mx
capture program drop cbacktest
program define cbacktest, rclass
version 11.0
syntax varlist(numeric) [if] [in], Weights(string) Generate(string) Timevar(string) [NOGraph]
marksample touse
tempvar bhr
tempname nr W numvariables
local numvariables: word count `varlist'
capture matrix `W' = `weights'
if (_rc!=0) {
display as error "The weight Matrix `weights' does not exist; define a Stata Matrix for the portfolio weights"
exit
}
else if (rowsof(`weights')!=`numvariables' | colsof(`weights')!=1) {
display as error "The weight Matrix must have 1 column and the number of rows has to be equal to the number of assets of the portfolio"
exit
}
capture tsset `timevar'
if _rc!=0 {
display as error "The time-series variable `timevar' might not exist or is not numeric. The dataset was not sorted"
}
capture gen `bhr'=.
local nr=_N
forvalues i=1/`nr' {
qui backtest `varlist' if (_n<=`i' & `touse'), weights(`weights')
qui replace `bhr'=r(retport) if _n==`i' & `touse'
}
capture drop `generate'
capture gen double `generate'=`bhr'
display "The portfolio weights used were: "
matlist `weights', noblank twidth(30) border
display "The variable `generate' was generated, and it has the cumulative holding return of the portfolio"
if "`nograph'"=="" {
tsline `generate' `if' `in'
}
end