
But again, thank you very much for you awesome help and also to Robert whose idea I have not tested yet. This work is immensely important to me and time is running low, thus I am really grateful for your support.
preserve // KEEP YOUR ORIGINAL DATA SET ON STANDBY // APPEND ALL THE BETAS FILES INTO ONE levelsof permno, local(permnos) clear tempfile building save `building', emptyok foreach p of local permnos { append using betas_`p' save `"`building'"', replace } // IF YOU WANT, YOU CAN ALSO SAVE THIS AS A PERMANENT FILE // NOW BRING BACK THE ORIGINAL DATA restore // AND MERGE IN THE BETAS gen end = month merge 1:1 permno end using `building'
ssc install rangestat
* test data; use variable names in the thread webuse grunfeld, clear rename company permno rename invest stockexcessret rename mvalue mktrf save "test_data.dta", replace * ------------ regressions over a window of 6 periods using -rangestat- -------- * define a linear regression in Mata using quadcross() - help mata cross(), example 2 mata: mata clear mata set matastrict on real rowvector myreg(real matrix Xall) { real colvector y, b, Xy real matrix X, XX y = Xall[.,1] // dependent var is first column of Xall X = Xall[.,2::cols(Xall)] // the remaining cols are the independent variables X = X,J(rows(X),1,1) // add a constant XX = quadcross(X, X) // linear regression, see help mata cross(), example 2 Xy = quadcross(X, y) b = invsym(XX) * Xy return(rows(X), b') } end * regressions with a constant over a rolling window of 6 periods by permno rangestat (myreg) stockexcessret mktrf, by(permno) interval(time -5 0) casewise * the Mata function returns first the number of observations and then as many * variables as there are independent variables (plus the constant) for the betas rename (myreg1 myreg2 myreg3) (nobs rs_mktrf rs_cons) * reject results if the window is less than 6 or if the number of obs < 4 isid permno year by permno: replace rs_mktrf = . if _n < 6 | nobs < 4 by permno: replace rs_cons = . if _n < 6 | nobs < 4 save "rangestat_results.dta", replace * ----------------- replicate using -rolling- ---------------------------------- use "test_data.dta", clear levelsof permno, local(permno) foreach s of local permno { rolling _b, window(6) saving(betas_`s', replace) reject(e(N) < 4): /// regress stockexcessret mktrf if permno == `s' } clear save "betas.dta", replace emptyok foreach s of local permno { append using "betas_`s'.dta" } rename end year merge 1:1 permno year using "rangestat_results.dta" isid permno year, sort gen diff_mktrf = abs(_b_mktrf - float(rs_mktrf)) gen diff_cons = abs(_b_cons - float(rs_cons)) summ diff*
preserve // KEEP YOUR ORIGINAL DATA SET ON STANDBY // APPEND ALL THE BETAS FILES INTO ONE clear tempfile building save `building', emptyok levelsof permno, local(permnos) foreach p of local permnos { append using betas_`p' save `"`building'"', replace } // IF YOU WANT, YOU CAN ALSO SAVE THIS AS A PERMANENT FILE // NOW BRING BACK THE ORIGINAL DATA restore // AND MERGE IN THE BETAS gen end = month merge 1:1 permno end using `building'
*Regression of stock returns (HPR) on CRSP value-weighted return (incl. dividends) levelsof permno, local(permno) foreach s of local permno { rolling _b, window(60) saving(betas_`s', replace) reject(e(N) < 24): /// regress stockexcessret mktrf if permno == `s' } levelsof permno, local(permnos) foreach p of local permno { merge 1:1 permno dm using betas`p', nogenerate }
. foreach p of local permno { 2. merge 1:1 permno dm using betas`p', nogenerate 3. } file betas10002.dta not found r(601); end of do-file
. foreach p of local permno { 2. merge 1:1 permno end using betas`p', nogenerate 3. } . end of do-file
stock <-> permno date <-> dm
levelsof permno, local(permnos) foreach p of local permno { merge 1:1 permno dm using betas`p', nogenerate }
tsset stock date levelsof stock, local(stocks) foreach s of local stocks { rolling _b, window(60) saving(betas_`s', replace) reject(e(N) < 30): /// regress stockexcessreturn marketexcessreturn if stock == `s' }
tsset stock date levelsof stock, local(stocks) foreach s of local stocks { rolling _b, window(60) saving(betas_`s', replace) reject(e(N) < 30): /// regress stockexcessreturn marketexcessreturn if stock == `s' }
Leave a comment: