Search code examples
rtidyquant

tq_mutate() and Volume indicators in R


I am using the tidyquant package in R to calculate indicators for every symbol in the SP500.

As a sample of code:

stocks_w_price_indicators<- stocks2 %>%
group_by(symbol)%>%
tq_mutate(select=close,mutate_fun=RSI) %>%
tq_mutate(select=c(high,low,close),mutate_fun=CLV)

This works for price-based indicators, but not indicators that include volume.

I get "Evaluation error: argument "volume" is missing, with no default."

stocks_w_price_indicators<- stocks2 %>%
group_by(symbol)%>%
tq_mutate(select=close,mutate_fun=RSI) %>%
tq_mutate(select=c(high,low,close,volume),mutate_fun=CMF)

How can I get indicators that include volume to calculate properly?


Solution

  • There are a few functions from the TTR package that cannot be used with tidyquant. Reason being they need 3 inputs like adjRatios or need an HLC object and a volume column like the CMF function. Normally you would solve this by using the tq_mutate_xy function but this one cannot handle the HCL needed for the CMF function. If you would use the OBV function from TTR that needs a price and a volume column and works fine with tq_mutate_xy.

    Now there are 2 options. One the CMF function needs to be adjusted to handle a (O)HLCV object. Or two, create your own function.

    The last option is the fastest. Since the internals of the CMF function call on the CLV function you could use the first code block you have and extend it with a normal dplyr::mutate call to calculate the cmf.

    # create function to calculate the chaikan money flow
    tq_cmf <- function(clv, volume, n = 20){
      runSum(clv * volume, n)/runSum(volume, n)
    }
    
    stocks_w_price_indicators <- stocks2 %>%
      group_by(symbol) %>%
      tq_mutate(select = close, mutate_fun = RSI) %>%
      tq_mutate(select = c(high, low, close), mutate_fun = CLV) %>%
      mutate(cmf = tq_cmf(clv, volume, 20))
    
    
    # A tibble: 5,452 x 11
    # Groups:   symbol [2]
       symbol date        open  high   low close   volume adjusted   rsi    clv   cmf
       <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl>  <dbl> <dbl>
     1 MSFT   2008-01-02  35.8  36.0  35    35.2 63004200     27.1    NA -0.542    NA
     2 MSFT   2008-01-03  35.2  35.7  34.9  35.4 49599600     27.2    NA  0.291    NA
     3 MSFT   2008-01-04  35.2  35.2  34.1  34.4 72090800     26.5    NA -0.477    NA
     4 MSFT   2008-01-07  34.5  34.8  34.2  34.6 80164300     26.6    NA  0.309    NA
     5 MSFT   2008-01-08  34.7  34.7  33.4  33.5 79148300     25.7    NA -0.924    NA
     6 MSFT   2008-01-09  33.4  34.5  33.3  34.4 74305500     26.5    NA  0.832    NA
     7 MSFT   2008-01-10  34.3  34.5  33.8  34.3 72446000     26.4    NA  0.528    NA
     8 MSFT   2008-01-11  34.1  34.2  33.7  33.9 55187900     26.1    NA -0.269    NA
     9 MSFT   2008-01-14  34.5  34.6  34.1  34.4 52792200     26.5    NA  0.265    NA
    10 MSFT   2008-01-15  34.0  34.4  34    34   61606200     26.2    NA -1        NA