课程采用蔡瑞胸(Ruey S. Tsay)的《金融数据分析导论:基于R语言》(Tsay 2013)
(An Introduction to Analysis of Financial Data with R)作为主要教材之一。
这是第一章金融数据及其特征的授课笔记。

参考:

  • (Tsay 2013)
  • (Tsay 2010)
  • (Tsay 2014)
  • (吴喜之 and 刘苗 2018)
  • (何书元 2003)
  • (Lutkepohl and Kratzig 2004)
  • (Cryer and Chan 2008)
  • (Christoffersen 2003)

资产收益率

Pt为某资产在t时刻的价格或净值,
t按照某种时间单位(如年)计数。

简单收益率

这里假定计算收益率的时间单位保持不变。
常用年为单位。

单期简单毛收益率:

1+Rt=PtPt1

单期简单净收益率,简单收益率:

Rt=PtPt11=PtPt1Pt1

k期简单毛收益率:

1+Rt[k]=PtPtk=j=0k1(1+Rtj).

k期净收益率:

Rt[k]=PtPtk1=PtPtkPtk

:

在实际中,
收益率(利率)一般按年为单位,
但是计息区间长度可以不等于一年。

设在银行借款金额为P
银行标称年利率为R(称为名义年利率),
但以半年计息一次的复利方式计算利息,
一年后偿还本金和利息。
如何计算本息?

解答:

年利率是名义利率,
因为每半年计息一次,
所以半年期的利率是R/2
即时间单位为半年时,简单收益率是R/2
这是金融行业计算利率的常见做法,
即利率按年标注,
但是不一定每一年计息一次,
如果每年计息n次,
1/n年的简单收益率为R/n

对于本例,
半年后本息合计为P(1+R2)
随后利息合并进入本金,
后半年的本息合计为P(1+R2)2
所以一年后需要偿还的本息为P(1+R2)2

这里,称R名义利率(nominal interest rate)。
因为每年计息两次且为复利,
所以定义实际利率(或译为有效利率,effective interest rate)RR使得

P(1+R)=在一年后未偿还的本息和

R是以一年为时间单位的简单收益率。
在本例中实际年利率为

R=(1+R2)21=1+R+14R21>R.

如果名义利率为R,分n期计息,则实际利率R

R=(1+Rn)n1.

名义利率和实际利率的关系的深入讨论参见2.1.2。

例(九出十三归)
这是高利贷的一个典型范例。
古代的当铺以物品为抵押放出贷款,
但是号称放贷10元,
仅给9元贷款,
在放款时就已经收走了1元利息;
贷款期3个月,
每月利息1元,
到期需要换10元本金和3元利息(实际是9元本金和4元利息),
所以3个月的利率(简单收益率)是

1399=49=44.4%,

折合年利率为

(1+4/9)41=335%.

注意我国现行民法典以大于36%为高利贷,
超过36%的利息部分在法律上是无效的。

○○○○○

例子数据:苹果公司2011-12-02到2011-12-09的每日股票收盘价:

d.apple <- tibble(
  date=c(ymd("2011-12-02"), 
         ymd("2011-12-05") + days(0:4)),
  price=c(389.70, 393.01, 390.95, 389.09, 390.66, 393.62)
)
knitr::kable(d.apple)
date price
2011-12-02 389.70
2011-12-05 393.01
2011-12-06 390.95
2011-12-07 389.09
2011-12-08 390.66
2011-12-09 393.62

计算单期简单收益率的函数:

simple.return <- function(x){
  x <- as.vector(x)
  c(NA, diff(x) / x[1:(length(x)-1)])
}

计算简单收益率(时间单位是交易日,无交易的日期忽略),
精确到百分数的小数点后2位:

d.apple <- d.apple %>%
  mutate(SR1=round(100*simple.return(price), 2))
knitr::kable(d.apple)
date price SR1
2011-12-02 389.70 NA
2011-12-05 393.01 0.85
2011-12-06 390.95 -0.52
2011-12-07 389.09 -0.48
2011-12-08 390.66 0.40
2011-12-09 393.62 0.76

从2011-12-02到2011-12-09是周五到周五,
这一周时间的多期简单收益率为:

(d.apple[6,"price"] - d.apple[1,"price"]) / 
  d.apple[1,"price"]
##        price
## 1 0.01005902

即1.01%。

设某资产持有k年,
按复利计算的(平均)年化收益率为

{j=0k1(1+Rtj)}1/k1=exp{1kj=0k1ln(1+Rtj)}1

当各Rtj都很小时,
可近似ln(1+x)x,
ex1+x
k期的平均年化复利近似为

1kj=0k1Rtj

但是当单期利率较大时此公式误差较大。

连续复利收益率

设某资产的的初始值为C,
名义上的年利率为r
但是在一年内分成m次付息,
理论上每次付息Crm
最终的资产净值应为C+Crm×m=C(1+r)
但是,因为提前付息,
所以提前支付的利息也进入账户增值,
从第二次付息开始,支付的利息就超过了Crm
使得一年后的净值要高于C(1+r)
一年后的净值为

C(1+rm)m

m时,
由极限limx+(1+1x)x=e
可知

limmC(1+rm)m=limmC[(1+rm)mr]r=Cer.

这时r称为连续复利
它也对应某个时间单位(一般是年),
R=er1是连续复利r对应的实际利率,
rR的关系为

R=er1,r=ln(1+R)

例如,
取年连续复利r=0.10,
m=1,2,3,12,52,365,
初始资产1元,多次付息并计入账户,
一年后净值分别为

m <- c(1, 2, 3, 12, 52, 365)
mlab <- c(paste(m), "Inf")
y <- c((1 + 0.10/m)^m, exp(0.10))
knitr::kable(tibble(`付息次数`=mlab, `年末净值`=y))
付息次数 年末净值
1 1.100000
2 1.102500
3 1.103370
12 1.104713
52 1.105065
365 1.105156
Inf 1.105171

所以按连续复利计算,
连续复利的年利率10%,
等价于实际年利率为10.52%。

按年连续复利的利率为r
初始资产价格为Ptn
n年后的资产净值为

Pt=Ptnenr

其中n可以是整数也可以不是整数。

n=1时,

rt=lnPtPt1=lnPtlnPt1=ln(1+Rt)

其中Rt是一年期的简单收益率,
rt称为连续复合收益率或对数收益率,
这就是上面的连续复利,
但时间单位可以是任何时间单位。

当收益率较小时,有

rt=log(1+Rt)Rt,Rt=ert1rt,

两者很接近。

对多期连续复合收益率,

rt[k]=lnPtlnPtk=ln(1+Rt[k])=lnj=0k1(1+Rtj)=j=0k1rtj

所以连续复利比简单复利的公式简单,
用加法代替了乘法。

例(加倍法则):

如果将资金投入一个以每年计息一次,
复利利率为R的账户中,
多少年后资金变成原来的两倍?

解答:

设初始资金为P,即求n使得

P(1+R)n2P

