【发布时间】:2017-06-10 02:34:22
【问题描述】:
我有两个数据框。 data1由三栏组成,一栏是股票代码,如600287,一栏是其盈利公告日,如2015-09-07,第三栏是其公告盈利(每股收益)如0.8。这个数据框是随机排列的,它由不同的股票和不同的公告日组成,因为它涵盖了从 2014 年到 2016 年的时间。每只股票一年可以发布 4 次,我在这个数据框中有 2400 只股票。
code1 day1 announcement
600181 2015-09-08 0.9
data2 是股票每日表现数据。从 2014 年到 2015 年,它的每日收益率为 2500 只股票。所以它有超过 200 万行,这就是我寻找有效解决方案的原因。 data2 也有代码和日期。
code2 day2 return
600298 2016-08-09 0.03
我正在研究公司发布公告后的股价反应。基本上,例如,如果公司“A”在 2016 年 9 月 8 日宣布盈利,我必须知道股票“A”在未来 5 个交易日(包括 2015 年 9 月 8 日,如果是天)。每只股票的交易日都不同,但当且仅当这一天出现在data2 中时,它才是股票“A”的交易日。
这里的困难在于股票“A”在 2015-06-09 宣布,但这一天没有出现在股票“A”的data2(这可能是因为 2015-06-09 是周日在中国不是交易日)。我所做的是使用 difftime() 函数然后订购它,但这很慢!
我想得到的最终数据框是这样的(7列)
code announce-day d1 d2 d3 d4 d5
600287 2015-08-07 0.08 0.06 0.02 0.01 -0.02
(再次我想说,如果这一天是交易日,第 1 天可能是 2015-08-07。也可能是 2015-08-09。唯一的判断是它在 2015-08 之后首先出现在 data2 -07)
我已经解决这个问题很长时间了,但我无法解决它。 我举个简单的例子。
code1<-"600187"
day1<-as.Date("2016-10-09") ##stock 600187 announce on 2016-10-09
announcement<-0.8
data1<-data.frame(code1, day1,announcement)
code2<-c(rep("600187",10),"600234")
x<-as.Date("2016-07-08")
x<-seq(x,x+4,by=1)
y<-as.Date("2016-10-11")
y<-seq(y,y+4,by=1)
day2<-c(x,y,as.Date("2016-12-30"))
return<-"whatever"
data2<-data.frame(code2,day2,return)
在这种情况下,data1 只包含一只股票的一份公告。宣布日期是 2016-10-09,但出现在 data2 的第二天是 2016-10-11。
这是我的for循环代码,我仍然使用测试数据,因为我不知道如何上传整个数据。
require(snow)
code1<-c("600187","600111","600111")
day1<-as.Date(c("2016-10-09","2011-02-02","2011-09-09"))
announcement<-c(0.8,0.2,0.2)
data1<-data.frame(code1,day1,announcement,stringsAsFactors=FALSE)
code2<-c(rep("600187",10),"600234")
x<-as.Date("2016-07-08")
x<-seq(x,x+4,by=1)
y<-as.Date("2016-10-11")
y<-seq(y,y+4,by=1)
day2<-c(x,y,as.Date("2016-12-30"))
return<-seq(from = 0.01, by = 0.005, length.out = length(day2))
data2<-data.frame(code2,day2,return,stringsAsFactors=FALSE)
mtl<-function(ichunk,data2,data1){
stime<-data1$day1
cd<-data1$code1
k<-1
houxu<-data.frame(cd=NA,date=NA,l1=NA,l2=NA,l3=NA,l4=NA,l5=NA)
for(i in ichunk){
a<-subset(data2,code2==cd[i])
a<-transform(a,time=difftime(day2,stime[i],units="days"))
a<-subset(a,time>=0)
a<-subset(a,rank(time)%in%1:5)
a<-a[order(a$time),]
q<-c(cd[i],1,a$return) ##the 1 is used for date,
if(length(q)<7)
{ houxu[k,]<-NA} else {houxu[k,]<-q}
k<-k+1}
houxu[,2]<-stime[ichunk] ##the column of day
return(houxu)}
mutlinks<-function(cls,data2,data1){
n<-nrow(data1)
options(warn=-1)
k<-ceiling(n/2)
ichunks<-list(1:k,(k+1):n)
options(warn=0)
df<-clusterApply(cl=cls,fun=mtl,ichunks,data2,data1)
do.call(rbind,df) }
cl<-makeCluster(type="SOCK",c("localhost","localhost"))
bxdf<-mutlinks(cl,data2,data1)
bxdf<-na.omit(bxdf)
这段代码需要 16 分钟,不会太长
【问题讨论】:
-
for-loop 在这里不起作用。我需要一个智能使用矢量化的解决方案
-
使用
data.table的滚动加入,无需任何for循环即可完成任务。 -
在您的一些 cmets 回答中,您提到您有一个使用
for循环的代码,它返回正确的结果。拜托,你能edit你的问题并添加你正在使用的完整代码吗?谢谢。 -
我已经发布了我的代码,仍然使用一些测试数据
标签: r