2015-07-21 74 views
1

我想计算一段时间内的返回色散。我使用的公式是等加权标准差(see here)的公式。我试图使用sd()apply()函数,但它不起作用。R中的返回色散计算

公式:

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 

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

我应该看什么函数,循环或其他技术?我不想亲自去做,因为公式可能适用于更大的数据集。

回答

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] 
+0

谢谢。这似乎是正确的做法。你忘了取平方根,但这并不重要。现在我得到的问题是,在你的例子中运行良好,你使用“data.table”“data.frame”类。我的课是“time.series”。所以我将它与“as.data.frame”函数一起转换为数据类。但是,第一列(日期所在)未被识别,或者我无法更改名称。所以我不能指定即时消息“融化”功能,并且我收到错误消息<错误:在数据中找不到id变量:dATE>。 – Sogomon

+0

@Sogomon查看如何转换为data.table的编辑。 –