1 votos

Replicando estrategia de momentum - Períodos de formación

Estoy tratando de replicar la estrategia de momentum del estudio de Jegadesh y Titman (1993) solo utilizando datos de los últimos 10 años. En este momento, estoy intentando calcular los rendimientos del período de formación. Pero creo que tengo algunos errores. Si continúo y luego formo los portfolios, clasificándolos, los 4 portfolios muestran los mismos rendimientos para cada clasificación del 1 al 10. Tengo la sensación de que mi error ya está aquí en los períodos de formación pero no lo entiendo. Tal vez alguien pueda ayudarme un poco. ¡Muchas gracias! (el data_subset es mi dato original con todas las variables incluidas)

formation_periods <- c(3, 6, 9, 12)

momentum_portfolios <- list()
for (formation_period in formation_periods) {

  subset <- data_subset %>% 
    select(PERMNO, Date, Returns, logreturns) %>% 
    arrange(PERMNO, Date)

  subset$sumlogret <- subset %>% 
    group_by(PERMNO) %>% 
    mutate(sumlogret = rollsum(logreturns, formation_period, align = "right", fill = NA)) %>% 
    ungroup() %>% 
    pull(sumlogret)

  subset <- subset %>% 
    rename(sumlogreturns = logreturns)

  subset$cumret <- exp(subset$sumlogreturns) - 1

  momentum_portfolios[[paste0("Formation_", formation_period)]] <- subset
}

aquí está mi siguiente código donde me di cuenta de que todos los períodos de formación tienen los mismos números en ellos.

  momentum_portfolio <- momentum_portfolios[[paste0("Formation_", formation_period)]]

  momentum_portfolio <- momentum_portfolio[!is.na(momentum_portfolio$cumret), ]

  momentum_portfolio$momr <- as.numeric(factor(momentum_portfolio$cumret, levels = unique(momentum_portfolio$cumret)))
  momentum_portfolio$momr <- cut(momentum_portfolio$cumret, breaks = quantile(momentum_portfolio$cumret, probs = seq(0, 1, by = 0.1)), labels = FALSE) 
  cat("Período de formación:", formation_period, "\n")
  cat("Examinar la distribución de cumret por momr:\n")
  print(tapply(momentum_portfolio$cumret, momentum_portfolio$momr, mean)) 
}
tail(momentum_portfolio)
```

0voto

lanrat Puntos 367

Puedes formar los grupos dentro del bucle principal, pero hazlo por cada Fecha:

portafolios_momento <- list()
for (periodo_formacion in periodos_formacion) { # periodo_formacion=6

  subconjunto <- subconjunto_de_datos %>% 
    select(PERMNO, Fecha, Retornos, logretornos) %>% 
    arrange(PERMNO, Fecha)

  subconjunto$sumlogretornos <- subconjunto %>% 
    group_by(PERMNO) %>% 
    mutate(sumlogret = rollsum(logretornos, periodo_formacion, align = "right", fill = NA)) %>% 
    ungroup() %>% 
    pull(sumlogret)

  subconjunto$cumret <- exp(subconjunto$sumlogretornos) - 1

  subconjunto <- subconjunto %>% dplyr::filter(!is.na(cumret))

  subconjunto <- subconjunto %>% 
    group_by(Fecha) %>% 
  mutate(momr = cut(cumret, 
                           quantile(cumret, seq(0,1,by=.1)), 
                           labels = F, 
                           include.lowest = TRUE))

  portafolios_momento[[paste0("Formacion_", periodo_formacion)]] <- subconjunto
}

Luego puedes calcular la media de cumret por Fecha y momr. Finalmente calcular estadísticas por periodo_formacion y momr.

stats = lapply(portafolios_momento, function(portafolio_momento){
tail(portafolio_momento)

sumres = portafolio_momento %>% group_by(Fecha, momr) %>% 
  summarise(MeanRet= mean(cumret))
sumres
})

lapply(stats, function(sumres){
  psych::describeBy(sumres$MeanRet,sumres$momr,T,fast=T)
  })

Y obtener por ejemplo (los datos son reales para una muestra de activos aleatorios):

$Formacion_3
     item group1 vars   n          mean         sd         min        max     range          se
X11     1      1    1 163 -0.1406651698 0.10433599 -0.54924523 0.02337787 0.5726231 0.008172225
X12     2      2    1 163 -0.0594150045 0.06424748 -0.31759419 0.05568860 0.3732828 0.005032251
X13     3      3    1 163 -0.0258877359 0.05774981 -0.22716365 0.09620802 0.3233717 0.004523314
X14     4      4    1 163 -0.0006506752 0.05501481 -0.18303160 0.12743288 0.3104645 0.004309093
X15     5      5    1 163  0.0233330867 0.05508793 -0.14573197 0.18195906 0.3276910 0.004314820
X16     6      6    1 163  0.0469287583 0.05746346 -0.13073737 0.25985134 0.3905887 0.004500885
X17     7      7    1 163  0.0711782424 0.06206042 -0.11635815 0.36741241 0.4837706 0.004860947
X18     8      8    1 163  0.1013354021 0.06794467 -0.09081408 0.47001651 0.5608306 0.005321837
X19     9      9    1 163  0.1481222105 0.09273639 -0.04511237 0.70092962 0.7460420 0.007263675
X110   10     10    1 163  0.3806737037 0.43766965  0.03286265 2.82848241 2.7956198 0.034280932

enter image description here

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X