  ** 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