其中R较小时

(1+R)n=enln(1+R)enR

enR2

nln2R=0.693R0.7R

R=0.07时需要10年翻倍。

○○○○○

给定一个价格序列,计算对数收益率序列的函数如下:

log.return <- function(x){
  c(NA, diff(log(x)))
}

苹果公司股票的日对数收益率:

d.apple <- d.apple %>%
  mutate(LR1=round(100*log.return(price), 2))
knitr::kable(d.apple)
date price SR1 LR1
2011-12-02 389.70 NA NA
2011-12-05 393.01 0.85 0.85
2011-12-06 390.95 -0.52 -0.53
2011-12-07 389.09 -0.48 -0.48
2011-12-08 390.66 0.40 0.40
2011-12-09 393.62 0.76 0.75

现值分析

假设可以以每期计息一次的方式,
以每期R的名义利率借款和贷款。
这时,
i期的期末支付v元的当前价值是多少?

应为P使得

P(1+R)i=v

P=v(1+R)i

计算现值可以用于比较不同的现金流,
也可用于计算实际利率。

设在今后的n年,
每年年末分别收到x1,x2,,xn元。
名义年利率为R
这个现金流的现值为

x1(1+R)1+x2(1+R)2++xn(1+R)n=i=1nxi(1+R)i.

贷款还款分析

设一个人抵押贷款金额为L
需要在今后n个月的的每月月末偿还等额A
贷款的月名义利率是R,每月计息一次(复利)。

  1. 已知L,n,R,则A的值是多少?
  2. 在第j月的月末已经完成支付后,还剩下多少贷款的本金?
    这一问题对于提前还款十分重要。
  3. 在第j月的支付中,多少是利息的支付,
    多少是本金的支付?

解答1
为了求得A,只要按利率R计算各次支付的现值等于L

L=i=1nA(1+R)i

β=11+R

L=Ai=1nβi=Aβ1βn1β

于是

A=LR1(1+R)n

例如,设L=100万元,
n=120个月(10年),
R=0.006
则:

loan_pm <- function(L = 100, n = 120, R = 0.006){
  L * R / (1 - (1 + R)^(-n))
}
loan_pm()
## [1] 1.171419
## [1] 40.57025
((loan_pm() * 120) / 100)^(1/10) - 1
## [1] 0.03464018

每月需要还款1.17万元,总共还利息40万元。
因为中间也还了一部分本金,
所以将分期偿还的这些本息看成是在10年末尾一起偿还的,
年利率只有3.5%;
但是,因为提前偿还了部分本息,
所以持有贷款的期间实际借款没有100万元那么多,
年利率就不止3.5%。
实际年利率是7.2%左右。

解答2:设在第i月的月末偿还A后还剩的本金为Bii=0,1,,n
B0=L, Bn=0
考虑{Bj}之间的关系,
如果在第j月的月末偿还后还有Bj债务,
则在第j+1的月末还有(1+R)Bj债务,
偿还A后还有Bj+1债务,即

Bj+1=(1+R)BjA, j=0,1,,n1

α=1+R,递推有

B1=B2=B3=αLAαB1A=α2L(1+α)AαB2A=α3L(1+α+α2)A

一般地,对j=1,2,,n

Bj=αjLA(1+α++αj1)=Lαjαnj1αn1

解答3
IjPj分别表示在第j月的月末支付的利息和本金的扣除额,
Ij+Pj=A
j1个月的月末偿还后还剩Bj1债务,
在第j个月需要偿还的利息为Ij=RBj1
于是

Ij=L(α1)αj1αnj+11αn1.

Pj=AIj=L(α1)αj1αn1.

可以看出本金的偿还额越到后期越多,
而还款前期主要支付的是利息。

例如,设L=100万元,
n=120个月(10年),
R=0.006
则:

loan_demo <- function(L = 100, n = 120, R = 0.006){
  A <- L * R / (1 - (1 + R)^(-n))
  alpha <- 1 + R
  jvec <- 1:n
  Bvec <- L * alpha^jvec * (alpha^(n - jvec) - 1) / (alpha^n - 1)
  Ivec <- L * (alpha - 1) * (alpha^(n - jvec + 1) - 1) / (alpha^n - 1)
  Pvec <- A - Ivec
  data.frame(
    "月份" = jvec,
    "还款" = A,
    "还本" = Pvec,
    "利息" = Ivec,
    "剩余" = Bvec
  )
}
tmp.d <- loan_demo()
knitr::kable(tmp.d[seq(12, 120, by=12),], digits=2, row.names=FALSE)
月份 还款 还本 利息 剩余
12 1.17 0.65 0.53 92.91
24 1.17 0.72 0.45 85.30
36 1.17 0.79 0.38 77.11
48 1.17 0.86 0.31 68.32
60 1.17 0.92 0.25 58.88
72 1.17 0.98 0.19 48.73
84 1.17 1.03 0.14 37.83
96 1.17 1.08 0.09 26.11
108 1.17 1.13 0.05 13.52
120 1.17 1.17 0.00 0.00

从计算例子看出,
这种等额还款,
前期大部分还款是交利息,
对贷款者不太有利。

○○○○○

回报率

考虑一项投资,
初始支出为a
随后每期分别得到回报b1,b2,,bn
bi0, bn>0
定义该投资每期的回报率R为下述利率的值:
R使得在该利率下现金流序列的复利现值等于零,即

a+i=1nbi(1+R)i=0.

定义函数

P(R)=a+i=1nbi(1+R)i, R[1,)

易见P(R)为严格单调减的连续函数,
limR1=+,
limR=a
所以存在唯一的R使得P(R)=0
R就是回报率。

由于P(0)=bia
所以bi>aR>0
否则R0

当投资的每期回报率为R时,
通常称这个投资有每期100R%的回报率。

求解P(R)=0的方程可以用二分法等数值方法。

如果现金流b1,b2,,bn表示贷出a元后每期的偿还额,
R是贷款人的每期回报率,
也是借款人的实际每期利率。

如果现金流不满足bi0的条件,
则函数P(R)不再是单调函数,
P(R)=0不一定有唯一解,
即使有唯一解也不能确定解左边和右边的回报性质。

例2.1 投资100元,
分5年的回报分别为
20,22,25,30,40元。
求回报率。

解答

R函数uniroot()可以用来求解一元连续函数的单个根。

x <- c(20, 22, 25, 30, 40)
fleft <- function(R) -100 + sum(x / (1+R)^(1:5))
uniroot(fleft, c(-0.99, 10.0), extendInt="downX")
## $root
## [1] 0.1016542
## 
## $f.root
## [1] -0.001301806
## 
## $iter
## [1] 12
## 
## $init.it
## [1] NA
## 
## $estim.prec
## [1] 6.103516e-05

程序中uniroot()的第二个自变量是根可能存在的区间,
选项“extendInt="downX"”说明在初始区间两个端点函数值同号时,
允许按照减函数向外扩大搜索区间。
结果为R=10.16%

