大家好,我在尝试构建fama french三因子的25个投资组合,第一次用R,以前也没什么编程基础,所有有很多问题,想和大家请假一下。
数据是从国泰安下的,我先下了2014年一年的数据试一下。
> str(trial_2014)
'data.frame': 2238 obs. of 15 variables:
$ Code : int 1 2 4 5 6 8 10 11 12 14 ...
$ F100802A : num 2.13e+12 4.87e+11 1.30e+09 3.06e+09 1.32e+10 ...
$ F101002A : num 1.006 1.032 0.225 0.417 0.802 ...
$ Mretnd : num 0.0969 0.1971 0.0526 0.1062 0.0852 ...
$ Mretnd.1 : num -0.05704 -0.07879 -0.00685 0.032 0.08048 ...
$ Mretnd.2 : num -0.01073 0.00658 0.29014 0.53101 0.09125 ...
$ Mretnd.3 : num 0.0878 0.024 0.1944 -0.0127 0.0717 ...
$ Mretnd.4 : num 0.12783 0.15957 0.00179 0.02564 0.1051 ...
$ Mretnd.5 : num 0.2733 0.2752 -0.3049 0.025 0.0158 ...
$ Mretnd.6 : num -0.1206 -0.0561 0.1143 NA -0.078 ...
$ Mretnd.7 : num 0.00431 -0.0282 0.07896 NA 0.01077 ...
$ Mretnd.8 : num 0.1258 0.0839 0.281 NA 0.3394 ...
$ Mretnd.9 : num 0.2834 0.0564 0.0563 NA 0.3273 ...
$ Mretnd.10: num -0.0826 -0.0171 0.3348 2.8585 0.3356 ...
$ Mretnd.11: num -0.0509 0.0118 0.1387 -0.4197 -0.1226 ...
其中code是证券代码, F100802A是市值,F101002A是账面市值比,后面的几列数据都是月收益率。
然后需要按照股票的市值和账面市值比排序,各分为五分,构建25个投资组合(value-weighted)。
我写的代码是这样的:
> sizeqt <-c(quantile(trial_2014$F100802A,probs = c(0,0.2,0.4,0.6,0.8,1)))
> bmqt <-c(quantile(trial_2014$F101002A,probs = c(0,0.2,0.4,0.6,0.8,1)))
#以上分别是市值和账面市值比的五分位数,下面排序构建投资组合的时候要用到。
> portrt <- data.frame(NULL) #25个portfolio的回报
> for(i in 1:5)
+ { for(j in 1:5)
+ {
+ sortport <- filter(trial_2014,trial_2014$F100802A > sizeqt & trial_2014$F100802A < sizeqt[i+1] & trial_2014$F101002A > bmqt[j] & trial_2014$F101002A < bmqt[j+1])
+ portrt[(i-1)*5+j,] <- 1/sum(sortport$F100802A)*t(sortport[,2]) %*% sortport[,4:15]
+ }
+ }
然后就报错了
Error in t(sortport[, 2]) %*% sortport[, 4:15] :
requires numeric/complex matrix/vector arguments
我上网查说报错是因为
Error Message "requires numeric/complex matrix/vector arguments" occur when you have factor or character variables in your data.但是我是市值加权求投资组合的收益率的时候,那几列数据都是数值型的啊,没有factor,character什么的。我在想这是因为我的数据里面有缺失值吗?还是为什么。
另外,第二个问题,我刚开始的时候循环里先没算组合的回报,只是按分位数把股票晒出来,但是最后显示出来的sortport只有最后一次挑选出来的股票(即,同时在市值第五分位和账面市值比第五分位的股票),没有25个投资组合。能不能让他把所有挑出来的25个组合的股票都显示出来,而不是只有最后一次循环的结果?
第一次用R,真的好多不会,上网查,也看不懂什么意思。所以这里直接把我写的贴上来,希望得到大家的帮助。