今年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.