○○○○○○

例2.2 设某民间借贷10000元,借期1年,
采用“三分利”,
指月利率3%
需要每月付息,不计复利,
到期偿还本金与最后一个月的利息。
大约相当于年利率36%
用现值分析方法计算实际年利率。

解答

这相当于初始投资10000万元,
然后每个月获得300元回报,
共11个月,最后一个月获得10300回报。
设实际年利率(回报率)为R
a=10000,
bi=300, i=1,2,,11,
b12=10300,
要解方程

a+k=112bi(1+R)k=0.

用R程序计算:

x <- c(rep(300, 11), 10300)
fleft <- function(R) -10000 + sum(x / (1+R)^(1:12))
uniroot(fleft, c(-0.99, 10.0), extendInt="downX")
## $root
## [1] 0.02999609
## 
## $f.root
## [1] 0.3894237
## 
## $iter
## [1] 11
## 
## $init.it
## [1] NA
## 
## $estim.prec
## [1] 6.103516e-05

求得的实际年利率(回报率)为38.94%

○○○○○○

资产组合收益率

设有N项资产,
t1时刻组合净值为

Ap,t1=j=1NAi,t1=Ap,t1j=1Nwi

其中wi=Ai,t1/Ap,t1是第i项资产的权重。
于是

Ap,t==j=1NAi,t1(1+Ri,t)=Ap,t1j=1nwi(1+Ri,t)Ap,t1(1+j=1nwiRi,t)

所以资产组合的简单收益率为

Rp,t=j=1nwiRi,t

注意其中wi是第t1时刻的权重。
如果继续计算Rp,t+1
权重应该使用t时刻的权重。
当然,如果资产比例变化不大,
使用不变的{wi}近似也是可以的。

对于对数收益率没有如此简单的公式。
当收益很小时近似有

rp,tj=1nwiri,t

红利支付与收益率

对价格Pt1的某资产,
如果在t1t之间每单位还支付Dt红利,
则到t时刻时,
收益为PtPt1+Dt
所以这时收益率应计算为

Rt=PtPt1+DtPt1,rt=ln(Pt+Dt)lnPt1

超额收益率

Zt=RtR0t,zt=rtr0t

其中R0tr0t是某项参考资产的收益率,
如美国短期国债收益率。

超额收益率被认为是如下的套利投资组合的盈利:
对该资产持有多头头寸,
对参照资产持有空头头寸,
且初始净投资额为零。

多头金融头寸是指持有某资产。
空头头寸是指从持有某资产的投资者手里借入某资产,
然后卖出这些不属于自己的资产,
在随后的规定日期卖空者有义务通过买入相同数额的该资产偿还借出者,
不能偿还现金,
当规定日期时该资产价格下跌时空头持有者可以获利。
如果空头持有期间目标资产支付现金红利,
空头持有者有义务支付红利给借出者。

关系小结

简单收益率Rt与连续复合收益率(对数收益率)rt的关系为

rt=ln(1+Rt),Rt=ert1

简单的k期收益率为

Rt[k]=(1+Rt)(1+Rt1)(1+Rtk+1)1

k期对数收益率为

rt[k]=rt+rt1++rtk+1

如果连续复合年利率固定为r
初始资产为C
n年后资产为A,则

A=Cern,C=Aern

例:
若某项资产月对数收益率为4.46%,
则简单收益率为

## [1] 0.04560953

即4.56%。
如果某项资产在一个季度的月对数收益率为
4.46%, -7.34%, 10.77%,
则该季度的对数收益率为

0.0446 + (-0.0734) + 0.1077
## [1] 0.0789

即7.89%。

IBM股票从2001-1-2到2010-12-31的日简单收益率和对数收益率的图形:

d.ibm <- read_table(
  "d-ibm-0110.txt",
  col_types=cols(date=col_date(format="%Y%m%d"),
    return=col_double()))
with(d.ibm,  plot(
  date, return, type="l", 
  xlab="Date", ylab=expression(R[t])))

金融时间序列分析讲义第2章: 金融数据及其特征

with(d.ibm, plot(
  date, log(1 + return), type="l", 
  xlab="Date", ylab=expression(r[t])))

金融时间序列分析讲义第2章: 金融数据及其特征

共有2515个观测。
简单收益率与对数收益率的相关系数:

with(d.ibm, cor(return, log(1+return)))
## [1] 0.9997069

为0.9997。
当收益率绝对值较小时简单收益率与对数收益率近似相等。

上面将IBM股票数据读成了tibble数据框。
也可以转换成xts类型时间序列,如

z.ibm <- xts(as.matrix(d.ibm[,-1]), d.ibm[["date"]])
quantmod::chartSeries(
  z.ibm, type="line", theme="white",
  xlab="Date", name="IBM Simple Return")

金融时间序列分析讲义第2章: 金融数据及其特征

债券收益和价格

债券类型

投资者以市场价格买入债券,
在到期日收回票面价格的现金。
买入价格低于票面价格。
有些债券还在持有期间定期派发利息,
利息按照票面利率(coupon payment)和面额计算,
比如,
面值为100元,
票面利率为6%,
如果每半年派发一次利息,
则每次派息100×0.06/2=3元。
有些债券不在中间派息,这样的债券称为零息债券。

当期收益率

当期收益率仅计算每年的表面收益,
不考虑资金的时间成本。

当期收益率=每年派息额买入价格×100%

比如,
票面价格100元,
买入价格90元,
票面利率为每年5%,
则持有一年的表面的年收益率为

(100×0.05)/90=5.56%

这没有考虑到期时票面价格与买入价格差值造成的收益。

到期收益率

对于零息债券,
持有期间没有任何利息收入。
如果购入价格为P
面值为F
持有k年到期,则收益率为

(FP)1/k1

这称为到期收益率(Yield To Maturity, YTM)。

如果持有期间有派息,
则到期收益率的计算很复杂,
方法是求y
令投资者在购入时的价格P等于持有期间、包括到期时的所有现金收入按照利率y贴水到购入时刻的现值。
设面额为F,
售价为P,共派息k次,
到期收益率为待定的yy对应的时间区间为两次派息之间的时间区间,
各次派息额为C1,C2,,Ck,则方程为

P=C11+y+C2(1+y)2++Ck(1+y)k+F(1+y)k

当每年派一次息时y就是年化的到期收益率。

如果票面利率(名义年利率)为α
持有n年,
每年派息m次,k=nm
每次派息Fα/m,
设按1/m年计算的到期收益率为y
则方程为

P==Fαm[11+y+1(1+y)2++1(1+y)k]+F(1+y)kFαmy[11(1+y)k]+F(1+y)k

设某债券面值为100元,
售价为P,
持有时间为n=3年,
每年发息m=2次,
票面利率为α=0.05
则一共有k=nm=6次发息,
每次发息100×0.05/m=2.5元。
设到期收益率按半年期利率计算为y
则售价与到期收益率y(半年期)之间的关系为

