简单收益率的计算公式:
期间收益率=[(期末价格-期初价格)+其他收益-卖出交易成本]/(期初价格+买入交易成本)
我们以万科的股票数据(数据如上表所示)来用R语言实现一下:
1)不使用R语言的收益率计算函数
#载入金融量化分析程序包
library(quantmod)
library(PerformanceAnalytics)
#读取CSV文件里面的数据
stock<-read.csv("stockszA.csv")
#读取万科股票数据,(万科股票代码是000002,CSV文件中保存的格式是2)
Vanke<-stock[stock$Stkcd=="2",]
#获取万科股票收盘价数据
close<-Vanke$Clsprc
#查看这个对象的第一个或最后部分
head(close)
[1] 7.99 7.84 7.48 7.43 7.42 7.46
#转化成带日期的格式,即时间序列
close<-xts(close,order.by=as.Date(Vanke$Trddt))
#命名close向量的列名为closeprc
names(close)<-"closeprc"
#查看close数据的前7个
head(close,7)
closeprc2014-01-02 7.992014-01-03 7.842014-01-06 7.482014-01-07 7.432014-01-08 7.422014-01-09 7.462014-01-10 7.38
#将收盘价格滞后一期
lagclose<-lag(close,1)
#查看滞后后的lagclose数据
head(lagclose)
closeprc2014-01-02 NA2014-01-03 7.992014-01-06 7.842014-01-07 7.482014-01-08 7.432014-01-09 7.42
#将这两个收盘价格合并
Calclose<-merge(close,lagclose)
head(Calclose)
closeprc closeprc.12014-01-02 7.99 NA2014-01-03 7.84 7.992014-01-06 7.48 7.842014-01-07 7.43 7.482014-01-08 7.42 7.432014-01-09 7.46 7.42
#用传统的公式法计算简单收益率
simpleret<-(close-lagclose)/lagclose
将这个向量的列名命名为simpleret
names(simpleret)<-"simpleret"
head(simpleret)
simpleret2014-01-02 NA2014-01-03 -0.0187734672014-01-06 -0.0459183672014-01-07 -0.0066844922014-01-08 -0.0013458952014-01-09 0.005390836
#将这个计算的简单收益率与原来的两个收盘价合并
calret<-merge(Calclose,simpleret)
head(calret)
closeprc closeprc.1 simpleret2014-01-02 7.99 NA NA2014-01-03 7.84 7.99 -0.0187734672014-01-06 7.48 7.84 -0.0459183672014-01-07 7.43 7.48 -0.0066844922014-01-08 7.42 7.43 -0.0013458952014-01-09 7.46 7.42 0.005390836
#计算两期的简单收益率,需要将原来的收盘价滞后2期处理,其余相同
simpleret2<-(close-lag(close,2))/lag(close,2) names(simpleret2)<-"simpleret2" calret<-merge(calret,simpleret2) head(calret,7) closeprc closeprc.1 simpleret simpleret22014-01-02 7.99 NA NA NA2014-01-03 7.84 7.99 -0.018773467 NA2014-01-06 7.48 7.84 -0.045918367 -0.0638297872014-01-07 7.43 7.48 -0.006684492 -0.0522959182014-01-08 7.42 7.43 -0.001345895 -0.0080213902014-01-09 7.46 7.42 0.005390836 0.0040376852014-01-10 7.38 7.46 -0.010723861 -0.005390836
#查看1月9号的数据,就是第6行数据
calret[6,] closeprc closeprc.1 simpleret simpleret22014-01-09 7.46 7.42 0.005390836 0.004037685
2)使用R函数计算简单收益率
#使用PerformanceAnalytics软件包中的CalculateReturns函数
library(PerformanceAnalytics)
# CalculateReturns(close, method = "discrete")函数,close是要计算的向量,方法是discrete(简单收益率),相比于传统的公式方法大大提高了效率
CRSimpleret<-CalculateReturns(close, method = "discrete") names(CRSimpleret)<-"CRSimpleret"head(CRSimpleret,7) CRSimpleret2014-01-02 NA2014-01-03 -0.0187734672014-01-06 -0.0459183672014-01-07 -0.0066844922014-01-08 -0.0013458952014-01-09 0.0053908362014-01-10 -0.010723861
#使用quantmod软件包中的periodReturn函数
library(quantmod)
# periodReturn(close, period="daily",type="arithmetic")函数,close是要计算的股价数据,period是频率,可以选择daily、weekly、monthly、quarterly和yearly几种。Type对应的arithmetic是简单收益率
PRSimpleret<-periodReturn(close, period="daily",type="arithmetic")head(PRSimpleret,7) daily.returns2014-01-02 0.0000000002014-01-03 -0.0187734672014-01-06 -0.0459183672014-01-07 -0.0066844922014-01-08 -0.0013458952014-01-09 0.0053908362014-01-10 -0.010723861
#或者dailyReturn(close,type="arithmetic")
pdailyReturn<-dailyReturn (close,type="arithmetic")head(pdailyReturn,7) daily.returns2014-01-02 0.0000000002014-01-03 -0.0187734672014-01-06 -0.0459183672014-01-07 -0.0066844922014-01-08 -0.0013458952014-01-09 0.0053908362014-01-10 -0.010723861
#TTR包中的ROC函数也可以计算简单收益率
ROCSimpleret<- ROC(close,n=1,type="discrete") names(ROCSimpleret)<-"ROCSimpleret"head(ROCSimpleret,7) ROCSimpleret2014-01-02 NA2014-01-03 -0.0187734672014-01-06 -0.0459183672014-01-07 -0.0066844922014-01-08 -0.0013458952014-01-09 0.0053908362014-01-10 -0.010723861
#将几个计算结果合并一起,可以看结果是一样的
Simret<-merge(close,simpleret,CRSimpleret,PRSimpleret,ROCSimpleret) head(Simret,7)
closeprc simpleret CRSimpleret daily.returns ROCSimpleret
2014-01-02 7.99 NA NA 0.000000000 NA
2014-01-03 7.84 -0.018773467 -0.018773467 -0.018773467 -0.018773467
2014-01-06 7.48 -0.045918367 -0.045918367 -0.045918367 -0.045918367
2014-01-07 7.43 -0.006684492 -0.006684492 -0.006684492 -0.006684492
2014-01-08 7.42 -0.001345895 -0.001345895 -0.001345895 -0.001345895
2014-01-09 7.46 0.005390836 0.005390836 0.005390836 0.005390836
2014-01-10 7.38 -0.010723861 -0.010723861 -0.010723861 -0.010723861
#计算年化收益率
> Ansimpleret1<-annualReturn(simpleret[-1],scale=252,geometric = TRUE)> Ansimpleret1 yearly.returns
2014-12-31 -6.309810
2015-04-14 -1.174526
#累计的年化收益率
Ansimpleret<-Return.annualized(simpleret[-1],scale=252)> Ansimpleret
simpleret
Annualized Return 0.5886241
数据来源:量化投资以R语言为分析工具