全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
19012 4
2015-12-08
大家好,我在尝试构建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,真的好多不会,上网查,也看不懂什么意思。所以这里直接把我写的贴上来,希望得到大家的帮助。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-12-8 13:31:27
sortport[, 4:15] 改为as.matrix(sortport[, 4:15] )
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-8 18:17:56
万人往LVR 发表于 2015-12-8 13:31
sortport[, 4:15] 改为as.matrix(sortport[, 4:15] )
你好,按你说的改了,然后就是
There were 25 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: In matrix(value, n, p) : data length exceeds size of matrix
这种警告。
然后portrt是这个样子的:
> str(portrt)
'data.frame':        25 obs. of  0 variables

能麻烦你再帮我看看是什么问题嘛。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-12-8 22:38:38
名字没创意 发表于 2015-12-8 18:17
你好,按你说的改了,然后就是
There were 25 warnings (use warnings() to see them)
> warnings()
你找出来哪句出的警告
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-4-7 14:37:04
原来是都要使用as.matrix, 单行向量也必须声明,就可以相乘了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群