P==Fαmy[11(1+y)k]+F(1+y)k2.5y[1(1+y)6]+100(1+y)6

Py的曲线图如下:

f <- function(y) 2.5/y*(1 - (1+y)^-6) + 100*(1+y)^-6
curve(f(x), 0.028, 0.052, xlab="半年期到期收益率", ylab="售价")
abline(v=c(0.030, 0.035, 0.040, 0.045, 0.050), col="gray")
pr <- c(97.29, 94.67, 92.14, 89.68, 87.31)
abline(h=pr, col="gray")

金融时间序列分析讲义第2章: 金融数据及其特征

图中画出了半年期到期利率为3%, 3.5%, 4%, 4.5%, 5%时的售价。
如果半年期到期利率为3%,
售价为97.29元。
半年期到期利率3%转换为年化到期利率, 结果为

(1+0.03)21=0.0609

教材P.6上的到期利率是按半年期利率计算的名义值,
实际年化利率应为(1+y)m1

债券的售价P是到期收益率y的严格单调减函数P=g(y)
在已知F, n, m, αP的条件下用二分法或牛顿法求解g(y)=P可以求出y的精确值。
比如,用牛顿法求解到期收益率。
设要解的方程为f(x)=0,(f(x)=g(x)P)
牛顿法从某个x0出发,
用如下公式迭代:

xt+1=xtf(xt)/f(xt)

其中f(xt)可以用数值微分方法估计为

f(xt)f(xt+δ)f(xtδ)2δ,

其中δ=106
初值x0取为

x0=αm+(FP)1/k1

ytm.newton <- function(
  P=97.29, F=100, alpha=0.05, n=3, m=2){
  k <- n*m
  f <- function(y){
    F*alpha/(m*y)*(1 - (1+y)^(-k)) + F*(1+y)^(-k) - P
  }
  
  x0 <- alpha/m + (F/P)^(1/k) - 1
  eps <- 1E-6 # 方程左边绝对值小于此值时迭代结束
  delta <- 1E-6 # 数值微分的步长
  max.iter <- 100
  iter <- 0
  repeat{
    iter <- iter + 1
    dfx <- (f(x0 + delta) - f(x0 - delta))/(2*delta)
    x0 <- x0 - f(x0)/dfx
    cat(iter, x0, f(x0), "\n")
    if(iter >= max.iter || abs(f(x0))<eps) break
  }
  
  x0 # 结果是1/m年的到期收益率
}
ytm.newton(P=97.29, F=100, alpha=0.05, n=3, m=2)
## 1 0.03000207 0.0003023458 
## 2 0.03000264 5.709069e-10
## [1] 0.03000264

仅迭代了两次就求得了精度有四位有效数字的结果。
注意,
牛顿法求根需要比较准确的初值,
如果初值取得太远,
牛顿法可能不收敛。

美国政府债券

短期国债

Treasury Bills, T-Bills.

持有时间在1年及一年以下,
零息债券,购入时以低于面值购入。
常用期限:

  • 28天(4周,一个月)
  • 91天(13周,三个月)
  • 182天(26周,半年)
  • 364天(52周,一年)

其年化利率采用如下的简便公式计算:

折现收益率(\%)=FPF×360到期持有天数×100(%)

更合理的到期收益率公式应为

(%)=[(FP)365.25到期持有天数1]×100(%)

F=100, P=95,
到期持有天数在28到364之间变化时两种不同算法的变化曲线如下:

F <- 100
P <- 95
curve((F-P)/F*360/x*100, 28, 364, col="red",
      xlab="Days", ylab="YTM")
curve(((F/P)^(365.25/x)-1)*100, 28, 364, 
      add=TRUE, lty=2, col="green")
legend("topright", lty=c(1,2), col=c("red", "green"),
       legend=c("Standard", "Exact"))

金融时间序列分析讲义第2章: 金融数据及其特征

两条曲线有较大差距,
这实际上是因为短期债券的售价太低导致利率过高引起的,
在正常利率范围内两者应该差距不大。

设年化利率规定在5%,
面值F=100
按标准公式计算的售价为

P=F(1R天数360)=100(10.05天数360)

按标准公式计算的折现率为5%,
计算相应的精确到期收益率:

days <- c(28, 91, 182, 364)
prices <- 100*(1 - 0.05*days/360)
rates <- ((100/prices)^(365.25/days)-1)*100
rbind(days, standard=5, exact=round(rates,2))
##           [,1]  [,2]   [,3]   [,4]
## days     28.00 91.00 182.00 364.00
## standard  5.00  5.00   5.00   5.00
## exact     5.21  5.24   5.27   5.34

精确利率要高。
在标准公式中计算利率用了(FP)/F
理论上应该用(FP)/P
所以标准公式低估了利率。
因为短期国债并不能很容易地自动转存,
所以低估是有一定合理性的。

中期国债

Treasury Notes, T Notes.

在1年到10年内到期,
每6个月支付一次利息,面值1000元。
在二级市场上以面值的特殊百分数报价,
百分数的小数部分1/32为单位,
比如报价95:08,
即报价1000×95832÷100=952.5
10年期美国国债是报价频率最高、安全性最高的国债。

长期国债

Treasury Bonds, T-Bonds.

30年期的国债,
每6个月付息一次。

R扩展包quantmod包含了金融数据建模的功能,
比如可以从雅虎、谷歌财经等公开数据源下载多个经济和金融事件序列数据。

library(quantmod)
TNX <- getSymbols("^TNX", auto.assign = FALSE) # CBOE 10年期国债数据
##            TNX.Open TNX.High TNX.Low TNX.Close TNX.Volume TNX.Adjusted
## 2007-01-03    4.658    4.692   4.636     4.664          0        4.664
## 2007-01-04    4.656    4.662   4.602     4.618          0        4.618
## 2007-01-05    4.587    4.700   4.583     4.646          0        4.646
## 2007-01-08    4.668    4.678   4.654     4.660          0        4.660
## 2007-01-09    4.660    4.670   4.644     4.656          0        4.656
## 2007-01-10    4.666    4.700   4.660     4.682          0        4.682
chartSeries(TNX, theme="white", TA=NULL, type="line") # 仅收盘价,不显示交易量

金融时间序列分析讲义第2章: 金融数据及其特征

隐含波动率

  • 股票期权(stock option)
  • 看涨期权(call option)
  • 看跌期权(put option)
  • 执行价格(strike price):在未来规定的期间有权利以执行价格买入或者卖出一定数量的股票。
  • 到期日(time to maturity)
  • 欧式期权:只有在到期日才能行权
  • 美式期权:在到期日及之前都可以行权
  • CBOE, 美国芝加哥期权交易所
  • 行权时根据给持有人的现金流的正、负、零分为
    价内期权(in-the-money),价外期权(out-of-the-money),平价期权(at-the-money)。
    当然,只有价内期权会实际行权。

期权价格影响因素:

  • 执行价格
  • 无风险利率
  • 当前股价
  • 股票的波动率

