<br />
# 多个股票波动率计算; NOTE: 原书中的SAS程序运行需要几十分钟!在R中只需要几分钟。<br />
# (1)使用前面章节计算单只股票日收益率;第二章的程序,保存在SzRtn.csv和ShRtn.csv两个文件中<br />
# (2)计算所有股票的波动率:sma形式,5、10、20日<br />
# (3)计算上述形式下波动率全样本期的均值、最大值、最小值,并输出为数据集<br />
setwd(yourpath)<br />
sh.rtn <- read.csv("ShRtn.csv")<br />
sz.rtn <- read.csv("SzRtn.csv")<br />
rtn <- cbind(sh.rtn, sz.rtn)<br />
colnames(rtn) <- substr(colnames(rtn), 1, 7)<br />
<br />
##########################################################<br />
# (2)<br />
sma.5 <- apply(rtn, 2, <br />
function(x, width=5) {<br />
xx <- (x - mean(x, na.rm=T))^2<br />
sma(xx, n=width) <br />
})<br />
<br />
sma.10 <- apply(rtn, 2, <br />
function(x, width=10) {<br />
xx <- (x - mean(x, na.rm=T))^2<br />
sma(xx, n=width) <br />
})<br />
<br />
sma.20 <- apply(rtn, 2, <br />
function(x, width=20) {<br />
xx <- (x - mean(x, na.rm=T))^2<br />
sma(xx, n=width) <br />
})<br />
write.csv(sma.5, file="SMA5.csv", row.names=F)<br />
write.csv(sma.10, file="SMA10.csv", row.names=F)<br />
write.csv(sma.20, file="SMA20.csv", row.names=F)<br />
<br />
##########################################################<br />
# (3)<br />
sma5.stat <- apply(sma.5, 2, <br />
function(x) {<br />
if(!all(is.na(x)))<br />
c(mean(x, na.rm=T), max(x, na.rm=T), min(x, na.rm=T))<br />
else<br />
c(NA, NA, NA)<br />
})<br />
<br />
sma10.stat <- apply(sma.10, 2, <br />
function(x) {<br />
if(!all(is.na(x)))<br />
c(mean(x, na.rm=T), max(x, na.rm=T), min(x, na.rm=T))<br />
else<br />
c(NA, NA, NA)<br />
})<br />
<br />
sma20.stat <- apply(sma.20, 2, <br />
function(x) {<br />
if(!all(is.na(x)))<br />
c(mean(x, na.rm=T), max(x, na.rm=T), min(x, na.rm=T))<br />
else<br />
c(NA, NA, NA)<br />
})<br />
<br />
#####################################################<br />
# 写为一个函数<br />
fun <- function(dat, width=5){<br />
xx <- apply(dat, 2, function(x) (x-mean(x, na.rm=TRUE))^2)<br />
xx <- sma(xx, n=width)<br />
stat <- apply(xx, 2, function(x){<br />
if(all(is.na(x)))<br />
c(NA, NA, NA)<br />
else<br />
c(mean(x, na.rm=TRUE), max(x, na.rm=TRUE), min(x, na.rm=TRUE))<br />
})<br />
}<br />
# fun(rtn, 5)<br />
# fun(rtn, 10)<br />
# fun(rtn, 20)<br />
<br />
######################################################################<br />
# 5.3 等权重组合收益波动率<br />
# (1)挑选出1999年前上市的所有A股股票<br />
# (2)计算2000年日百分比收益<br />
# (3)随机抽取一个投资组合<br />
# (4)计算波动率<br />
<br />
ind <- as.Date(rownames(rtn)) < as.Date("2000-01-01")<br />
ind <- apply(rtn[ind, ], 2, function(x) all(is.na(x)))<br />
rtn.2k <- rtn[, !ind]<br />
ind <- (as.Date(rownames(rtn)) > as.Date("2000-01-01")) & (as.Date(rownames(rtn)) < as.Date("2001-01-01"))<br />
rtn.2k <- rtn.2k[ind, ] # rtn.2k中包含了2000年全年均有交易数据的全部A股股票,并保存这些股票在2000年全年的日收益率<br />
<br />
# 随机抽取20支股票<br />
rtn.smp <- rtn.2k[, sample(1:nrow(rtn.2k), 20)]<br />
rtn.tot <- apply(rtn.smp, 1, function(x) mean(x, na.rm=TRUE))<br />
rtn.xx <- (rtn.tot - mean(rtn.tot))^2<br />
sma(rtn.xx, 5)<br />
sma(rtn.xx, 10)<br />
sma(rtn.xx, 20)<br />
<br />
mat <- matrix(0, ncol=2, nrow=50)<br />
for(i in 1:50){<br />
rtn.smp <- rtn.2k[, sample(1:nrow(rtn.2k), i*2)]<br />
rtn.tot <- apply(rtn.smp, 1, function(x) mean(x, na.rm=TRUE))<br />
mat[i, ] <- c(i*2, sd(rtn.tot))<br />
}<br />
plot(ts(mat[,2], start=1, freq=1/2))<br />