楼主: deem
3489 5

[程序分享] 建立Fama-French 3 factor时间序列[R code] [推广有奖]

  • 2关注
  • 43粉丝

学科带头人

51%

还不是VIP/贵宾

-

威望
0
论坛币
7022 个
通用积分
1027.0870
学术水平
215 点
热心指数
237 点
信用等级
205 点
经验
71652 点
帖子
979
精华
0
在线时间
2998 小时
注册时间
2009-7-30
最后登录
2024-4-9

楼主
deem 学生认证  发表于 2017-8-16 04:21:16 |只看作者 |坛友微信交流群|倒序 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
参照姜国华对中国市场3因子的定义,建立了因子时间序列的数据。用到的数据全部来自国泰安,有:
    --TRD_Mnth
    --FS_Combas



主要是用dplyr包写的,概念上理解起来比较简单:

  1. ## Fama French size and bm factor return

  2. require(dplyr)
  3. require(reshape2)
  4. require(ggplot2)

  5. setwd("/Users/wang/Documents/Undergraduate/ps1")

  6. ## import dataset
  7. # monthly stock trading file
  8. msf1 <- data.table::fread("TRD_Mnth1.csv")   
  9. msf2 <- data.table::fread("TRD_Mnth2.csv")
  10. # banlance sheet
  11. bs <- data.table::fread("FS_Combas.csv")
  12. msf<-rbind(msf1, msf2)
  13. str(msf)

  14. ## alphanumeric transfomation
  15. mon_encode <- data.frame(mon_name=month.abb,
  16.                          mon=1:12,
  17.                          stringsAsFactors = F)

  18. msf <- msf %>%
  19.     filter(Markettype %in% c(1L,4L,16L)) %>%
  20.     mutate(yr = as.integer(substr(Trdmnt, 5,6)),  # year var
  21.            mon_name = substr(Trdmnt, 1,3), # month var
  22.            mcap = Msmvttl*1000   # market cap
  23.            ) %>%
  24.     select(Stkcd, yr, mon_name, ret=Mretwd, mcap)

  25. msf <- msf[complete.cases(msf),] %>%  # delete missing values
  26.     left_join(mon_encode) %>%
  27.     mutate(yr=yr+1900L*(yr>=90)+2000L*(yr<90)) %>%
  28.     select(Stkcd, yr, mon, ret, mcap)

  29. ## check if key var is unique
  30. if(nrow(msf)-nrow(distinct(msf, Stkcd, yr, mon))==0)
  31. message('No dupkey')

  32. ## merge b/s with mkt cap in DEC
  33. bs <- bs %>%
  34.     mutate(Accper = as.Date(Accper),
  35.            yr = as.integer(substr(Accper,1,4)),
  36.            mon = as.integer(substr(Accper,6,7))) %>%
  37.     # only select yearly consolidated statement
  38.     filter(Typrep == 'A', months(Accper, abbreviate=T) == '12') %>%
  39.     select(Stkcd, yr, mon, Accper, be = A003000000)
  40.    
  41. bs <- bs[complete.cases(bs),]
  42. if(nrow(bs)-nrow(distinct(bs, Stkcd, yr, mon))==0)
  43.     message('No dupkey')

  44. # book/market ratio
  45. bm <- msf %>%
  46.     inner_join(bs, by = c("Stkcd", "yr", "mon")) %>%
  47.     mutate(bm = be/mcap) %>%
  48.     select(Stkcd, yr, bm)

  49. ## merge size and BM factor with msf(monthly stock trading file)
  50. size <- msf %>% filter(mon == 4L) %>%
  51.     select(Stkcd, yr, size = mcap) # use mcap at Apr. 30

  52. ff <- msf %>% mutate(yr4bm = yr-1,
  53.                       yr4size = ifelse(mon<=4, yr-1, yr)) %>%
  54.     inner_join(bm, by=c("Stkcd"="Stkcd", "yr4bm"="yr")) %>%
  55.     inner_join(size, by=c("Stkcd"="Stkcd", "yr4size"="yr")) %>%
  56.     select(Stkcd, yr, mon, ret, bm, size)
  57.    
  58. ## each month, construct 2*3 ports based on size/bm
  59. ff <- ff %>%
  60.     group_by(yr, mon) %>%
  61.     mutate(size_rank = ntile(size, 2)) %>%
  62.     group_by(size_rank, add = T) %>%
  63.     mutate(
  64.         bm_rank = ifelse(
  65.             percent_rank(bm) < 0.3, 1,
  66.                   ifelse(percent_rank(bm) <0.7, 2, 3)
  67.                    )
  68.         )

  69. ## calculate equal weighted port ret
  70. port_ret <- ff %>%
  71.     group_by(yr, mon, size_rank, bm_rank) %>%
  72.     summarise(ret = mean(ret),
  73.               obs = n())
  74. # convert from long to wide to calculate ff factor
  75. port_ret_l <- melt(port_ret,
  76.                  id.vars = c("yr", "mon", "size_rank", "bm_rank"),
  77.                  measure.vars = "ret")
  78. port_ret_w <- dcast(port_ret_l, yr+mon ~ size_rank + bm_rank)
  79. names(port_ret_w)[3:8] <- paste0("p", names(port_ret_w)[3:8])

  80. ff <- port_ret_w %>%
  81.     mutate(smb=(p1_1+p1_2+p1_3-p2_1-p2_2-p2_3)/3,
  82.            hml=(p1_3+p2_3-p1_1-p2_1)/2) %>%
  83.     select(yr, mon, smb, hml) %>%
  84.     arrange(yr, mon)

  85. ## plot size and bm premium
  86. ff <- ff %>%
  87.     mutate(date = as.Date(paste(yr, mon, '01', sep='-'))) %>%
  88.     filter(date>=as.Date("2000-01-01")) %>%
  89.     select(date, smb, hml)

  90. ff <- melt(ff, id.vars = 'date',
  91.            variable.name = 'ff.factor',
  92.            value.name = 'ff.premium')

  93. ggplot(data=ff, aes(x=date, y=ff.premium, colour=ff.factor)) + geom_line()  
  94. ggsave("ffpremium.pdf")

  95. ## house cleaning
  96. rm(list=ls())
复制代码





二维码

扫码加我 拉你入群

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

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

关键词:FRENCH factor Facto fact 时间序列

沙发
鎏金铄石 学生认证  发表于 2017-8-16 11:23:00 |只看作者 |坛友微信交流群
这个相当是建立了规模和因子的市场月度的时序数列是吗?

使用道具

藤椅
deem 学生认证  发表于 2017-8-16 11:36:02 |只看作者 |坛友微信交流群
鎏金铄石 发表于 2017-8-16 11:23
这个相当是建立了规模和因子的市场月度的时序数列是吗?
是的   

使用道具

板凳
Cnstopit 发表于 2017-8-17 13:48:37 |只看作者 |坛友微信交流群
先马,慢慢看

使用道具

报纸
shawlin 学生认证  发表于 2019-5-16 10:46:11 |只看作者 |坛友微信交流群
谢谢分享,非常有用

使用道具

楼主大度

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 16:18