po 主最近刚好要用到这个指标,在计算过程中发现一些很好玩的细节,不同的处理方式,得到的结果可能会存在系统性的差异。为避免大家踩坑,还是觉得有必要写出来,聊以记录。
股价崩盘风险的原理其实很简单。在有效市场下,股票价格上涨和下跌的概率是相等的,上涨和下降的幅度也是相似的,此时股价收益率成对称分布。但在现实情况下,管理层出于自利考虑,往往会隐藏坏消息,释放好消息,此时股价处于上涨的概率会高于下跌的概率,其分布会呈现左偏。
因此,我们通过数学公式计算出收益率分布的负偏度,即可测度其股价崩盘风险。
具体地,我们可以分三步走:
首先,利用股票的周收益率数据,根据如下模型计算经过市场调整后的收益率:
\[r_{i,t} = \alpha + \beta_{1, i} r_{m,t-2} + \beta_{2, i} r_{m,t-1} + \beta_{3, i} r_{m,t} + \beta_{4, i} r_{m,t+1} + \beta_{5, i} r_{m,t+2} + \varepsilon_{i,t}\]
其中,r_{i,t} 为股票的周收益率,r_{m,t} 为经流通市值加权的平均收益率。
这一步有两个要点需要注意,一是部分学者会对收益率取百分数,即乘以 100;二是会选择逐年计算,而非 pool
到一起。这两种做法都会对我们的结果产生实质性影响。后文我们再做详细对比。
第二步,提取上一步计算所得的残差,加 1 后取对数:
\[W_{i,t} = \ln(1+\varepsilon_{i,t})\]
第三步,计算股价崩盘风险指标
第一个指标是收益率的负偏度 (NCSKEW) ,计算公式为:
\[NCSKEW_{i,t} = -\frac{n(n-1)^{3/2}\sum W_{i,t}^3}{(n-1)(n-2)(\sum W_{i,t}^2)^{3/2}}\]
其中 n 为交易周数。
第二个指标是股价上升和下降阶段波动性的差异 (DUVOL),公式如下:
[LaTex]DUVOL_{i,t} = \ln [\frac{(n_u-1)\sum_{down}W_{i,t}^2}{(n_d-1)\sum_{up} W_{i,t}^2 }][/LaTex]
其中,n_u 为周收益率 W_{i,t} 大于年平均 W_{i,t} 的周数,n_d 为周收益率 W_{i,t} 小于年平均 W_{i,t} 的周数。
首先从股票市场交易→个股交易数据→周个股回报率文件中下载 **考虑现金红利再投资的周个股回报率** 和 **市场类型** 这两个变量,前者作为股票周收益率,后者用于后续的跨表合并。
从股票市场交易→分市场交易数据→周市场回报率文件中下载 **考虑现金红利再投资的周市场回报率 (流通市值加权平均法)** 这一变量,用于衡量平均收益率。
1. 导入数据
先导入周收益率数据
- cap erase "TRD_Week.dta"
- foreach file in TRD_Week TRD_Week1 TRD_Week2 TRD_Week3 {
- import excel using "`file'.xlsx", firstrow clear
- labone, nrow(1 2)
- drop in 1/2
- destring, replace
- keep if inlist(Markettype, 1, 4)
- cap append using "TRD_Week.dta"
- save "TRD_Week.dta", replace
- }
- import excel using "TRD_Weekm.xlsx", firstrow clear
- labone, nrow(1 2)
- drop in 1/2
- destring, replace
- keep if inlist(Markettype, 1, 4)
- save "TRD_Weekm.dta", replace
- use "TRD_Week.dta", clear
- merge m:1 Markettype Trdwnt using "TRD_Weekm.dta", keep(1 3) nogen
- drop Markettype
- gen year = real(substr(Trdwnt, 1, 4))
- keep if inrange(year, 1991, 2022)
- save "raw.dta", replace
调整收益率有两种计算方式。一种是分年计算,一种是汇总计算。
我们先按最常见的分年计算:
- gen l1Wretwdos = l1.Wretwdos
- gen l2Wretwdos = l2.Wretwdos
- gen f1Wretwdos = f1.Wretwdos
- gen f2Wretwdos = f2.Wretwdos
- bys Stkcd year: asreg Wretwd l1Wretwdos l2Wretwdos Wretwdos f1Wretwdos f2Wretwdos, fitted
- gen W = ln(1 + _residuals)
先分步骤计算出调整收益率的二次方和三次方,以及每年的交易周数。
- gen W2 = W^2
- gen W3 = W^3
-
- *- 计算交易周数,并对W的二次方与三次方分年求和
- bys Stkcd year: gen n = _N
- bys Stkcd year: egen sum_W2 = sum(W2)
- bys Stkcd year: egen sum_W3 = sum(W3)
- *- 计算负偏度
- gen NCSKEW = -[(n*(n-1)^(3/2)*sum_W3)] / [((n-1)*(n-2)*sum_W2^(3/2))]
先计算出收益率的年度均值,以及当年收益率高于年度均值和低于年度均值的周数
- *- 计算周收益率的年度均值
- bys Stkcd year: egen W_mean = mean(W)
- *- 计算上涨周数与下跌周数
- gen up = W > W_mean
- gen dw = W < W_mean
- bys Stkcd year: egen nu = sum(up)
- bys Stkcd year: egen nd = sum(dw)
- *- 计算 DUVOL
- bys Stkcd year: egen sum_W2_dw = sum(W^2 * dw)
- bys Stkcd year: egen sum_W2_up = sum(W^2 * up)
- gen DUVOL = ln(((nu-1) * sum_W2_dw) / ((nd-1) * sum_W2_up))
- duplicates drop Stkcd year, force
- winsor2 NCSKEW DUVOL, replace
- keep Stkcd year NCSKEW DUVOL
- save "Crash.dta", replace
我们做一个简单的描述性统计:
- . tabstat NCSKEW DUVOL, stats(N mean sd p50 min max) c(s) f(%6.2f)
- Variable | N Mean SD p50 Min Max
- -------------+------------------------------------------------------------
- NCSKEW | 49700.00 -0.26 0.69 -0.23 -2.28 1.63
- DUVOL | 49686.00 -0.11 0.50 -0.12 -1.29 1.25
- --------------------------------------------------------------------------
那么,我们该怎么来判断这组数的合理性呢?
首先,理论告诉我们,企业更倾向于报喜不报忧,因此收益率多呈右偏,其偏度为多为正值,这意味着其负偏度多为负值。均值很有可能是负数,结果也确如所料,均值和中位数都是负数。
但是,这只能告诉我们大方向,那么具体情况呢?
上图是 po 主自己整理的几篇高引用文献的描述性统计结果,可以发现有两个特点,一是 NCSKEW 的均值大多比 $DUVOL$ 小;二是从数值来看,NCSKEW 的均值基本位于 -0.2 和 -0.3 之间,DUVOL 的均值则稍微离散些,但也多位于 -0.15 到 -0.3 之间。po主的结果也大致符合这一特征。数值绝对值偏小,可能是因为数据较新,且没有剔除金融类上市公司和被 ST 或 PT 标记的企业。
再者,我们也可以通过趋势图来看一下数据的合理性。可以发现,两个指标的趋势是高度重合的。在重大时间节点上,例如 2008 年金融危机,2015 年股灾,2017 年 trade war,以及 2019 年的 xxx,股价崩盘风险都出现了明显的上扬。
数据可从以下链接获取:
上市公司股价崩盘风险
(85 Bytes, 需要: RMB 39 元)


雷达卡






京公网安备 11010802022788号







