金融数据及其特征
参考学习资料:金融数据及其特征的授课笔记。
参考:
- (Tsay 2013)
- (Tsay 2010)
- (Tsay 2014)
- (吴喜之 and 刘苗 2018)
- (何书元 2003)
- (Lutkepohl and Kratzig 2004)
- (Cryer and Chan 2008)
- (Christoffersen 2003)
1.1 资产收益率
设为某资产在时刻的价格或净值。
1.1.1 简单收益率
- 单期简单毛收益率
- 单期简单净收益率,简单收益率
- 期简单毛收益率
- 期净收益率又称为复合收益率(compound return)
(原笔记有很多数学公式,我就不重复了)还是实例更容易理解记忆
例:
设借款金额为, 年利率为(称为名义年利率), 以半年计息一次的复利方式计算利息, 一年后偿还本金和利息。 这意味着什么?
解答:
年利率是名义利率, 半年期的利率是。 半年后本息合计为, 随后利息合并进入本金, 后半年的本息合计为, 所以一年后需要偿还的本息为。
这里,称为名义利率(nominal interest rate)。 按照一年期单利计算利率, 定义实际利率(或译为有效利率,effective interest rate)为使得在一年后未偿还的本息和即
如果名义利率为,分期计息,则实际利率为
参见原讲义关于连续复利收益率的定义。
例子数据:苹果公司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%。
此处有一个年化收益率计算的公式,当单期利率较大时此公式误差较大。
1.1.2 连续复利收益率
另一个公式,公式不好记忆直接上例子吧
例如,初始资产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%, 实际年利率为11.05%。
所以连续复利比简单复利的公式简单, 用加法代替了乘法。
例(加倍法则):
如果将资金投入一个以每年计息一次, 复利利率为多少, 多少年后资金变成原来的两倍?
解答:
当复利利率=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 |
1.1.3 现值分析
本金的偿还额越到后期越多, 而还款前期主要支付的是利息。
1.1.3.2 回报率
如果现金流不满足的条件, 则函数不在是单调函数, 不一定有唯一解, 即使有唯一解也不能确定解左边和右边的回报性质。
R函数uniroot()
可以用来求解一元连续函数的单个根。 例如, 投资100元, 分5年的回报分别为 20,22,25,30,40
元。 求解其回报率的程序为:
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"
”说明在初始区间两个端点函数值同号时, 允许按照减函数向外扩大搜索区间。 结果为。
1.1.4 资产组合收益率
2.1.5 红利支付与收益率
2.1.6 超额收益率
超额收益率被认为是如下的套利投资组合的盈利: 对该资产持有多头头寸, 对参照资产持有空头头寸, 且初始净投资额为零。
多头金融头寸是指持有某资产。 空头头寸是指从持有某资产的投资者手里借入某资产, 然后卖出这些不属于自己的资产, 在随后的规定日期卖空者有义务通过买入相同数额的该资产偿还借出者, 不能偿还现金, 当规定日期时该资产价格下跌时空头持有者可以获利。 如果空头持有期间目标资产支付现金红利, 空头持有者有义务支付红利给借出者。
2.1.7 关系小结
简单收益率与连续复合收益率(对数收益率)的关系实例:
例: 若某项资产月对数收益率为4.46%, 则简单收益率为
exp(0.0446) - 1
## [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])))
with(d.ibm,
plot(date, log(1 + return), type="l", xlab="Date", ylab=expression(r[t])))
共有2515个观测。 简单收益率与对数收益率的相关系数:
with(d.ibm,
cor(return, log(1+return)))
## [1] 0.9997069
为0.9997。 当收益率绝对值较小时简单收益率与对数收益率近似相等。
上面将IBM股票数据读成了tibble数据框。 也可以转换成zoo类型时间序列,如
z.ibm <- zoo(as.matrix(d.ibm[,-1]), d.ibm[["date"]])
quantmod::chartSeries(z.ibm, type="line", theme="white",
xlab="Date", name="IBM Simple Return")
1.2 债券收益和价格
1.2.1 债券类型
有些债券不在中间派息,这样的债券称为零息债券。
1.2.2 当期收益率
没有考虑到期时票面价格与买入价格差值造成的收益。
2.2.3 到期收益率
对于零息债券, 持有期间没有任何利息收入。
如果持有期间有派息, 则到期收益率的计算很复杂,当每年派一次息时就是年化的到期收益率。
例如:
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")
图中画出了半年期到期利率为3%, 3.5%, 4%, 4.5%, 5%时的售价。 如果半年期到期利率为3%, 售价为97.29元。
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
仅迭代了两次就求得了精度有四位有效数字的结果。 注意, 牛顿法求根需要比较准确的初值, 如果初值取得太远, 牛顿法可能不收敛。
1.2.4 美国政府债券
1.2.4.1 短期国债
持有时间在1年及一年以下, 零息债券,购入时以低于面值购入。 常用期限:
- 28天(4周,一个月)
- 91天(13周,三个月)
- 182天(26周,半年)
- 364天(52周,一年)
其年化利率采用简便公式计算,
到期持有天数在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"))
两条曲线有较大差距, 这实际上是因为短期债券的售价太低导致利率过高引起的, 在正常利率范围内两者应该差距不大。
按标准公式计算的折现率为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
精确利率要高。 标准公式低估了利率。 因为短期国债并不能很容易地自动转存, 所以低估是有一定合理性的。
1.2.4.2 中期国债
在1年到10年内到期, 每6个月支付一次利息,面值1000元。 在二级市场上以面值的特殊百分数报价, 百分数的小数部分为单位, 比如报价95:08, 即报价。 10年期美国国债是报价频率最高、安全性最高的国债。
1.2.4.3 长期国债
30年期的国债, 每6个月付息一次。
R扩展包quantmod包含了金融数据建模的功能, 比如可以从雅虎、谷歌财经等公开数据源下载多个经济和金融事件序列数据。
library(quantmod)
TNX <- getSymbols("^TNX", auto.assign = FALSE) # CBOE 10年期国债数据
tail(TNX)
> tail(TNX)
TNX.Open TNX.High TNX.Low TNX.Close TNX.Volume TNX.Adjusted
2020-03-18 1.082 1.266 0.999 1.266 0 1.266
2020-03-19 1.137 1.225 1.007 1.119 0 1.119
2020-03-20 1.016 1.031 0.916 0.938 0 0.938
2020-03-22 NA NA NA NA NA NA
2020-03-23 0.715 0.879 0.715 0.764 0 0.764
2020-03-24 0.823 0.896 0.810 0.816 0 0.816
chartSeries(TNX, theme="white", TA=NULL, type="line") # 仅收盘价,不显示交易量
1.3 隐含波动率
- 股票期权(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_table2(tmp.s, col_types = NULL)
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"
)
1.4 收益率分布特性的探索性分析
1.4.1 苹果公司股票日数据
苹果公司日数据下载:
library(quantmod)
AAPL <- getSymbols("AAPL", src="yahoo", auto.assign=FALSE)
计算对数收益率:
logret.AAPL <- diff(log(AAPL$AAPL.Adjusted))*100 # 对数收益率
对数收益率时间序列2010-2020的曲线图:
chartSeries(
logret.AAPL, type="l", TA=NULL,
subset="2010/2020",
name="Apple Log Returns",
theme="white", major.ticks="years", minor.ticks=FALSE)
仅2019年的对数收益率曲线图:
chartSeries(
logret.AAPL, type="l", TA=NULL,
subset="2019/2019",
name="Apple Log Returns",
theme="white", major.ticks="months", minor.ticks=FALSE)
对数收益率的直方图:
x <- coredata(logret.AAPL)
hist(x, main="Apple Log Returns", xlab="", ylab="")
对数收益率的正态QQ图:
x <- coredata(logret.AAPL)
qqnorm(x, main="Apple Log Returns")
qqline(x, col="red")
从时间序列曲线图、直方图、正态QQ图都可以看出股票对数收益率有厚尾现象。
1.4.2 美国十年期国债日数据
美国十年期国债日对数收益率下载和计算:
TNX <- getSymbols("^TNX", src="yahoo", auto.assign=FALSE)
logret.TNX <- diff(log(TNX$TNX.Adjusted))*100 # 对数收益率
对数收益率时间序列2010-2020的曲线图:
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="")
对数收益率的正态QQ图:
x <- coredata(logret.TNX)
qqnorm(x, main="US 10 Year T Notes Log Returns")
qqline(x, col="red")
从时间序列曲线图、直方图、正态QQ图都可以看出股票对数收益率有厚尾现象。 比苹果股票收益率的厚尾性弱一些。
1.4.3 欧元对美元汇率日数据
下载欧元对美元汇率的日数据,一元时间序列:
DEXUSEU <- getSymbols("DEXUSEU", src="FRED", auto.assign=FALSE)
logret.DEXUSEU <- diff(log(DEXUSEU))*100 # 对数收益率
汇率价格的曲线图:
chartSeries(
DEXUSEU, type="l", TA=NULL,
subset="2010/2020",
name="Euro to USD Price",
theme="white", major.ticks="years", minor.ticks=FALSE)
对数收益率时间序列2010-2020的曲线图:
chartSeries(
logret.DEXUSEU, type="l", TA=NULL,
subset="2010/2020",
name="Euro to USD Log Returns",
theme="white", major.ticks="years", minor.ticks=FALSE)
对数收益率的直方图:
x <- coredata(logret.DEXUSEU)
hist(x, main="Euro to USD Log Returns", xlab="", ylab="")
对数收益率的正态QQ图:
x <- coredata(logret.DEXUSEU)
qqnorm(x, main="Euro to USD Log Returns")
qqline(x, col="red")
也呈现出厚尾性, 且右尾比左尾长。
1.5 收益率的分布特性
1.5.1 统计分布复习
1.5.1.1 联合分布和边缘分布
随机向量的概念。
1.5.1.2 分位数
分位数必存在但不一定唯一。
1.5.1.3 条件分布
1.5.1.4 矩
对于资产收益率, 方差和标准差是度量其不确定性的指标, 可用于资产风险管理和度量。
随机变量分布中一元正态分布完全由其期望和方差决定, 其它分布可能需要更多矩。
偏度(Skewness): 可以用来度量分布的对称性, 负偏度称为左偏, 反映左尾偏长的情况; 正偏度称为右偏, 反映右尾偏长的情况。
峰度(Kurtosis): 正态分布的超额分布等于0。 峰度大的分布有重尾或厚尾现象, 其分布密度在处趋于零速度较慢, 其样本具有较多的异常值(离群值,outliers)。
2.5.1.5 矩的估计和检验
- 样本均值
- 样本方差
- 样本偏度
- 样本超额峰度
fBasics
包中的basicStats()
函数可以计算各种基本的统计量。 收益率数据在大多数情况下表现得与独立同分布观测很接近, 所以尽管我们不能确保其独立同分布, 在实际统计分析时仍使用在独立同分布假设下的各种方法。
近似服从标准正态分布时, 利用t.test计算检验的值。
t.test(x)
结果:
> t.test(x)
One Sample t-test
data: x
t = 0.17011, df = 5117, p-value = 0.8649
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.01496534 0.01780928
sample estimates:
mean of x
0.00142197
Jarque和Bera(1987)提出了Jarque-Bera检验, 零假设是总体服从正态分布, 设观测为独立同分布样本, 统计量为
在零假设下JB统计量渐近服从分布。 计算右侧值。
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.
1.5.2 收益率分布研究例子
作为示例, 对苹果公司股票日收盘价的收益率数据进行简单分析。
取2011-2017数据子集,计算收盘价的对数收益率:
x <- coredata(diff(log(AAPL["2015/2020"]$AAPL.Adjusted)))[-1]
基本统计量:
> fBasics::basicStats(x)
x
nobs 1314.000000
NAs 0.000000
Minimum -0.137708
Maximum 0.113157
1. Quartile -0.006198
3. Quartile 0.009129
Mean 0.000686
Median 0.000810
Sum 0.901570
SE Mean 0.000488
LCL Mean -0.000272
UCL Mean 0.001644
Variance 0.000313
Stdev 0.017696
Skewness -0.486121
Kurtosis 8.352568
这里的Kurtosis是超额峰度。 有左偏,重尾。
直方图:
hist(x, nclass=30, main="Apple Log Returns")
作核密度估计图并叠加正态密度估计:
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."))
比正态密度明显重尾, 且左尾比右尾长。
均值为零的检验:
> t.test(x)
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:
4.983472e-05 1.528246e-03
sample estimates:
mean of x
0.0007890404
检验值为0.036,在0.05水平下显著, 可认为均值不为零,显著地大于零。
单独计算偏度,及其标准化:
> tmp <- fBasics::basicStats(x)["Skewness", 1]; tmp
[1] -0.486121
> tmp/sqrt(6/length(x))
[1] -7.193934
> tmp <- fBasics::basicStats(x)["Kurtosis", 1]; tmp
[1] 8.352568
> tmp/sqrt(24/length(x))
[1] 61.80336
标准化值的绝对值超过1.96, 在0.05水平下拒绝峰度等于零的假设。
正态性JB检验:
> fBasics::normalTest(x, method="jb")
Title:
Jarque - Bera Normalality Test
Test Results:
STATISTIC:
X-squared: 2245.9883
P VALUE:
Asymptotic p Value: < 2.2e-16
Description:
Wed Mar 25 14:09:30 2020 by user:
p值为小于万分之一的值, 在0.05水平下显著。
1.6 金融数据的图形
- 时间序列曲线图
- K线图
- 叠加均线等
- 直方图,核密度估计,参数密度估计
- QQ图
- ACF和PACF等
1.6.1 时间序列曲线图实例
带有7日均线的曲线图:
chartSeries(
AAPL, type="line",
subset="2020", TA="addSMA(7)",
theme="white", name="Apple Stock Price",
major.ticks="months", minor.ticks=FALSE)
用TA="..."
选项可以添加技术曲线。 详见quantmod::TA()
的文档。
1.6.2 K线图实例
用quantmod::chartSeries()
作图。
苹果公司2020年日收盘价的K线图,带有成交量:
chartSeries(
AAPL,
subset="2020",
theme="white", name="Apple Stock Price",
major.ticks="months", minor.ticks=FALSE)
当时间点比较多时,K线图画成了“火柴”形状,每一个K线单元用窄线画出。
仅画最后一个月:
chartSeries(
AAPL,
subset="2020-03",
theme="white", name="Apple Stock Price",
major.ticks="auto", minor.ticks=FALSE)
可见时间点比较少时,每个K线单元画成条形。
在K线图中, 条形两端纵坐标为开盘价和收盘价, 低开高收时为阳线, 高开低收时为阴线; 用单色显示时, 阳线显示成空心条形, 阴线显示成实心条形; 用红色和绿色显示时, 国内的习惯是红色阳线,绿色阴线, 而西方的习惯是绿色阳线,红色阴线。 如果最低、最高价不等于开盘价和收盘价, 则向下画短线或者向上画短线。 这样,每个K线单元都表示了OHLC四个值。
子集还可以指定成"from/to"
的格式。
1.6.3 密度估计
苹果公司2019年简单收益率的直方图:
simple.return <- function(x) diff(x)/lag(x, k=-1)
x <- coredata(simple.return(AAPL["2019"]$AAPL.Adjusted))
hist(x, main="Apple Stock 2019 Simple Return", xlab="")
作核密度估计图并叠加正态密度估计(重复前面例子):
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 2019 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."))
1.6.4 QQ图
qqnorm(x, main="Apple Stock 2019 Simple Return")
qqline(x, col="red")
呈现左右均重尾的分布。非正态。
1.6.5 散点图与回归直线
读入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)
indexClass(ibmsp) <- "yearmon"
> head(ibmsp)
ibm sp
Jan 1926 -0.010381 0.022472
Feb 1926 -0.024476 -0.043956
Mar 1926 -0.115591 -0.059113
Apr 1926 0.089783 0.022688
May 1926 0.036932 0.007679
Jun 1926 0.068493 0.043184
序列图:
chartSeries(
ibmsp[,"ibm"], type="lines",
theme="white", name="IBM returns",
major.ticks="years", minor.ticsk=FALSE)
chartSeries(
ibmsp[,"sp"], type="lines",
theme="white", name="S&P returns",
major.ticks="years", minor.ticsk=FALSE)
IBM收益率对标准普尔指数收益率的散点图:
d <- as.matrix(coredata(ibmsp))
plot(d[,"sp"], d[,"ibm"], pch=16, cex=0.2,
xlab="S&P", ylab="IBM")
计算相关系数:
d <- as.matrix(coredata(ibmsp))
cor.test(d[,"sp"], d[,"ibm"])
> 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))
> 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)
从回归方程推导市场模型(market model)。
1.7 金融数据常用分布
1.7.1 正态分布
早期研究中假设简单收益率独立同分布, 服从正态分布。 但是存在不一致的问题:
- 简单收益率一定大于等于,正态分布没有这样的限制;
- 多期毛收益率是单期毛收益率的乘积,不再服从正态分布;
- 收益率大多是厚尾分布,而正态分布超额峰度等于零。
1.7.2 对数正态分布
有些股票的简单收益率的分布表现与对数正态分布不符, 对数收益率分布表现与正态分布不符。 对数收益率一般也有厚尾性。
1.7.3 稳态分布
稳态分布是正态分布的推广, 在加法运算下保持稳态分布不变, 符合连续复合收益率的要求。 非正态的稳态分布可以实现厚尾性。 但是,非正态的稳态分布没有方差, 这又使得许多传统统计方法无法使用。 例子有柯西(Cauchy)分布,标准柯西分布密度为分布密度对称,数学期望和方差都不存在。
2.7.4 混合正态分布
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")
其中红色粗线为混合正态密度,绿色细线是标准正态密度。 从密度函数图形可以看出明显的重尾。 浅蓝色为标准柯西分布,重尾更为明显。
1.7.5 多元收益率的分布
金融中不关心一般的多元分布, 主要关心条件分布, 尤其是条件期望和条件方差。
例如, 从1926-01到2011-09的IBM和S&P的月度收益率构成多元数据, 估计其均值:
x <- as.data.frame(coredata(ibmsp))
> colMeans(x)
ibm sp
0.013818251 0.005916719
计算协方差阵和相关系数阵:
> cov(x)
ibm sp
ibm 0.005008351 0.002502326
sp 0.002502326 0.003056181
> cor(x)
ibm sp
ibm 1.0000000 0.6395979
sp 0.6395979 1.0000000
psych包的mardia()
函数进行推广的正态性偏度、峰度检验, 并作广义QQ图:
> psych::mardia(x)
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 = 1.7e-09
small sample skew = 47.03 with probability = 1.5e-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")
生成一、二阶矩相同的正态分布样本,作散点图:
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")
模拟数据分布集中得多。 注意两个图形比较时, 应采用相同的坐标范围。
参考文献
Tsay, Ruey S. 2013. 金融数据分析导论:基于R语言. 机械工业出版社.
Tsay, Ruey S. 2010. Analysis of Financial Time Series. 3rd Ed. John Wiley & Sons, Inc.
Tsay, Ruey S. 2014. Multivariate Time Series Analysis with R and Financial Applications. John Wiley & Sons, Inc.
吴喜之, and 刘苗. 2018. 应用时间序列分析——R软件陪同. 第二版. 机械工业出版社.
何书元. 2003. 应用时间序列分析. 北京大学出版社.
Lutkepohl, Helmut, and Markus Kratzig. 2004. Applied Time Series Econometrics. Cambridge University Press.
Cryer, Jonathan D., and Kung-Sik Chan. 2008. Time Series Analysis with Applications in R. 2nd Ed. Springer.
Christoffersen, Peter F. 2003. Elements of Financial Risk Management. Elsevier Science (USA).