R中的返回色散计算

时间:2015-07-21 13:16:26

标签: r return

我想在很长一段时间内计算回波频散。我使用的公式是等加权标准差(see here)的公式。我尝试使用sd()apply()函数,但它不起作用。

公式:

r(i,t) are i=4 stock returns (so n=4) at time (t)

R(SMI,t)是时间(t)

的索引
                NOVARTIS R    NESTLE R       ROCHE    UBS GROUP
    2005-07-18  1.11200510 -0.14716706    -0.4210533 -0.28876340
    2005-07-19  0.23668650 -0.22115748    -0.3623192  0.67176884
    2005-07-20  0.07877117 -0.44378771     4.0313698 -0.47844392
    2005-07-21 -0.55270571 -0.37133351    -0.8754068  0.28604262
    2005-07-22 -0.23781224 -0.07443246     0.2926546  0.00000000
    2005-07-25  0.23781224  0.74184316     0.4082829 -0.09525666

这是我的索引

SMI
2005-07-18 -0.01077012
2005-07-19  0.53767147
2005-07-20 -0.02208674
2005-07-21 -0.10192245
2005-07-22  0.01653908
2005-07-25  0.03050783

现在我想计算每次(t)的RD,所以我得到所有RD的时间序列。

我应该看一下哪些函数,循环或其他技巧?我不想手工完成,因为公式可能适用于更大的数据集。

1 个答案:

答案 0 :(得分:1)

我制作了自己的样本数据,因为它更容易,但我认为这就是你所追求的。它使用data.table和reshape2进行繁重的工作。

library(data.table)
library(reshape2)

#make fake data
set.seed(100)
rit<-data.table(dATE=as.POSIXct('2005-07-18')+(60*60*24*0:5),
                stock1=runif(6,-1,1),
                stock2=runif(6,-1,1),
                stock3=runif(6,-1,1),
                stock4=runif(6,-1,1))

smi<-data.table(dATE=as.POSIXct('2005-07-18')+(60*60*24*0:5),smi=runif(6,-1,1))


#to convert from a matrix like object 
#(I can't quickly figure out how to pull POSIXct out of ts object
#so it's hard coded dates but will still work)

rit<-data.table(your_rit_object)
rit[,dATE=seq(from=as.POSIXct('2005-07-18'), to=as.POSIXct('2005-07-25'),by='days')

smi<-data.table(your_smi_object)
smi[,dATE=seq(from=as.POSIXct('2005-07-18'), to=as.POSIXct('2005-07-25'),by='days')

#melt table from wide to long
ritmelt<-melt(rit,id.vars="dATE")
#combine with smi table
ritmeltsmi<-merge(ritmelt,smi,by='dATE')
#implement formula
ritmeltsmi[,sqrt(sum((value-smi)^2))/.N,by=dATE]
#if you want to name the new column you could do this instead
#ritmeltsmi[,list(RD=sqrt(sum((value-smi)^2))/.N),by=dATE]