说明:本文的代码和内容来自《金融时间序列分析》第三版,编写此文的目的仅为了自身的学习和记录,加强理解,并与一起学习时间序列的朋友相互探讨,没有任何商业目的。转载请说明出处。
宏观经济因子模型
- 该模型使用宏观经济变量来描述资产收益率的共同的行为,其中,宏观经济变量包括GDP增长率、利率、通货膨胀率以及失业人数等。
- 宏观经济因子模型中的因子是可以观测的,可使用最小二乘估计方法来估计。
R = G R=G R=G
单因子模型
金融中最著名的宏观经济因子模型是市场模型,该市场模型就是下述单因子模型:
r
i
t
=
α
i
+
β
i
r
m
t
+
ϵ
i
t
,
i
=
1
,
.
.
.
,
k
;
t
=
1
,
.
.
.
T
r_{it}=\alpha_i+\beta_ir_{mt}+\epsilon_{it},i=1,...,k;t=1,...T
rit=αi+βirmt+ϵit,i=1,...,k;t=1,...T
其中,
r
i
t
r_{it}
rit是第
i
i
i个资产的超额收益率,
r
m
t
r_{mt}
rmt是市场的超额收益率。
例子
考虑13支股票的月收益率,并且将标准普尔500指数的收益率作为市场收益率(也就是因子),下图给出了所用到的股票及代码,样本区间是1990年1月-2003年12月,k=13,T=168.
利用二级市场上的三个月期国库券的月收益作为无风险利率来计算股票和市场指数的超额收益率。
给出第
i
i
i个资产收益率的
β
i
\beta_i
βi,
σ
i
2
,
\sigma_i^2,
σi2,,
R
2
R^2
R2的估计:
data <- read.table(“m-fac9003.txt”,header=T)
designmatrix = cbind(rep(1,168),data$SP5)
rtn = as.matrix(data[,1:13])
xit.hat = solve(t(designmatrix)%%designmatrix)%%t(designmatrix)%%rtn #using LSE to obtain the estimate
beta.hat = t(xit.hat)[,2]
E.hat = rtn - designmatrix%%xit.hat
D.hat = diag(t(E.hat)%%E.hat/(168-2))
r.squre = 1-(D.hat/diag(t(rtn)%%rtn))*(168-2) #caculate the R square
output = cbind(beta.hat,sigma = sqrt(D.hat),r.squre)
-
上文中采用的最小二乘估计中直接使用公式计算,也可以使用*lm()*函数计算更方便一下。
-
lm.model = lm(rtn~data$SP5)
-
在市场模型中, r t r_t rt的协方差矩阵和相关矩阵的估计如下:
cov.r = var(data$SP5)(beta.hat)%%t(beta.hat) + diag(D.hat)
sd.r= sqrt(diag(cov.r))
corr.r = cov.r/outer(sd.r,sd.r)
print(corr.r,digits = 1,width=2)
print(cor(rtn),digits = 1,width=2)
- 在金融中利用全局最小方差组合(GMVP)来比较收益率所拟合因子模型的协方差矩阵和收益率的样本协方差矩阵。
- 对于所考虑的市场模型,所拟合的模型和数据的GMVP如下:
w.gmin.model = solve(cov.r)%*%rep(1,nrow(cov.r))
w.gmin.model = w.gmin.model/sum(w.gmin.model)
w.gmin.data = solve(var(rtn))%*%rep(1,nrow(cov.r))
w.gmin.data= w.gmin.data/sum(w.gmin.data)
比较两个GMVP,给予TRB股票的权重变化很大,然而,这两个组合给予KMB,NYT,PG股票很大的权重。
- 最后检查残差的协方差阵和相关阵以验证13只股票的个性因子不相关的假定。
resi.cov = t(E.hat)%*%E.hat/(168-2)
resi.sd = sqrt(diag(resi.cov))
resi.cor = resi.cov/outer(resi.sd,resi.sd)
print(resi.cor,digits = 1,width=2)
多因子模型
Chen, Roll, and Ross (1986)考虑了股票收益率的多因子模型,所用的因子包含宏观经济变量的不可预知的变化或者意外。这里的不可预知的变化表示移除宏观经济变量动态依赖后所得到的残差。得到不可预知变化的一个简单办法是为宏观经济变量拟合VAR模型。为了进一步说明,考虑两个月的宏观经济变量。
- 城市居民消费价格指数(CPI):包括所有项的指数,且指数1982-1984
- 16年及以上城市就业人数(CE16):以千计。
CPI和CE16都进行了季节调整,数据的时间区间是从1975年1月到2003年12月。我们使用更长的时间区间来得到变量的意外序列。对于这两个时间序列,我们通过取对数序列的一阶差分构造增长率序列。
为了得到意外序列,使用BIC准则来识别VAR(3)模型。因子模型中所用到的两个宏观经济因子都是对数据拟合VAR(3)模型从1990-2003年的残差。对于超额收益率序列,我们仍然考虑前面使用的13支股票,下面给出细节:
library(vars)
da=read.table(“m-cpice16-dp7503.txt”,header=T)
cpi = da
C
P
I
c
e
n
=
d
a
CPI cen=da
CPIcen=daCEN
x1 = cbind(cpi,cen)
y1=data.frame(x1)
ord.choice = VARselect(y1,lag.max = 13) #选择VAR模型的阶数
var3.fit = VAR(y1,p = 3)
summary(var3.fit)
res = resid(var3.fit)[166:333,1:2] #移除动态变化后的残差
xmtx = cbind(rep(1,168),res)
rtn = as.matrix(data[,1:13])
xit.hat=solve(t(xmtx)%%xmtx)%%t(xmtx)%%rtn #using LSE to obtain the estimate
beta.hat=t(xit.hat[2:3,])
E.hat=rtn - xmtx%%xit.hat
D.hat=diag(crossprod(E.hat)/(168-3))
r.square=1-(168-3)(D.hat/diag(t(rtn)%%rtn))
可以画出13支股票的 β i \beta_i βi和 R 2 R^2 R2的条形图,有趣的是,所有的超额收益率与CPI增长率的不可预知的变化都是负相关的,这看起来是合理的。然而,所有的超额收益率 R 2 R^2 R2都很低,这说明这两个宏观经济变量对13支股票的超额收益率的解释能力很弱。
- 可得到二因子模型的协方差矩阵和相关矩阵的估计:
cov.rtn=beta.hat%%var(res)%%t(beta.hat)+diag(D.hat)
sd.rtn=sqrt(diag(cov.rtn))
cor.rtn = cov.rtn/outer(sd.rtn,sd.rtn)
print(cor.rtn,diits=1,width=2)
得到的相关矩阵非常接近于单位矩阵,表明所用的二因子模型并不能很好地拟合这些超额收益率。最后,给出二因子模型残差的相关矩阵。
cov.resi=t(E.hat)%*%E.hat/(168-3)
sd.resi=sqrt(diag(cov.resi))
cor.resi=cov.resi/outer(sd.resi,sd.resi)
print(cor.resi,digits=1,width=2)
该相关矩阵非常接近于前面由原始在、超额收益率序列给出的相关矩阵。