Home > database >  Is it possible to group by company when computing different technical indicators from the TTR packag
Is it possible to group by company when computing different technical indicators from the TTR packag

Time:06-08

I am trying to compute various technical indicators that will be used to predict the stock price movement of around 100 stocks. For example, I want to calculate the Average True Range (ATR) for each of the companies in my time series, which I am trying to do with the TTR package in R. However, the problem is that I can't figure out how to do it for each of the companies in my dataset. I have tried to use dplyr::group_by(company) which doesn't work.

data_ATR <- data_price %>%
  dplyr::group_by(company) %>%
  TTR::ATR(data_price[,c("PRICE HIGH", "PRICE LOW", "CLOSING PRICE")], n=14)

Any help would be greatly appreciated!

CodePudding user response:

We may use group_modify here

library(dplyr)
data_price %>%
  dplyr::group_by(company) %>%
  dplyr::group_modify(~ as.data.frame(TTR::ATR(.[,c("PRICE HIGH", 
     "PRICE LOW", "CLOSING PRICE")], n=14)))

Update

If there are NAs we may need to get the index of the first non-NA row among all the subset of columns

data_price %>%
  dplyr::group_by(company) %>%
  dplyr::group_modify(~ 
     {
      tmp <- .x[,c("PRICE HIGH", "PRICE LOW", "CLOSING PRICE")]
      i1 <- which(rowSums(!is.na(tmp)) == ncol(tmp))[1]
      tmp <- tmp[i1:nrow(tmp), ]
      
     
     as.data.frame(TTR::ATR(tmp], n=14))
     })

Using a reproducible example

library(TTR)
data(ttrc)
ttrc %>% 
 mutate(company = as.integer(gl(n(), 25, n()))) %>% 
 group_by(company) %>% 
 group_modify(~ as.data.frame(ATR(.[c("High", "Low", "Volume")], n = 14))) %>% 
ungroup
# A tibble: 5,550 × 5
   company       tr   atr trueHigh trueLow
     <int>    <dbl> <dbl>    <dbl>   <dbl>
 1       1      NA     NA       NA   NA   
 2       1 1870903.    NA  1870906    3.09
 3       1 3099503.    NA  3099506    3.08
 4       1 2274154.    NA  2274157    3.07
 5       1 2086755.    NA  2086758    3.08
 6       1 2166345.    NA  2166348    3.1 
 7       1 3441795.    NA  3441798    3.14
 8       1 7550745.    NA  7550748    3.2 
 9       1 4853309.    NA  4853312    3.22
10       1 5814822.    NA  5814825    3.28
# … with 5,540 more rows
  • Related