R语言 - 股票收益率的影响因素分析

股票收益率的影响因素分析

        背景介绍,什么因素会影响股票的收益率是一个重要的金融学问题,经典资本资产定价模型认为股票的预期收益率,仅由系统性风险(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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值