Black-Scholes模型:
在假设股票价格服从几何布朗运动的条件下,
给出了期权价格的解析解,
其中包含不可观测的波动率。
波动率(volatility)是股票价格的条件标准差。
可以从股价以及BS模型求解出波动率,
这样得到的波动率称为隐含波动率(implied volatility)。

VIX: CBOE的波动率指数,
1993年提出,2003年修订。

蔡教授提供的文本文件d-vix0411.txt中,
前面几列用空格分隔,
后面几列用制表符分隔,
这使得程序读入这样的文件很困难,
同学一定不要制造这样的文件。
为了可以读取,
将所有行用readr::read_file()读入,
用字符串函数gsub()将所有制表符替换成空格,
然后再从修改后的字符串读取:

tmp.s <- read_file("d-vix0411.txt")
tmp.s <- gsub("\t", " ", tmp.s, fixed=TRUE)
d.vix <- read_table(tmp.s, 
  col_types=cols(.default = col_double()))
rm(tmp.s)
vix <- xts(d.vix[4:7], 
  make_date(d.vix[["year"]], d.vix[["mon"]], d.vix[["day"]]))
chartSeries(
  vix, type="line", TA=NULL,
  major.ticks="years", minor.ticks=FALSE,
  theme="white", name="CBOE Volatility Index"
  )

金融时间序列分析讲义第2章: 金融数据及其特征

收益率分布特性的探索性分析

苹果公司股票日数据

苹果公司日数据下载:

library(quantmod)
AAPL <- getSymbols("AAPL", src="yahoo", auto.assign=FALSE)
logret.AAPL <- diff(log(AAPL$AAPL.Adjusted))*100 # 对数收益率

计算对数收益率:

logret.AAPL <- diff(log(AAPL$AAPL.Adjusted))*100 # 对数收益率

对数收益率时间序列2007-2017的曲线图:

