我试图将实际投资组合的表现与假设的随机投资组合的表现进行比较。
以下是我正在使用的数据集的示例。它显示了两个月的数据,投资组合中经理的姓名,以及这些经理的回报,分配和归因。
"date" "manager" "return" "allocation" "attribution"
2005-01-31 "manager01" -0.00763241754291056 0.146 6.94549996404861e-05
2005-01-31 "manager02" 0.0292205518315147 0.048 4.09087725641205e-05
2005-01-31 "manager03" -0.0354047394153526 0.049 -8.85118485383814e-05
2005-01-31 "manager04" 0.0424244772606645 0.124 -0.000148485670412326
2005-01-31 "manager05" -0.0574606103881735 0.134 0.000206858197397425
2005-01-31 "manager06" 0.0465278163188542 0.098 -0.000265208553017469
2005-01-31 "manager07" 0.157063203979822 0.142 -0.000219888485571751
2005-01-31 "manager08" -0.0594342759491509 0.071 2.97171379745754e-05
2005-01-31 "manager09" -0.0199466865109495 0.093 6.18347281839434e-05
2005-01-31 "manager10" 0.118839410130508 0.095 0.000190143056208813
2005-02-28 "manager01" 0.0403671815817711 0.119 -0.000460185870032191
2005-02-28 "manager02" 0.0246109773791459 0.064 -3.93775638066334e-05
2005-02-28 "manager03" 0.00868489880733732 0.065 -4.08190243944854e-05
2005-02-28 "manager04" -0.082332291530606 0.105 2.46996874591818e-05
2005-02-28 "manager05" -0.0903959999837099 0.114 -0.000117514799978823
2005-02-28 "manager06" 0.0514735666329574 0.081 -6.17682799595489e-05
2005-02-28 "manager07" -0.00914374153663751 0.164 -8.41224221370651e-05
2005-02-28 "manager08" -0.0367283709786134 0.083 -4.77468822721974e-05
2005-02-28 "manager09" -0.04752320926613 0.079 -3.8018567412904e-05
2005-02-28 "manager10" -0.0657464361573664 0.126 -0.000309008249939622
为了将数据导入R,将数据复制到剪贴板然后
mydata<-read.table("clipboard",header=TRUE)
为了创建随机投资组合,我使用ddply
和mutate
中的rlongonly
,plyr
和rportfolio
函数。
library(plyr)
library(rporfolio)
mydata.new<-ddply(mydata,.(date),mutate,new.attr=t(rlongonly(m=1,n=length(date),k=10,x.u=.15))*return)
在rlongonly
函数中:
归因只是返回*分配。
如果我有m = 1,一切都很好。 如果我的m> 1,则输出的尺寸不正确。
mydata.new2<-ddply(mydata,.(date),mutate,new.attr=t(rlongonly(m=2,n=length(date),k=10,x.u=.15))*return)
dim(mydata.new)
mydata.new2只有6列,应该有7列。 最后一列“new.attr”基本上是两列。
当我尝试melt
mydata.new2时,我收到以下错误。
library(reshape2)
drop<-names(mydata.new2) %in% c("manager","return","allocation")
melt(mydata.new2[!drop],id="date")
> Error in rbind(deparse.level, ...) :
> numbers of columns of arguments do not match
如何拆分“new.attr”列以便我可以融合和绘制数据?
答案 0 :(得分:1)
首先我重新生成你的数据,你必须使用dput(mydata)并在下次发布结果。
然后我生成你的mydata.new2向量。
library(plyr)
library(rportfolios)
mydata.new2<-ddply(mydata,
.(date),
mutate,
new.attr=t(rlongonly(m=2,n=length(date),k=10,x.u=.15))*return)
我舍入数值,我和我显示数据
mydata.new2[,-c(1,2)] <- numcolwise(round_any)(mydata.new2,0.0001)
head(mydata.new2)
date manager return allocation attribution new.attr.1 new.attr.2
1 2005-01-31 manager01 -0.0076 0.146 1e-04 -0.0009 -0.0007
2 2005-01-31 manager02 0.0292 0.048 0e+00 0.0032 0.0040
3 2005-01-31 manager03 -0.0354 0.049 -1e-04 -0.0024 -0.0049
4 2005-01-31 manager04 0.0424 0.124 -1e-04 0.0029 0.0025
5 2005-01-31 manager05 -0.0575 0.134 2e-04 -0.0047 -0.0042
6 2005-01-31 manager06 0.0465 0.098 -3e-04 0.0051 0.0039
如上所述,我有7列而不是6列。
我试图融化数据:
library(reshape2)
drop<-names(mydata.new2) %in% c("manager","return","allocation")
melt(mydata.new2[!drop],id="date")
但是你得到错误:
numbers of columns of arguments do not match
请注意mydata.new2 data.frame中的嵌套data.frame new.attr。这是因为使用了 mutate 。这里最好使用 transform ,因为您不需要迭代地进行转换。
所以:
mydata.new2<-ddply(mydata,
.(date),
transform,
new.attr=t(rlongonly(m=2,n=length(date),k=10,x.u=.15))*return)
你得到你的结果
head(melt(mydata.new2[!drop],id="date"))
date variable value
1 2005-01-31 attribution 6.945500e-05
2 2005-01-31 attribution 4.090877e-05
3 2005-01-31 attribution -8.851185e-05
4 2005-01-31 attribution -1.484857e-04
5 2005-01-31 attribution 2.068582e-04
6 2005-01-31 attribution -2.652086e-04