mysql - 用R还是mysql计算时间段 yield ?

标签 mysql sql r

我正在尝试为数据集的每个唯一成员(在下面的示例中由 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 并不总是返回该月的最后一天。

不幸的是,数据不统一(公司/代码的数量随时间变化),因此使用简单的行偏移是行不通的。计算必须将 CodeDate 与所需的日期偏移相匹配。

我最初尝试使用 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/

相关文章:

php - 如何编写此 SQL 语句来获取广告并发布? (PHP/MySQL)

r - 将 NetCDF 文件中的时间维度单位从几个月更改为几个月

php - 在插入之前查询主值时跳过主键编号

php - 需要区分一个表的列和另一个表的其他列php

php - 连接 3 个表 mysql php

rbind 具有不同列名的数据框

python - 多项/条件 Logit 回归,为什么 StatsModel 在 mlogit 包示例上失败?

mysql存储过程(带2个插入)错误

mysql - 设计与表 A、表 B 或表 A​​ 和 B 相关的 SQL 表的最佳实践是什么?

sql - 如何使用 Join EXASol 删除