Search code examples
rxtsquantmod

Quantmod: Create new column for multiple tickers in one time


I've my own csv file with a list of stocks that I use to download tickers data from yahoo.

For that purpose I use the following code(Correct):

library(quantmod)
Tickers <- read.csv("nasdaq_tickers_list.csv", stringsAsFactors = FALSE)
getSymbols(Tickers$Tickers,from="2018-01-01", src="yahoo" )

enter image description here

The result is that 55 tickers have been loaded correctly.

Now I'd like to make some calculations, I need to create a new column on each ticker with the substract of the (High Price - Open Price)

I need something like this, for example AABA ticker:

New column name= AABA.Range

AABA.Range =(AABA$AABA.High - AABA$AABA.Open)

How can I get this applied and get a new column for the 55 tickers?

I was able to create the new column one by one, but how to do it for all of them with one function?

Is that possible?

Thanks a lot for your help.


Solution

  • One of the problems you have is that all the stock information is in the global environment. So first we need to pull all of them into a giant list. Next I created a range function that returns the stock data plus the range column with the correct name.

    # Put all stocks in big list, by checking which xts objects are in the global environment.
    stock_data = sapply(.GlobalEnv, is.xts)
    all_stocks <- do.call(list, mget(names(stock_data)[stock_data]))
    
    # range function
    stock_range <- function(x) {
      stock_name <- stringi::stri_extract(names(x)[1], regex = "^[A-Z]+")
      stock_name <- paste0(stock_name, ".range")
      column_names <- c(names(x), stock_name)
      x$range <- quantmod::Hi(x) - quantmod::Lo(x)
      x <- setNames(x, column_names)
      return(x)
    }
    
    # calculate all ranges and add them to the data
    all_stocks <- lapply(all_stocks, stock_range)
    
    
    head(all_stocks$MSFT)
               MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted MSFT.range
    2007-01-03     29.91     30.25    29.40      29.86    76935100      22.67236   0.850000
    2007-01-04     29.70     29.97    29.44      29.81    45774500      22.63439   0.529998
    2007-01-05     29.63     29.75    29.45      29.64    44607200      22.50531   0.299999
    2007-01-08     29.65     30.10    29.53      29.93    50220200      22.72550   0.569999
    2007-01-09     30.00     30.18    29.73      29.96    44636600      22.74828   0.450000
    2007-01-10     29.80     29.89    29.43      29.66    55017400      22.52049   0.459999
    

    It might be better that when you load the data just run a lapply to get all the data in a list. That way the first step is not needed and you can use all the TTR functions with lapply (or Map)

    my_stock_data <- lapply(Tickers , getSymbols, auto.assign = FALSE)
    names(my_stock_data) <- Tickers