chartSeries(
  logret.AAPL, type="l", TA=NULL, 
  subset="2007/2017", 
  name="Apple Log Returns",
  theme="white", major.ticks="years", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

仅2017年的对数收益率曲线图:

chartSeries(
  logret.AAPL, type="l", TA=NULL, 
  subset="2017/2017", 
  name="Apple Log Returns",
  theme="white", major.ticks="months", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的直方图:

x <- coredata(logret.AAPL)
hist(x, main="Apple Log Returns", xlab="", ylab="")

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的正态QQ图:

x <- coredata(logret.AAPL)
qqnorm(x, main="Apple Log Returns")
qqline(x, col="red")

金融时间序列分析讲义第2章: 金融数据及其特征

从时间序列曲线图、直方图、正态QQ图都可以看出股票对数收益率有厚尾现象。

美国十年期国债日数据

美国十年期国债日对数收益率下载和计算:

TNX <- getSymbols("^TNX", src="yahoo", auto.assign=FALSE)
logret.TNX <- diff(log(TNX$TNX.Adjusted))*100 # 对数收益率

对数收益率时间序列2007-2017的曲线图:

chartSeries(
  logret.TNX, type="l", TA=NULL, 
  subset="2007/2017", 
  name="US 10 Years T Notes Log Return",
  theme="white", major.ticks="years", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的直方图:

x <- coredata(logret.TNX)
hist(x, main="US 10 Year T Notes Log Returns", xlab="", ylab="")

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的正态QQ图:

x <- coredata(logret.TNX)
qqnorm(x, main="US 10 Year T Notes Log Returns")
qqline(x, col="red")

金融时间序列分析讲义第2章: 金融数据及其特征

从时间序列曲线图、直方图、正态QQ图都可以看出股票对数收益率有厚尾现象。
比苹果股票收益率的厚尾性弱一些。

欧元对美元汇率日数据

下载欧元对美元汇率的日数据,一元时间序列:

DEXUSEU <- getSymbols("DEXUSEU", src="FRED", 
  auto.assign=FALSE)
logret.DEXUSEU <- diff(log(DEXUSEU))*100 # 对数收益率

汇率价格的曲线图:

chartSeries(
  DEXUSEU, type="l", TA=NULL, 
  subset="2007/2017", 
  name="Euro to USD Price",
  theme="white", major.ticks="years", 
  minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率时间序列2007-2017的曲线图:

chartSeries(
  logret.DEXUSEU, type="l", TA=NULL, 
  subset="2007/2017", 
  name="Euro to USD Log Returns",
  theme="white", major.ticks="years", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的直方图:

x <- coredata(logret.DEXUSEU)
hist(x, main="Euro to USD Log Returns", xlab="", ylab="")

金融时间序列分析讲义第2章: 金融数据及其特征

对数收益率的正态QQ图:

x <- coredata(logret.DEXUSEU)
qqnorm(x, main="Euro to USD Log Returns")
qqline(x, col="red")

金融时间序列分析讲义第2章: 金融数据及其特征

也呈现出厚尾性,
且右尾比左尾长。

收益率的分布特性

i资产在时刻t的对数收益率为rit,
简单收益率为Rit,
超额收益率为zit
i=1,,N, t=1,2,,T

统计分布复习

k表示元素是有k个实数值分量的向量组成欧式空间。
xk表示其中一个点(向量)。

联合分布和边缘分布

随机向量的概念。

FX,Y(x,y|θ)=Pθ(Xx,Yy)

表示随机变量XY的参数为θ联合分布函数
xp,
yq

(X,Y)联合密度函数
fX,Y(x,y),

FX,Y(x,y)=xyfX,Y(x,y)dxdy

已知联合分布,
X边缘分布

FX(x|θ)=FX,Y(x,,,|θ)

一元随机变量X分布函数(累积分布函数,cumulative distribution function, CDF)

FX(x|θ)=Pθ(Xx)

其中θ是分布参数。
分布函数单调不减右连续,
limxF(x)=0,
limxF(x)=1

分位数

如果X的一元分布函数F(x)严格单调递增且连续,
p(0,1)
存在唯一的xp使得F(xp)=p
xp称为随机变量X或者分布F(x)p分位数
也记作F1(p)
一般地,令

xp=inf{x|FX(x)p}, p(0,1)

这样定义的xp存在唯一。也记作F1(p)

p分位数的另一定义是x满足

P(Xx)p, P(Xx)1p

这样定义的分位数必存在但不一定唯一。

条件分布

Yy条件下X的条件分布为

F(x|Yy,θ)=P(Xx,Yy|θ)P(Yy|θ)=F(x,y|θ)FY(y|θ)

有联合密度f(x,y|θ)时,
Y=y条件下X有条件密度

f(x|y,θ)=f(x,y|θ)fY(y|θ),f(x,y|θ)=fY(y)f(x|y,θ)

Y=y条件下可以计算条件概率

P(Xx|Y=y,θ)=xf(x|y,θ)dx

条件期望

Eθ(X|Y=y)=xf(x|y,θ)dx=g(y),Eθ(X|Y)=g(Y)

条件方差为

Var(X|Y,θ)=Eθ([XE(X|Y)]2|Y)

期望

EX=xf(x)dx

经常记为μ

方差

Var(X)=E(XEX)2

经常记为σ2
σ称为标准差(standard deviation)。
对于资产收益率,
方差和标准差是度量其不确定性的指标,
可用于资产风险管理和度量。

随机变量Xk原点矩

mk=E(Xk)

期望是一阶原点矩。

k中心矩

mk=E[(XEX)k]

方差是二阶中心矩。

随机变量分布中一元正态分布完全由其期望和方差决定,
其它分布可能需要更多矩。

偏度(Skewness):
Y=XEXVar(X)
称为X的标准化,
Y的三阶矩称为X的偏度,
可以用来度量分布的对称性,
负偏度称为左偏,
反映左尾偏长的情况;
正偏度称为右偏,
反映右尾偏长的情况。

峰度(Kurtosis):
X标准化为Y
Y的四阶矩减去3称为X的超额峰度或峰度,
正态分布的超额分布等于0。
峰度大的分布有重尾或厚尾现象,
其分布密度在±处趋于零速度较慢,
其样本具有较多的异常值(离群值,outliers)。

矩的估计和检验

样本均值

x¯=μ̂ =1Tt=1Txt

样本方差

S2=σ̂ 2=1T1t=1T(xtx¯)2

样本偏度

Skew^=1T1t=1T(xtx¯S)3

样本超额峰度

Kurt^=1T1t=1T(xtx¯S)43

R软件中扩展包fBasics中的basicStats()函数可以计算各种基本的统计量。
收益率数据在大多数情况下表现得与独立同分布观测很接近,
所以尽管我们不能确保其独立同分布,
在实际统计分析时仍使用在独立同分布假设下的各种方法。

为检验H0:μ=0
可以用统计量

Z=x¯S/T‾‾√

H0成立且T充分大时Z近似服从标准正态分布,
利用这样的分布计算检验的p值。
在R软件中

可以进行H0:μ=0的检验。

若观测为独立的正态分布样本,
T充分大时样本偏度渐近服从N(0,6/T)分布,
样本超额峰度渐近服从N(0,24/T)分布,
据此可以计算检验H0:偏度=0H0:超额峰度=0p值。

Jarque和Bera(1987)提出了Jarque-Bera检验,
零假设是总体服从正态分布,
设观测为独立同分布样本,
统计量为

JB=Skew^26/T+[Kurt^3]224/T

在零假设下JB统计量渐近服从χ2(2)分布。
计算右侧p值。
在R软件中

fBasics::normalTest(x, method="jb")

可以执行正态性JB检验。

tseries::jarque.bera.test()也可以执行Jarque-Bera检验。

JB检验的原始文献:
CARLOS M. JARQUE and ANIL K. BERA(1980),
Efficient Tests for Normality, Homoscedasticity and Serial Independence of Regression Residuals,
Economics Letters 6, pp. 255-259.

收益率分布研究例子

作为示例,
对苹果公司股票日收盘价的收益率数据进行简单分析。

取2011-2017数据子集,计算收盘价的对数收益率:

x <- coredata(diff(
  log(AAPL["2011/2017"]$AAPL.Adjusted)))[-1]

基本统计量:

##                       x
## nobs        1760.000000
## NAs            0.000000
## Minimum       -0.131885
## Maximum        0.085022
## 1. Quartile   -0.006914
## 3. Quartile    0.009411
## Mean           0.000789
## Median         0.000574
## Sum            1.388711
## SE Mean        0.000377
## LCL Mean       0.000050
## UCL Mean       0.001528
## Variance       0.000250
## Stdev          0.015812
## Skewness      -0.323171
## Kurtosis       5.486581

这里的Kurtosis是超额峰度。
有左偏,重尾。

直方图:

hist(x, nclass=30, main="Apple Log Returns")

金融时间序列分析讲义第2章: 金融数据及其特征

作核密度估计图并叠加正态密度估计:

tmp.1 <- density(x, na.rm=TRUE)
tmp.x <- seq(min(x, na.rm=TRUE), max(x, na.rm=TRUE), 
             length.out=100)
tmp.y <- dnorm(tmp.x, mean(x, na.rm=TRUE), 
               sd(x, na.rm=TRUE))
tmp.ra <- range(c(tmp.1$y, tmp.y), na.rm=TRUE)
plot(tmp.1, main="Apple Log Return", 
     ylim=tmp.ra)
lines(tmp.x, tmp.y, lwd=2, col="red")
legend("topleft", lwd=c(1,2), 
       col=c("black", "red"),
       legend=c("Kernel density Est.", 
                "Parametric normal density est."))

金融时间序列分析讲义第2章: 金融数据及其特征

比正态密度明显重尾,
且左尾比右尾长。

均值为零的检验:

## 
##  One Sample t-test
## 
## data:  x
## t = 2.0935, df = 1759, p-value = 0.03644
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  0.0000498348 0.0015282461
## sample estimates:
##    mean of x 
## 0.0007890405

检验p值为0.036,在0.05水平下显著,
可认为均值不为零,显著地大于零。

单独计算偏度,及其标准化:

tmp <- fBasics::basicStats(x)["Skewness", 1]; tmp
## [1] -0.323171
## [1] -5.534942

标准化值的绝对值超过1.96,
在0.05水平下拒绝偏度等于零的假设。

单独计算超额峰度,及其标准化:

tmp <- fBasics::basicStats(x)["Kurtosis", 1]; tmp
## [1] 5.486581
## [1] 46.98427

标准化值的绝对值超过1.96,
在0.05水平下拒绝峰度等于零的假设。

正态性JB检验:

fBasics::normalTest(x, method="jb")
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 2245.9834
##   P VALUE:
##     Asymptotic p Value: < 2.2e-16 
## 
## Description:
##  Tue Feb 22 10:38:12 2022 by user: Lenovo

p值为小于万分之一的值,
在0.05水平下显著。

金融数据的图形

  • 时间序列曲线图
  • K线图
  • 叠加均线等
  • 直方图,核密度估计,参数密度估计
  • QQ图
  • ACF和PACF等

时间序列曲线图实例

quantmod::chartSeries()作图,
优点是支持曲线图、K线图、交易量同步显示、增加均线等分析。
缺点是可定制性受限。

苹果公司2017年日收盘价的时间序列图:

chartSeries(
  AAPL, type="line",
  subset="2017", TA=NULL,
  theme="white", name="Apple Stock Price",
  major.ticks="months", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

带有7日均线的曲线图:

chartSeries(
  AAPL, type="line",
  subset="2017", TA="addSMA(7)",
  theme="white", name="Apple Stock Price",
  major.ticks="months", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

TA="..."选项可以添加技术曲线。
详见quantmod::TA()的文档。

用ggplot2包的作图功能则可以进行较多的控制,
比如对时间坐标轴的精细控制。
如:

library(ggplot2)
p <- ggplot(data = tibble(
  time=index(AAPL),
  price=coredata(AAPL)[,"AAPL.Close",drop=TRUE]),
  mapping = aes(x=time, y=price))
p + geom_line()

金融时间序列分析讲义第2章: 金融数据及其特征

修改时间轴,每5年标数值,每年画竖线:

p + geom_line() +
  scale_x_date(
  name = "year",
  date_breaks = "5 years",
  date_labels = "%Y",
  date_minor_breaks = "1 year",
  expand = c(0, 0)) 

金融时间序列分析讲义第2章: 金融数据及其特征

选项date_labels是日期刻度的一种格式规定, 比如”%Y”是四位数的年份,“%Y-%m”是年月格式,等等。

也可以人为指定年份:

p + geom_line() +
  scale_x_date(
  name = "year",
  breaks = lubridate::make_date(c(2008, 2010, 2012, 2014, 2016)),
  date_labels = "%Y",
  date_minor_breaks = "1 year",
  expand = c(0, 0)) 

金融时间序列分析讲义第2章: 金融数据及其特征

可以要求日期旋转45度显示:

p + geom_line() +
  scale_x_date(
    name = "year",
    date_labels = "%Y-%m-%d",
    expand = c(0, 0)) +
  theme(
    axis.text.x = element_text(
      angle = 45, vjust = 1, hjust = 1)  )

金融时间序列分析讲义第2章: 金融数据及其特征

K线图实例

quantmod::chartSeries()作图。

苹果公司2017年日收盘价的K线图,带有成交量:

chartSeries(
  AAPL, 
  subset="2017", 
  theme="white", name="Apple Stock Price",
  major.ticks="months", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

当时间点比较多时,K线图画成了“火柴”形状,每一个K线单元用窄线画出。

仅画最后一个月:

chartSeries(
  AAPL, 
  subset="2017-12", 
  theme="white", name="Apple Stock Price",
  major.ticks="auto", minor.ticks=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

可见时间点比较少时,每个K线单元画成条形。

在K线图中,
条形两端纵坐标为开盘价和收盘价,
低开高收时为阳线,
高开低收时为阴线;
用单色显示时,
阳线显示成空心条形,
阴线显示成实心条形;
用红色和绿色显示时,
国内的习惯是红色阳线,绿色阴线,
而西方的习惯是绿色阳线,红色阴线。
如果最低、最高价不等于开盘价和收盘价,
则向下画短线或者向上画短线。
这样,每个K线单元都表示了OHLC四个值。

子集还可以指定成"from/to"的格式。

密度估计

苹果公司2017年简单收益率的直方图:

x <- simple.return(AAPL["2017","AAPL.Adjusted"])
hist(x, main="Apple Stock 2017 Simple Return", xlab="")

金融时间序列分析讲义第2章: 金融数据及其特征

作核密度估计图并叠加正态密度估计(重复前面例子):

tmp.1 <- density(x, na.rm=TRUE)
tmp.x <- seq(min(x, na.rm=TRUE), max(x, na.rm=TRUE), 
             length.out=100)
tmp.y <- dnorm(tmp.x, mean(x, na.rm=TRUE), 
               sd(x, na.rm=TRUE))
tmp.ra <- range(c(tmp.1$y, tmp.y), na.rm=TRUE)
plot(tmp.1, main="Apple Stock 2017 Simple Return", 
     ylim=tmp.ra)
lines(tmp.x, tmp.y, lwd=2, col="red")
legend("topright", lwd=c(1,2), 
       col=c("black", "red"),
       legend=c("Kernel density Est.", 
                "Parametric normal density est."))

金融时间序列分析讲义第2章: 金融数据及其特征

QQ图

qqnorm(x, main="Apple Stock 2017 Simple Return")
qqline(x, col="red")

金融时间序列分析讲义第2章: 金融数据及其特征

呈现左右均重尾的分布。非正态。

散点图与回归直线

读入IBM和S&P的月度收益率数据,从1926-01到2011-09,
并转换为xts格式,时间下标改为yearmon格式:

d <- read_table(
  "m-ibmsp-2611.txt",
  col_types=cols(.default=col_double(),
                 date=col_date(format="%Y%m%d")))
ibmsp <- xts(as.matrix(d[,2:3]), d$date)
tclass(ibmsp) <- "yearmon"
head(ibmsp)
##                ibm        sp
## 1月 1926 -0.010381  0.022472
## 2月 1926 -0.024476 -0.043956
## 3月 1926 -0.115591 -0.059113
## 4月 1926  0.089783  0.022688
## 5月 1926  0.036932  0.007679
## 6月 1926  0.068493  0.043184

序列图:

chartSeries(
  ibmsp[,"ibm"], type="lines",
  theme="white", name="IBM returns",
  major.ticks="years", minor.ticsk=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

chartSeries(
  ibmsp[,"sp"], type="lines",
  theme="white", name="S&P returns",
  major.ticks="years", minor.ticsk=FALSE)

金融时间序列分析讲义第2章: 金融数据及其特征

IBM收益率对标准普尔指数收益率的散点图:

d <- as.matrix(coredata(ibmsp))
plot(d[,"sp"], d[,"ibm"], pch=16, cex=0.2,
     xlab="S&P", ylab="IBM")

金融时间序列分析讲义第2章: 金融数据及其特征

计算相关系数:

d <- as.matrix(coredata(ibmsp))
cor.test(d[,"sp"], d[,"ibm"])
## 
##  Pearson's product-moment correlation
## 
## data:  d[, "sp"] and d[, "ibm"]
## t = 26.664, df = 1027, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6020164 0.6743519
## sample estimates:
##       cor 
## 0.6395979

相关系数为0.64,显著不等于零。

作线性回归并在散点图上叠加回归直线:

d <- as.data.frame(coredata(ibmsp))
plot(d[["sp"]], d[["ibm"]], pch=16, cex=0.2,
     xlab="S&P", ylab="IBM")
lm1 <- lm(ibm ~ sp, data=d)
print(summary(lm1))
## 
## Call:
## lm(formula = ibm ~ sp, data = d)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.279155 -0.032137 -0.002261  0.030647  0.280313 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.008974   0.001706   5.259 1.76e-07 ***
## sp          0.818776   0.030707  26.664  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.05443 on 1027 degrees of freedom
## Multiple R-squared:  0.4091, Adjusted R-squared:  0.4085 
## F-statistic:   711 on 1 and 1027 DF,  p-value: < 2.2e-16
abline(lm1, col="red", lwd=2)

金融时间序列分析讲义第2章: 金融数据及其特征

回归方程为

IBM=0.008474+0.818776S&P

一般地,

rt=α+βmt+εt

其中rt是某资产的收益率,
mt是市场的收益率,
α表示相对于市场收益的超额收益率。
这样的模型称为市场模型(market model)。

金融数据常用分布

正态分布

早期研究中假设简单收益率{Rt,t=1,2,,T}独立同分布,
服从正态分布。
但是存在不一致的问题:

  • 简单收益率一定大于等于100%,正态分布没有这样的限制;
  • 多期毛收益率是单期毛收益率的乘积,不再服从正态分布;
  • 收益率大多是厚尾分布,而正态分布超额峰度等于零。

对数正态分布

另一种假设是,
对数收益率rt独立同分布,
同正态N(μ,σ2)分布。
这时,
简单收益率Rt=exp(rt)1服从对数正态分布,

ERt=Var(Rt)=exp(μ+12σ2)1,exp(2μ+σ2)(eσ21)(2.1)

反之,如果Rt服从对数正态分布,
m1=ERt,
m2=Var(Rt)
rt=ln(1+Rt)服从正态分布,且

Ert=Var(rt)=ln⎡⎣⎢⎢⎢m1+11+m2(1+m1)2‾‾‾‾‾‾‾‾‾‾√⎤⎦⎥⎥⎥ln[1+m2(1+m1)2](2.2)

如果rt是正态分布,
多期的对数收益率rt[k]也是正态分布,
于是多期简单收益率Rt[k]也是对数正态分布。
Rt=ert11总成立。
这样的假定一致性比较好。
但是,
有些股票的简单收益率的分布表现与对数正态分布不符,
对数收益率分布表现与正态分布不符。
对数收益率一般也有厚尾性。

稳态分布

稳态分布是正态分布的推广,
在加法运算下保持稳态分布不变,
符合连续复合收益率rt的要求。
非正态的稳态分布可以实现厚尾性。
但是,非正态的稳态分布没有方差,
这又使得许多传统统计方法无法使用。
例子有柯西(Cauchy)分布,标准柯西分布密度为

p(x)=1π(1+x2), x(,)

分布密度对称,数学期望和方差都不存在。

混合正态分布

δ为正值随机变量,
比如服从Gamma分布,
设对数收益率在给定δ条件下服从条件正态分布
N(μ,δ1)
rt的边缘分布为尺度混合的正态分布。

f1(x)表示N(μ,σ21)的密度,
f2(x)表示N(μ,σ22)的密度,
0<α<1,若对数收益率rt密度为

f(x)=αf1(x)+(1α)f2(x)

则称rt服从混合正态分布。

例如,μ=0, σ1=1, σ2=10,
α=0.7:

curve(dnorm(x, 0, 1), -5, 5,
      ylab="", lwd=1, col="green",
      main="Mixed Normal Distribution Density")
curve(0.7*dnorm(x, 0, 1) + 0.3*dnorm(x, 0, 10), -5, 5, add=TRUE,
      lwd=2, col="red")
curve(dcauchy(x), -5, 5, add=TRUE, col="cyan")

金融时间序列分析讲义第2章: 金融数据及其特征

其中红色粗线为混合正态密度,绿色细线是标准正态密度。
从密度函数图形可以看出明显的重尾。
浅蓝色为标准柯西分布,重尾更为明显。

多元收益率的分布

金融中不关心一般的多元分布,
主要关心在rt1,,r1条件下rt的条件分布,
尤其是条件期望和条件方差。

设随机向量X=(X1,Xp)T
期望和协方差矩阵为

EX=μ=[EX1,,EXp]T,Var(X)=Σ=E[(Xμ)(Xμ)T]

Var(X)p×p方阵,
主对角线位置是各个分量的方差,
(i,j)位置是XiXj的协方差Cov(Xi,Xj)

xt, t=1,2,,T为多元观测,
则适当条件下(如独立同分布样本)可以估计多元分布的期望和方差:

μ̂ =1Tt=1Txt,Σ̂ =1T1t=1T(xtμ̂ )(xtμ̂ )T

这实际上就是一元的均值估计,
一元的方差估计,
和二元的协方差估计。

例如,
从1926-01到2011-09的IBM和S&P的月度收益率构成多元数据,
估计其均值:

x <- as.data.frame(coredata(ibmsp))
colMeans(x)
##         ibm          sp 
## 0.013818251 0.005916719

计算协方差阵和相关系数阵:

##             ibm          sp
## ibm 0.005008351 0.002502326
## sp  0.002502326 0.003056181
##           ibm        sp
## ibm 1.0000000 0.6395979
## sp  0.6395979 1.0000000

psych包的mardia()函数进行推广的正态性偏度、峰度检验,
并作广义QQ图:

金融时间序列分析讲义第2章: 金融数据及其特征

## Call: psych::mardia(x = x)
## 
## Mardia tests of multivariate skew and kurtosis
## Use describe(x) the to get univariate tests
## n.obs = 1029   num.vars =  2 
## b1p =  0.27   skew =  46.8  with probability  <=  3.3e-09
##  small sample skew =  47.03  with probability <=  3e-09
## b2p =  21   kurtosis =  52.12  with probability <=  0

mvnormtest包的msharpiro.test()可以执行多元的Shapiro-Wilk正态检验。
零假设是服从多元正态分布。

mvnormtest::mshapiro.test(t(as.matrix(x)))
## 
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.92228, p-value < 2.2e-16

这些检验都显著地拒绝了正态性的零假设。

还可以模拟生成期望和协方差阵相同的多元正态随机样本数据,
观察真实样本与模拟正态样本散点图的差别。
mnormt包的rmnorm()函数生成独立的多元正态随机样本。

原始样本的散点图:

plot(x[["sp"]], x[["ibm"]], pch=16, cex=0.2,
     xlim=c(-0.3, 0.5), ylim=c(-0.3, 0.5),
     main="Sample Data",
     xlab="S&P", ylab="IBM")

金融时间序列分析讲义第2章: 金融数据及其特征

生成一、二阶矩相同的正态分布样本,作散点图:

y <- mnormt::rmnorm(nrow(x), mean=colMeans(x), varcov=var(x))
plot(y[,2], y[,1], pch=16, cex=0.2, col="green",
     xlim=c(-0.3, 0.5), ylim=c(-0.3, 0.5),
     main="Simulated Multivariate Normal",
     xlab="S&P", ylab="IBM")

金融时间序列分析讲义第2章: 金融数据及其特征

模拟数据分布集中得多。
注意两个图形比较时,
应采用相同的坐标范围。

参考文献

Christoffersen, Peter F. 2003. Elements of Financial Risk Management. Elsevier Science (USA).

Cryer, Jonathan D., and Kung-Sik Chan. 2008. Time Series Analysis with Applications in r. 2nd Ed. Springer.

Lutkepohl, Helmut, and Markus Kratzig. 2004. Applied Time Series Econometrics. Cambridge University Press.

Tsay, Ruey S. 2010. Analysis of Financial Time Series. 3rd Ed. John Wiley & Sons, Inc.

———. 2013. 金融数据分析导论:基于R语言. 机械工业出版社.

———. 2014. Multivariate Time Series Analysis with r and Financial Applications. John Wiley & Sons, Inc.

何书元. 2003. 应用时间序列分析. 北京大学出版社.

吴喜之, and 刘苗. 2018. 应用时间序列分析——R软件陪同. 第二版. 机械工业出版社.