Bubbles for Fama(2018, JFE)的泡沫識別策略:應用於中國股票市場

今年9月的JFE發了篇評價Fama“價格變動是理性的,價格飆升不等同於價格泡沫”觀點的文章,核心結論有:
i)行業層面,價格的劇烈上揚並不表示未來資產收益的降低(即動量效應是存在的);
ii)但是,價格的急增與未來股票崩盤有顯著正相關;
iii)價格波動、新股發行、BP、EP、股價上升的路徑,都能具有預測未來股價崩盤的效用;
iv)上述因子可以對泡沫做出有效擇時。

這篇文章給出的識別泡沫和崩盤的策略是這樣的:

1.分析單位是一個行業(要求每個行業中至少包含10個公司)

2.將行業價值加權回報率在過去兩年內超過100%或者raw return在過去五年內超過50%定義爲行業泡沫

3.將泡沫啓動後的任意兩年內回報率下降超過40%定義爲崩盤

4.這種識別方法意味着同一個兩年時間段內可能會有幾個不同的泡沫啓動,應對方法是隻選取最先開始的一個泡沫,直到兩年結束纔開始標記該行業的下一個泡沫

剛好我老闆最近對泡沫很感興趣,於是大手一揮就讓我用中國市場的數據跑一跑看看能不能從中國市場的泡沫和崩盤裏找出些有趣的話題,這裏把我今天跑數據的筆記記錄一下,留作以後備查。(在對中國股票市場的複製中,閾值和回報率衡量方式有一定的調整,並不完全一樣。)

原始數據是來自CSMAR所有的個股月交易數據,1990-2018年,一共 596,789  個觀測,先describe一波

數據描述見CSMAR的說明:http://www.gtarsc.com/SingleTable/DataBaseInfo?nodeid=4176

第一步是將月個股交易數據轉變爲月行業交易數據,這一步用的是流通市值加權。

use "/Users/mengjiexu/bubble/mondata.dta"

*-將字符串的交易月份轉變爲date格式
g trdmntcode=monthly(trdmnt,"YM")
format trdmntcode %tm

*- 計算行業月流通市值加權收益率
bys trdmnt nnindcd:egen sxq=sum(mretwd*msmvosd)
bys trdmnt nnindcd:egen totalvosd=sum(msmvosd)
bys trdmnt nnindcd:gen wr=sxq/totalvosd
drop sxq totalvosd
keep trdmnt year wr nnindcd nindnme trdmntcode
duplicates drop nnindcd trdmnt,force

第二步是需要算24個月窗口期的行業累計收益率和Buy and hold return,這裏的難點是對於每一個月都要算其未來24個月的收益率,好在我發現了一個超棒的包:rangestat,剛好可以用來解決這個需求。rangestat的help文檔裏寫它的功能是“Generate statistics using observations within range”,親測了一波覺得這個說明寫得特別實在。這裏計算buy and hold收益率的一個Tip就是可以將連乘轉變爲連加形式,然後再用自然對數減1就成,數學上可以證明是等價的,比如你的收益率是r,那麼exp(total(ln(1+r))-1就是窗口期的buy and hold收益率(total即對窗口期內的ln(1+r)求和)。

sort nnindcd trdmnt
by nnindcd:g l=_n
g t=ln(wr+1)
*- 
計算滾動buy and hold收益率
rangestat (count) t (sum) t (obs) t, by(nnindcd) interval(l 1 24)
g R = exp(t)-1
*- 計算累計收益率
rangestat (sum) wr, by(nnindcd) interval(l 1 24)

第三步是根據buy and hold return 或raw return的閾值保留可能的泡沫時間節點,然後去除交疊的泡沫。去除交疊泡沫這點比較tricky,首先你需要把字符串格式的交易時間轉變成stata數字編碼的date格式,然後纔好對月份進行比大小和做加減。轉成date格式後,一步就能完成去除交疊泡沫:by nnindcd:drop if trdmntcode[_n+1]<trdmntcode[_n]+24。

preserve
keep if wr_sum>=2.7 
sort nnindcd l
*- 
去除交疊的bubble
by nnindcd:drop if trdmntcode[_n+1]<trdmntcode[_n]+24 
*- 標記bubble
g flag=1
sort nnindcd trdmntcode
save "/Users/mengjiexu/bubble/bubbleexist.dta"

 

第四步是就是對最終選出的泡沫發生時間節點做標記(flag=1),然後merge回原始數據截取泡沫發生後該行業的回報率,這裏用preserve和retsore會減少一些merge的冗餘步驟。這裏的一個小挑戰是很難區分泡沫發生節點之前和之後的月份,所以先按行業年份排了序得到組內每個觀測的rank,然後組內標記出泡沫發生那個月份的序號作爲benchmark,將該組內其他觀測的rank減去benchmark就可以得到每個組內所有觀測相對於泡沫發生月份的gap,泡沫發生之後的月份即gap大約0的觀測。

restore
sort nnindcd trdmntcode
merge nnindcd trdmntcode using bubbleexist
drop _merge

*- 保留標記bubble發生後的月數據
sort nnindcd trdmntcode
by nnindcd: g rank=_n
by nnindcd: g bench=rank if flag==1
replace bench=0 if bench==.
by nnindcd: egen rbench=sum(bench)
drop bench
g gap=rank-rbench
keep if gap>=0 
keep if rbench!=0

最後一步就是畫圖啦,由於是面板數據,所以用xtline可以一次性畫出所有泡沫發生後該行業的回報率趨勢

encode(nnindcd),g(nnindcdcode)
xtset nnindcdcode trdmntcode 
xtline wr_sum  
xtline R

從圖上來看,中國股票市場行業泡沫發生後確實有部分行業會在一定時間內崩盤,但並不是絕對的,JFE那篇文章也提到過原因有兩個:1.一些朝陽行業確實在持續增長,根本不會崩盤 2.泡沫的頂點公認的難預測,價格一般都會在泡沫破滅前持續上漲,給投資者帶來不錯的淨收益。

code和文章放到我的github上了惹:https://github.com/xumj9/bubble/tree/master,數據太大了而且可以直接從CSMAR上下我就不放了( ̄) 

 

主要參考文獻和鏈接:

https://zhuanlan.zhihu.com/p/24174267

http://bbs.pinggu.org/thread-740917-1-1.html

Greenwood, Robin, Andrei Shleifer, and Yang You 2018 Bubbles for Fama. Journal of Financial Economics. http://www.sciencedirect.com/science/article/pii/S0304405X1830254X.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章