/Portfolios/Code/20_PredictorPorts.R

https://github.com/OpenSourceAP/CrossSection · R · 117 lines · 75 code · 26 blank · 16 comment · 10 complexity · 744392953910da84a64d4ac27fcfbbc8 MD5 · raw file

  1. # For baseline portfolio tests
  2. # Andrew Chen 2020 01
  3. # ==== ENVIRONMENT AND DATA ====
  4. crspinfo = read.fst(
  5. paste0(pathProject,'Portfolios/Data/Intermediate/crspminfo.fst')
  6. ) %>% # me, screens,
  7. setDT()
  8. crspret = read.fst(
  9. paste0(pathProject,'Portfolios/Data/Intermediate/crspmret.fst')
  10. ) %>% # returns
  11. setDT()
  12. ######################################################################
  13. ### SELECT SIGNALS AND CHECK FOR CSVS
  14. ######################################################################
  15. strategylist0 <- alldocumentation %>% filter(Cat.Signal == "Predictor")
  16. strategylist0 <- ifquickrun()
  17. csvlist = list.files(pathPredictors) %>% as_tibble() %>% rename(signalname=value) %>%
  18. mutate(
  19. signalname = substr(signalname,1,str_length(signalname)-4)
  20. , in_csv = 1
  21. )
  22. missing = strategylist0 %>% select(signalname) %>% left_join(csvlist) %>%
  23. filter(is.na(in_csv)) # note: CRSP predictors are put into pathPredictors by 11_CreateCRSPPredictors.R
  24. if (dim(missing)[1]>0){
  25. print('Warning: the following predictor signal csvs are missing:')
  26. print(missing$signalname)
  27. temp = readline('press enter to continue, type quit to quit: ')
  28. if (temp=='quit'){print('erroring out'); stop()}
  29. }
  30. #####################################################################
  31. ### BASE PORTS
  32. #####################################################################
  33. port <- loop_over_strategies(
  34. strategylist0
  35. )
  36. # feedback
  37. checkport(port)
  38. ## EXPORT
  39. writestandard(port, pathDataPortfolios, "PredictorPortsFull.csv")
  40. ### OUTPUT WIDE ###
  41. portlswide <- port %>%
  42. filter(port == "LS") %>%
  43. select(date, signalname, ret) %>%
  44. pivot_wider(names_from = signalname, values_from = ret) %>%
  45. arrange(date)
  46. writestandard(
  47. portlswide,
  48. pathDataPortfolios,
  49. "PredictorLSretWide.csv"
  50. )
  51. # SUMMARY STATS BY SIGNAL -------------------------------------------------
  52. # reread in case you want to edit the summary later
  53. port = read.csv(paste0(pathDataPortfolios, "PredictorPortsFull.csv"))
  54. sumbase <- sumportmonth(
  55. port,
  56. groupme = c("signalname", "port", "samptype"), Nstocksmin = 1
  57. ) %>%
  58. left_join(
  59. alldocumentation
  60. , by = "signalname"
  61. )
  62. sumshort = sumbase %>%
  63. filter(
  64. samptype == "insamp",
  65. port == "LS"
  66. ) %>%
  67. arrange(
  68. signalname
  69. ) %>%
  70. select(-signallag)
  71. ## export
  72. write_xlsx(
  73. list(
  74. short = sumshort
  75. , full = sumbase
  76. ),
  77. paste0(pathDataPortfolios, "PredictorSummary.xlsx")
  78. )
  79. # FEEDBACK ON ERRORS -------------------------------------------------
  80. print("The following ports are computed succesfully")
  81. print(
  82. sumbase %>% filter(port == "LS", samptype == "insamp") %>% arrange(tstat) %>% as.data.frame()
  83. )
  84. print("The following ports failed to compute")
  85. print(
  86. sumbase %>% filter(is.na(port)) %>% arrange(tstat) %>% as.data.frame() %>%
  87. select(signalname,port)
  88. )
  89. if (dim(sumbase %>% filter(is.na(port)))[1] == 0){
  90. print('20_PredictorPorts.R: all portfolios successfully computed')
  91. }