我正在尝试为数据集的每个唯一成员(在下面的示例中由 Code
标识)计算不同时间段的返回(每月、每季度、每年等)。该数据集将包含大约 500 只股票 20 年期间的月度定价信息。数据示例如下:
Date Code Price Dividend
1 2005-01-31 xyz 1000.00 20.0
2 2005-01-31 abc 1.00 0.1
3 2005-02-28 xyz 1030.00 20.0
4 2005-02-28 abc 1.01 0.1
5 2005-03-31 xyz 1071.20 20.0
6 2005-03-31 abc 1.03 0.1
7 2005-04-30 xyz 1124.76 20.0
我是 R 的新手,但我认为有比循环遍历每个 Code
然后每个 Date
更有效的解决方案,如下所示:
uniqueDates <- unique(data$Date)
uniqueCodes <- unique(data$Code
for (date in uniqueDates) {
for (code in uniqueCodes) {
nextDate <- seq.Date(from=stock_data$Date[i], by="3 months",length.out=2)[2]
curPrice <- data$Price[data$Date == date]
futPrice <- data$Price[data$Date == nextDate]
data$ret[(data$Date == date) & (data$Code == code)] <- (futPrice/curPrice)-1
}
}
此方法本身存在一个问题,即 seq.Date
并不总是返回该月的最后一天。
不幸的是,数据不统一(公司/代码的数量随时间变化),因此使用简单的行偏移是行不通的。计算必须将 Code
和 Date
与所需的日期偏移相匹配。
我最初尝试使用 seq.Date
函数选择 future 的日期
data$ret = (data[(data$Date == (seq.Date(from = data$Date, by="3 month", length.out=2)[2])), "Price"] / data$Price) - 1
但这会产生错误,因为 seq.Date 需要一个条目。
> Error in seq.Date(from = stock_data$Date, by = "3 month", length.out =
> 2) : 'from' must be of length 1
我认为 R 很适合这种类型的计算,但也许不适合。由于所有数据都在 mysql 数据库中,我现在认为直接在数据库中执行此计算可能更快/更容易。
如有任何建议,我们将不胜感激。
最佳答案
加载数据:
tc='
Date Code Price Dividend
2005-01-31 xyz 1000.00 20.0
2005-01-31 abc 1.00 0.1
2005-02-28 xyz 1030.00 20.0
2005-02-28 abc 1.01 0.1
2005-03-31 xyz 1071.20 20.0
2005-03-31 abc 1.03 0.1
2005-04-30 xyz 1124.76 20.0'
df = read.table(text=tc,header=T)
df$Date=as.Date(df$Date,"%Y-%m-%d")
首先我会按日期组织数据:
library(plyr)
pp1=reshape(df,timevar='Code',idvar='Date',direction='wide')
然后你想获得月度、季度、年度等返回。 为此,有多种选择,其中一种可能是:
创建数据动物园或 xts 类。即
library(xts)
pp1[2:ncol(pp1)] = as.xts(pp1[2:ncol(pp1)],order.by=pp1$Date)
#let's create a function for calculating returns.
rets<-function(x,lag=1){
return(diff(log(x),lag))
}
由于这个数据库是月度的,所以返回的滞后是: 每月=1,每季度=3,每年=12。例如让我们计算月返回 对于 xyz。
lagged=1 #for monthly
计算 xyz 的月返回率
pp1$returns_xyz= c(NA,rets(pp1$Price.xyz,lagged))
获取所有的返回:
#create matrix of returns
pricelist= ls(pp1)[grep('Price',ls(pp1))]
returnsmatrix = data.frame(matrix(rep(0,(nrow(pp1)-1)*length(pricelist)),ncol=length(pricelist)))
j=1
for(i in pricelist){
n = which(names(pp1) == i)
returnsmatrix[,j] = rets(pp1[,n],1)
j=j+1
}
#column names
codename= gsub("Price.", "", pricelist, fixed = TRUE)
names(returnsmatrix)=paste('ret',codename,sep='.')
returnsmatrix
关于mysql - 用R还是mysql计算时间段 yield ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9015103/