*******************************************************************************************************
*                                             CAPM: GMM estimation

* Code for estimating the parameters of the standard CAPM in STATA.                                                                                      
* Code written by Ricardo Buscariolli - STATA 13.1 - Cambridge Judge Business School - 2019.
* The data I use here are the same I use in the R code I wrote and provide in 
* https://sites.google.com/view/ricardobuscariolli/codes
* I use data from R's gmm package. 
*******************************************************************************************************
 
*******************************************************************************************************
*Get the databank
use "https://www.dropbox.com/s/u3zgwcf1kvcnfhk/Finance.dta?dl=1"

*Set up the data to look like the one I use in R
local stocks WMK UIS ORB MAT ABAX T EMR JCS VOXX ZOOM ///
ROG GGG PC GCO EBF F FNM NHP AA TDW rm
foreach st of local stocks {
replace `st'=`st'-rf
}
*
gen t=_n
drop if t>300

*******************************************************************************************************
*GMM Estimation
                 
local avg_r (WMK - {m1}) (UIS - {m2})  /// Stock mean equations
(ORB- {m3}) (MAT - {m4}) (ABAX - {m5}) (T - {m6}) (EMR - {m7}) ///
(JCS - {m8}) (VOXX - {m9}) (ZOOM - {m10}) 

local denominator  ({sigma = 1}^2)

local betaMKT ({b_WMK} - (((WMK - {m1})*(rm - {me}))/`denominator')) /// BETA MKT
({b_UIS} - (((UIS - {m2})*(rm - {me}))/`denominator')) ///
({b_ORB} - (((ORB - {m3})*(rm - {me}))/`denominator')) ///
({b_MAT} - (((MAT - {m4})*(rm - {me}))/`denominator')) ///
({b_ABAX} - (((ABAX - {m5})*(rm - {me}))/`denominator')) ///
({b_T} - (((T - {m6})*(rm - {me}))/`denominator')) ///
({b_EMR} - (((EMR - {m7})*(rm - {me}))/`denominator')) ///
({b_JCS} - (((JCS - {m8})*(rm - {me}))/`denominator')) ///
({b_VOXX} - (((VOXX - {m9})*(rm - {me}))/`denominator')) ///
({b_ZOOM} - (((ZOOM - {m10})*(rm - {me}))/`denominator')) 

gmm `avg_r' /// MEAN RETURNS 
(rm - {me}) /// MARKET MEAN
((rm-{me})^2 - {sigma = 1}^2) /// VARIANCE
`betaMKT', winit(i) onestep conv_maxiter(3000) technique(bfgs)

*******************************************************************************************************
*If you multiply the beta parameters by the denomiator it runs considerably faster

local avg_r (WMK - {m1}) (UIS - {m2})  /// Stock mean equations
(ORB- {m3}) (MAT - {m4}) (ABAX - {m5}) (T - {m6}) (EMR - {m7}) ///
(JCS - {m8}) (VOXX - {m9}) (ZOOM - {m10}) 

local denominator  ({sigma = 1}^2)

local betaMKT ({b_WMK}*`denominator' - ((WMK - {m1})*(rm - {me}))) /// BETA MKT
({b_UIS}*`denominator' - ((UIS - {m2})*(rm - {me}))) ///
({b_ORB}*`denominator' - ((ORB - {m3})*(rm - {me}))) ///
({b_MAT}*`denominator' - ((MAT - {m4})*(rm - {me}))) ///
({b_ABAX}*`denominator' - ((ABAX - {m5})*(rm - {me}))) ///
({b_T}*`denominator' - ((T - {m6})*(rm - {me}))) ///
({b_EMR}*`denominator' - ((EMR - {m7})*(rm - {me}))) ///
({b_JCS}*`denominator' - ((JCS - {m8})*(rm - {me}))) ///
({b_VOXX}*`denominator' - ((VOXX - {m9})*(rm - {me}))) ///
({b_ZOOM}*`denominator' - ((ZOOM - {m10})*(rm - {me}))) 

gmm `avg_r' /// MEAN RETURNS 
(rm - {me}) /// MARKET MEAN
((rm-{me})^2 - {sigma = 1}^2) /// VARIANCE
`betaMKT', winit(i) onestep conv_maxiter(3000) technique(bfgs)

*Note that results remain the same without "onestep"