【问题标题】:Return dispersion calculation in RR中的返回色散计算
【发布时间】:2015-07-21 13:16:25
【问题描述】:

我想计算很长一段时间内的回报离散度。我使用的公式是等权标准差的公式 (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 的时间序列。

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

【问题讨论】:

    标签: r return


    【解决方案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]
    

    【讨论】:

    • 谢谢。这似乎是正确的做法。您忘记取平方根 ,但这没什么大不了的。现在我得到的问题是,在你的例子中,你使用了“data.table”“data.frame”类。我的课是“time.series”。所以我用“as.data.frame”函数也将它转换为数据类。但是第一列(日期所在的位置)无法识别,或者我无法更改名称。所以我无法分配 im "melt" 函数,我收到错误消息 .
    • @Sogomon 查看如何转换为 data.table 的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多