我有一个data.frame,其中每列包含自2014年以来各种股票的月收益,第一列包含观察日期。我需要访问特定日期(例如2018-01-31或2014-02-03和2018-01-01之间)的那些股票的收益,以便计算多个统计数据。数据集如下:
Date aer api ar ccj cve fcu
2014-02-20 0.1114229582 <NA> 0.0274509804 0.0458167331 -0.0684382963 0.245283019
2014-02-21 0.1486823856 <NA> 0.0364592781 0.0434139122 -0.0666423889 0.196261682
2014-02-24 0.1714285714 <NA> 0.0701561065 0.0552788845 -0.0488694384 0.284313725
2014-02-25 0.1584653878 <NA> 0.0585154416 0.1024531025 -0.0465631929 0.317307692
当我为特定日期范围内的收益计算协方差矩阵时,分配工作正常。但是,当我尝试在一个特定的日期执行相同的操作,以便将该行返回值乘以另一个向量时,得到NAs
library(timeSeries)
library(quantmod)
library(PerformanceAnalytics)
library(ggplot2)
library(caTools)
library(dplyr)
library(portfolio)
library(fBasics)
library(zoo)
data.returns$Date<-as.Date(data.returns$Date,format="%Y-%m-%d")
data.returns_m$Date<-as.Date(data.returns_m$Date,format="%Y-%m-
%d")
# defining monthly dates to compute returns
date_enddec17<-as.Date("2017-12-29")
date_endjan18<-as.Date("2018-01-31")
date_endfeb18<-as.Date("2018-02-28")
date_endmar18<-as.Date("2018-03-29")
date_endapr18<-as.Date("2018-04-30")
date_endmay18<-as.Date("2018-05-31")
date_endjun18<-as.Date("2018-06-29")
date_endjul18<-as.Date("2018-07-31")
date_endaug18<-as.Date("2018-08-31")
date_endsep18<-as.Date("2018-09-28")
date_endoct18<-as.Date("2018-10-31")
date_endnov18<-as.Date("2018-11-30")
date_enddic18<-as.Date("2018-12-31")
date_list <- c(date_enddec17, date_endjan18, date_endfeb18,
date_endmar18, date_endapr18, date_endmay18, date_endjun18,
date_endjul18, date_endaug18, date_endsep18,
date_endoct18, date_endnov18, date_enddic18)
# initialising the lists for the statistics
Covariance <- list()
W_gmv <- list()
ret_m <- list()
# for loop to calculate the statistics for each date
local <- 0
for (i in date_list) {
local <- local + 1
Covariance[[local]] <-
cov(na.omit(data.returns[data.returns$Date>=i-365*4 &
data.returns$Date<=i,2:ncol(data.returns)]))
W_gmv[[local]<- (solve(Covariance[[local]])%*%e)%*%solve(t(e)%*%solve(Covariance[[local]])%*%e)
ret_m[[local]] <- 1 + t(as.matrix(as.numeric(data.returns_m[data.returns_m$Date==i+30,-1]))) %*%W_gmv[[local]]
}
我希望获得一个包含13个数字的列表(ret_m),每个数字代表该特定日期的月收益,而我却得到了13个NA的列表。令人惊讶的是,协方差计算(循环中的第一个命令)并没有发生这种情况,它工作得很好。
答案 0 :(得分:0)
如果您只想每月获得回报,是否尝试过quantmod :: monthlyReturn()?
如果数据在数据框中,则可能需要先将其转换为xts对象。 timekt包有助于将数据帧转换为xts对象,或以其他方式转换。试试这个:
library(timekt)
my_xts <- timekt::tk_xts(my_dataframe)
quantmod::monthlyReturn(my_xts$ar)