Dear Stata Users
My dataset is a panel with daily observations over seven years for 5,000 firms. I use the following code to estimate risk-adjusted returns, but it runs for more than 24 hours without showing any signs of finishing. How can I optimise it to run faster? Thanks.
My dataset is a panel with daily observations over seven years for 5,000 firms. I use the following code to estimate risk-adjusted returns, but it runs for more than 24 hours without showing any signs of finishing. How can I optimise it to run faster? Thanks.
import delimited "temp_To_matlab_FamaFrench.out", clear
local min_days_per_estimation = 21
local estimation_frequency = 1
* Model definitions:
* 3F = mkt smb hml
* 4F = mkt smb hml mom
* 5F = mkt smb hml rmw cma
* 6F = mkt smb hml mom rmw cma
local model1 "mktexcess smb hml"
local model2 "mktexcess smb hml mom"
local model3 "mktexcess smb hml rmw cma"
local model4 "mktexcess smb hml mom rmw cma"
local model_list `model1' `model2' `model3' `model4'
if `estimation_frequency' == 1 {
gen group_split = dateyearq
}
else {
gen group_split = dateyear
}
sort permno datenum
local model_index = 0
foreach mdl of local model_list {
local model_index = `model_index' +1
local factors `mdl'
local nfactors: word count `factors'
gen ret_FF`nfactors' = .
gen ret_FFrf`nfactors' = .
levelsof permno, local(permnos)
foreach p of local permnos {
display "Processing permno = `p'"
preserve
keep if permno == `p'
tempvar groupid
egen `groupid' = group(group_split)
su `groupid', meanonly
local max_group = r(max)
scalar last_alpha = 0
scalar last_beta_mkt = 1
foreach f of local factors {
if "`f'" != "mktexcess" {
scalar last_beta_`f' = 0
}
}
forvalues g = 1/`=`max_group'-1' {
tempvar sel
gen byte `sel' = (`groupid' == `g')
count if `sel' & !missing(ret_ex)
local nobs = r(N)
if `nobs' >= `min_days_per_estimation' {
qui reg ret_ex `factors' if `sel'
scalar last_alpha = _b[_cons]
foreach f of local factors {
if "`f'" == "mktexcess" {
scalar last_beta_mkt = _b[`f']
}
else {
scalar last_beta_`f' = _b[`f']
}
}
}
else {
display "No min obs for permno `p', group `g': `nobs'"
}
tempvar sel_next pred
gen byte `sel_next' = (`groupid' == `=`g'+1')
gen double `pred' = 0 if `sel_next'
foreach f of local factors {
if "`f'" == "mktexcess" {
replace `pred' = `pred' + last_beta_mkt * `f' if `sel_next'
}
else {
replace `pred' = `pred' + last_beta_`f' * `f' if `sel_next'
}
}
replace ret_FF`nfactors' = `pred' if `sel_next'
replace ret_FFrf`nfactors' = rf + `pred' if `sel_next'
drop `pred'
}
restore
// preserve
}
export delimited permno datenum ret_FF`nfactors' ret_FFrf`nfactors' ///
using "matlab_FF`nfactors'_returns.csv", replace
}
save "Done_FamaFrenchAbnormal.dta", replace
local min_days_per_estimation = 21
local estimation_frequency = 1
* Model definitions:
* 3F = mkt smb hml
* 4F = mkt smb hml mom
* 5F = mkt smb hml rmw cma
* 6F = mkt smb hml mom rmw cma
local model1 "mktexcess smb hml"
local model2 "mktexcess smb hml mom"
local model3 "mktexcess smb hml rmw cma"
local model4 "mktexcess smb hml mom rmw cma"
local model_list `model1' `model2' `model3' `model4'
if `estimation_frequency' == 1 {
gen group_split = dateyearq
}
else {
gen group_split = dateyear
}
sort permno datenum
local model_index = 0
foreach mdl of local model_list {
local model_index = `model_index' +1
local factors `mdl'
local nfactors: word count `factors'
gen ret_FF`nfactors' = .
gen ret_FFrf`nfactors' = .
levelsof permno, local(permnos)
foreach p of local permnos {
display "Processing permno = `p'"
preserve
keep if permno == `p'
tempvar groupid
egen `groupid' = group(group_split)
su `groupid', meanonly
local max_group = r(max)
scalar last_alpha = 0
scalar last_beta_mkt = 1
foreach f of local factors {
if "`f'" != "mktexcess" {
scalar last_beta_`f' = 0
}
}
forvalues g = 1/`=`max_group'-1' {
tempvar sel
gen byte `sel' = (`groupid' == `g')
count if `sel' & !missing(ret_ex)
local nobs = r(N)
if `nobs' >= `min_days_per_estimation' {
qui reg ret_ex `factors' if `sel'
scalar last_alpha = _b[_cons]
foreach f of local factors {
if "`f'" == "mktexcess" {
scalar last_beta_mkt = _b[`f']
}
else {
scalar last_beta_`f' = _b[`f']
}
}
}
else {
display "No min obs for permno `p', group `g': `nobs'"
}
tempvar sel_next pred
gen byte `sel_next' = (`groupid' == `=`g'+1')
gen double `pred' = 0 if `sel_next'
foreach f of local factors {
if "`f'" == "mktexcess" {
replace `pred' = `pred' + last_beta_mkt * `f' if `sel_next'
}
else {
replace `pred' = `pred' + last_beta_`f' * `f' if `sel_next'
}
}
replace ret_FF`nfactors' = `pred' if `sel_next'
replace ret_FFrf`nfactors' = rf + `pred' if `sel_next'
drop `pred'
}
restore
// preserve
}
export delimited permno datenum ret_FF`nfactors' ret_FFrf`nfactors' ///
using "matlab_FF`nfactors'_returns.csv", replace
}
save "Done_FamaFrenchAbnormal.dta", replace

Comment