股票收益率的影响因素分析
背景介绍,什么因素会影响股票的收益率是一个重要的金融学问题,经典资本资产定价模型认为股票的预期收益率,仅由系统性风险(beta)决定,Fama-French三因素模型认为股票的预期收益率受到股票的市场风险beta、市值规模、账面市值比三个因素影响。事实上,影响股票收益率的因素是较多的。本作业提供了中国股票沪深300成分股2018年的数据,请利用R课程第三次课所学技术,分析股票收益率是否受beta、总市值ev(equity value)、市净率pb、换手率turn的影响以及影响方向、程度。
数据说明:
本数据包含沪深300成分股299只个股(为了降低缺失值带来处理上的困难,剔除了成都银行)和上证综指在2018.1.1~2018.11.30的日期datetime、证券简称sec_name、收盘价close(前复权)、总市值ev、市净率pb、换手率turn等变量。
1. 编写一个计算日度收益率的函数(函数名取为:compute_return)
提示:(1)函数的输入参数,可为收盘价序列;(2)使用for循环对不同日期进行处理;(3)要求计算对数收益率:时刻t的收盘价与时刻t-1的收盘价的比的对数即ret(t)=log(close[t]/close[t-1])
library(lubridate)
compute_return <- function(one.data) {
close = one.data$close
one.data$datetime = ymd(one.data$datetime)
n = length(close)
l = n - 1
date = one.data$datetime[1:l]
return(data.frame(date = date, return = log(close[2:n]/close[1:l])))
}
2. 计算所有代码所有日期的收益率
提示:(1)对所有代码采取for循环;(2)获取所有代码的命令可参考:all.code=sort(unique(alldata.new$code)) ; (3)提取某只股票代码的数据,可参考:
j=1;
code0=code300[j];
one.data=alldata[which(alldata$code==code0),];
code300 = unique(alldata$code)
return_data = data.frame()
for (j in 1:length(code300)){
code0=code300[j]
one.data=alldata[which(alldata$code==code0),]
return = compute_return(one.data)
return$code = code0
return_data = rbind(return_data,return)
}
head(return_data)
3. 计算每只股票的月度指标序列:
3.1 计算每只个股每个月的月度收益率 month.ret
## 月度收益率:等于月份内所有对数收益率的求和
month_return_data = data.frame()
library(tidyverse)
for (j in 1:length(code300)){
code0 = code300[j]
data = return_data %>% filter(code == code0)
data$month = month(data$date)
month_return = data %>% group_by(month) %>% summarise(return = mean(return))
month_return$code = code0
month_return_data = rbind(month_return_data,month_return)
}
head(month_return_data)
3.2 计算每只个股在每个月的beta值,beta值的定义为: 个股在某个月度内的日收益率数据 与上证综指的对应月份内的日度收益,进行单变量回归得到的系数项。
beta_datas = data.frame()
for (j in 1:length(code300)){
shangzhen = return_data %>% filter(code == "000001.SH")
names(shangzhen) = c("date","shangzhen")
code0 = code300[j]
data = return_data %>% filter(code == code0)
stock = merge(shangzhen,data)
stock$month = as.numeric(month(stock$date))
stock = data.frame(stock)
month = unique(stock$month)
betas = c()
for (i in 1:length(unique(stock$month))){
df = stock %>% filter(month == i )
beta = as.numeric(lm(return~shangzhen, data = df)$coefficients[2])
betas = c(betas,beta)
}
beta_data = data.frame(code=code0,month = month,beta = betas )
beta_datas = rbind(beta_datas,beta_data)
}
3.3 计算每只个股在每个月的平均市值、平均市净率、和总换手率
##平均市值 ma.ev= mean(mv,na.rm=T) ;
## 平均市净率 ma.pb=mean(pb, na.rm=T)
## 总换手率 sum.turn=sum(turn, na.rm=T)
alldata$datetime = ymd(alldata$datetime)
alldata$month = month(alldata$datetime)
alldata_result = data.frame()
for (j in 1:length(code300)){
code0 = code300[j]
one.data = alldata[which(alldata$code == code0),]
result = one.data %>% group_by(month) %>% summarise(ma.ev= mean(ev,na.rm = T),
ma.pb= mean(pb,na.rm = T),
sum.turn= sum(turn,na.rm = T))
result$code = code0
alldata_result = rbind(alldata_result, result)
}
3.4 将月度数据整理为一个数据框 month.var,每列依次为 code, month, month.ret, beta, ma.ev, ma.pb, sum.turn
month.var = left_join(month_return_data, beta_datas)
month.var = left_join(month.var, alldata_result)
4. 对上一步得到的数据month.var, 提取2018-11月的数据,并且进行多元回归分析。
提取在2018-11月的数据(剔除上证指数的数据),进行多元线性回归回归。其中月度收益率为被解释变量,beta, ma.ev的对数, ma.pb, sum.turn为解释变量;提取四个解释变量的回归系数和 调整的拟合优度,并保存下来。
month.var1 = month.var %>% filter(code != "000001.SH") %>% filter(month == 11)
month.var1$ma = log(month.var1$ma.ev)
lm.model <- lm(return ~ beta + ma + ma.pb + sum.turn, month.var1)
library(stargazer)
summary <- stargazer(lm.model, type = "text")
write.table(summary, file = "~/Desktop/result.txt")
5. 进行每个月份横截面上的回归。
重复上述过程,进行2018年以来11个月份每个月的回归(进行11次),并将结果生成一个数据框 results,依次包含列:month, beta1, beta2, beta3, beta4, adj.R2
beta1 = c()
beta2 = c()
beta3 = c()
beta4 = c()
adj.R2 = c()
month.var = month.var %>% filter(code != "000001.SH")
month.var$ma = log(month.var$ma.ev)
for (i in 1:11){
df = month.var %>% filter(month == i)
fit = lm(return ~ beta + ma + ma.pb + sum.turn, df)
s = summary(fit)
beta1 = c(beta1, s$coefficients[,1][2])
beta2 = c(beta2, s$coefficients[,1][3])
beta3 = c(beta3, s$coefficients[,1][4])
beta4 = c(beta4, s$coefficients[,1][5])
adj.R2 = c(adj.R2, s$adj.r.squared)
}
result = data.frame(month = paste("2018", 1:11, sep = "-"), beta1 = beta1, beta2 = beta2, beta3 = beta3, beta4 = beta4, adj.R2 = adj.R2)
result
6. 对results[,-1]使用apply函数,对每列求均值、及均值的t.test().将结果打印出来。并且作出股票收益率影响因素的分析结论。
提示:function(x) t.test(x)$statistic
t = function(x){
return(c(mean = mean(x), test = t.test(x)$statistic))
}
apply(result[,-1], 2, t)