Stata 基于3个变量的5*5*5三重排序(相依排序),生成125个投资组合

Stata 基于3个变量的5*5*5三重排序(相依排序),生成125个投资组合,stata,Stata,基本上,我想做的是遵循Daniel et al.1997在CRSP普通股领域中进行5*5*三重排序相关排序。我想把股票放到一个三维空间里。我想使用一个5*5*5的排序程序,根据三个特征将每个潜在的股票头寸分类为五级:市值ME、账面市值比BM和过去股票收益动量矩 yrm:日期变量,例如1998M11998M2 exchcd:交易所代码,如果股票在纽约证券交易所上市,则=1 步骤1:实现第一次排序,即根据纽约证券交易所市场股票断点对所有在纽约证券交易所上市和未在纽约证券交易所上市的股票进行排序: f

基本上,我想做的是遵循Daniel et al.1997在CRSP普通股领域中进行5*5*三重排序相关排序。我想把股票放到一个三维空间里。我想使用一个5*5*5的排序程序,根据三个特征将每个潜在的股票头寸分类为五级:市值ME、账面市值比BM和过去股票收益动量矩

yrm:日期变量,例如1998M11998M2

exchcd:交易所代码,如果股票在纽约证券交易所上市,则=1

步骤1:实现第一次排序,即根据纽约证券交易所市场股票断点对所有在纽约证券交易所上市和未在纽约证券交易所上市的股票进行排序:

forvalues i = 20(20)80{
    qui bysort yrm: egen ME_Brkp`i' = pctile(ME) if exchcd == 1, p(`i')
}
//所以很明显,对于许多未在纽约证交所上市的股票来说,所有ME断点都有缺失值 //还需要将这些基于纽约证交所的断点分配给那些非纽约证交所的断点

forvalues i = 20(20)80{
    qui by yrm (permno), sort: replace ME_Brkp`i' = ME_Brkp`i'[_n-1] if ME_Brkp`i' >= .
}
if ME_Brkp20 !=. & ME_Brkp40 !=. & ME_Brkp60 !=. & ME_Brkp80 !=. {
qui {
g ME_rank = 1 if ME <= ME_Brkp20 // Smallest Stocks
replace ME_rank = 2 if ME > ME_Brkp20 & ME <= ME_Brkp40
replace ME_rank = 3 if ME > ME_Brkp40 & ME <= ME_Brkp60
replace ME_rank = 4 if ME > ME_Brkp60 & ME <= ME_Brkp80
replace ME_rank = 5 if ME > ME_Brkp80 & ME!=. //Big stocks 
}
}
根据Mom Momentum,过去12个月的回报,我得到了非常混乱和可疑的排名结果:

 tab Mom_rank    

  Mom_rank | Freq.   Percent   Cum. 
 ----------+----------------------------------- 
         1 | 1,912,688 93.12  93.12 
         5 |   141,391  6.88 100.00  
 ----------+----------------------------------- 
     Total | 2,054,079 100.00

某些观测值的Mom_秩应为2、3或4。为什么Mom_rank只接受两个值:1和5?超过90%的人持有价值1

第一个bug可能出现在

if ME_Brkp20 !=. & ME_Brkp40 !=. & ME_Brkp60 !=. & ME_Brkp80 !=. {
这将只看第一次观察。看

egenmore的xtile函数不适合您吗?您的代码似乎过长,而且容易出错。请参阅ssc Descripte egenmore以检查说明,并下载用户编写的说明

例如:

clear
set more off

// example data
sysuse auto
replace mpg = . in 2

// display percentiles domestic/foreign (not necessary)
_pctile mpg if foreign, p(20(20)80) 
return list

_pctile mpg if !foreign, p(20(20)80) 
return list

// create groups
egen pct = xtile(mpg), by(foreign) p(20(20)80)
egen pct2 = xtile(mpg), by(foreign pct) p(20(20)80)
egen pct3 = xtile(mpg), by(foreign pct pct2) p(20(20)80)

// list
sort foreign pct pct2 pct3 make
list make mpg foreign pct* in 1/50, sepby(pct pct2 pct3)

// tab
tab pct3
请注意,当您逐步嵌套百分位分类时,可变性减小;但这是意料之中的。如果您根据不同的变量进行分类,而不是我的示例,那么我的猜测是,可变性将取决于这些变量的相关结构。

问题是:

 qui bysort yrm ME_rank BM_rank: egen Mom_p`i'_`mer'_`bmr' = pctile(cond(ME_rank==`mer',BM_rank==`bmr',Mom,.)), p(`i')
应该是

qui bysort yrm ME_rank BM_rank: egen Mom_p`i'_`mer'_`bmr' = pctile(cond(ME_rank==`mer' & BM_rank==`bmr',Mom,.)), p(`i')

交叉张贴在。ssc安装egenmore检查egenmore一致性并验证尚未安装。。。以下文件已存在且不同:c:\ado\plus\uu gfilter.ado未安装或复制任何文件r602未执行任何操作;当我尝试安装egenmore时,出现错误消息可能是您安装的egenmore版本已过时。请咨询帮助egenmore。如果出现帮助文件,则表示您已经拥有它。要更新,请参阅help adoupdate和help ssc。嗨,Roberto,我发现stata直接执行xtile所需的时间比使用pctile生成那些p20、p40..p80百分位断点,然后使用断点将这些OB放入相应的五分位要长得多。另一个问题是,我需要仅使用纽约证交所上市股票的市值信息,为特定月份的所有股票生成断点。因此,如果我使用下面的命令:qui bysort yrm:egen ME_gr=xtileME if exchcd==1,p202080;我不会得到任何可以用来对非纽约证交所上市公司进行分类的东西stocks@RobertoFerrerbysort yrm ME_rank BM_rank:egen Mom_rank=xtileMom,p202080我收到错误消息:值r134太多;
clear
set more off

// example data
sysuse auto
replace mpg = . in 2

// display percentiles domestic/foreign (not necessary)
_pctile mpg if foreign, p(20(20)80) 
return list

_pctile mpg if !foreign, p(20(20)80) 
return list

// create groups
egen pct = xtile(mpg), by(foreign) p(20(20)80)
egen pct2 = xtile(mpg), by(foreign pct) p(20(20)80)
egen pct3 = xtile(mpg), by(foreign pct pct2) p(20(20)80)

// list
sort foreign pct pct2 pct3 make
list make mpg foreign pct* in 1/50, sepby(pct pct2 pct3)

// tab
tab pct3
 qui bysort yrm ME_rank BM_rank: egen Mom_p`i'_`mer'_`bmr' = pctile(cond(ME_rank==`mer',BM_rank==`bmr',Mom,.)), p(`i')
qui bysort yrm ME_rank BM_rank: egen Mom_p`i'_`mer'_`bmr' = pctile(cond(ME_rank==`mer' & BM_rank==`bmr',Mom,.)), p(`i')