R

R,r,return,R,Return,我想计算一段长时间内的收益离散度。我使用的公式是相等加权标准偏差的公式()。我试图使用sd()和apply()函数,但没有成功 公式: r(i,t)是i=4的股票收益率(因此n=4)在时间(t) R(SMI,t)是时间(t) 这是我的索引 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

我想计算一段长时间内的收益离散度。我使用的公式是相等加权标准偏差的公式()。我试图使用
sd()
apply()
函数,但没有成功

公式:

r(i,t)是i=4的股票收益率(因此n=4)在时间(t)

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

这是我的索引

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的时间序列


我应该看什么函数、循环或其他技术?我不想手工操作,因为这个公式可能适用于更大的数据集。

我自己制作了样本数据,因为它更简单,但我认为这是您想要的。它使用data.table和Reforme2进行重载

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]
库(data.table)
图书馆(E2)
#伪造数据
种子集(100)

丽塔:谢谢。这似乎是正确的方法。你忘了取平方根,但这没什么大不了的。我现在遇到的问题是,在您的示例中,您使用了“data.table”“data.frame”类,该示例运行良好。我的课是“时间系列”。所以我用“as.data.frame”函数也将其转换为数据类。但是第一列(日期所在的位置)无法识别,或者我无法更改名称。因此,我无法分配im“melt”函数,并收到错误消息。@Sogomon有关如何转换为data.table的信息,请参阅编辑。
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]