Peter, Thanks for the response. I tired the following command: AVB[["AVB.Close"]] and I got: Error in AVB[["AVB.Close"]] : subscript out of bounds Are you assuming that AVB is a data frame? I do not think AVB is a data frame. Is there a way for me to check? Thanks, Bob On 8/9/2018 3:46 PM, Peter Langfelder wrote:> If I understand it correctly, the function getSymbols creates a > variable with the name being the stock symbol. Then use the function > get(symbol) to retrieve the value of the variable whose name is > contained in the character string `symbol'. Assign that to a variable > (e.g. AVB). You may also have to modify the names of the components > you retrieve from the list AVB. For that, you can use > AVB[["AVB.Close"]] instead of AVB$AVB.Close. You can them use > something like AVB[[paste0(symbol, ".Close"]] to generalize the > retrieval of list components. > > HTH, > > Peter > On Thu, Aug 9, 2018 at 12:40 PM rsherry8 <rsherry8 at comcast.net> wrote: >> >> I wrote the following function: >> >> # This method gets historical stock data for the stock Avalon Bay whose >> symbol is AVB. >> getReturns <- function(norm = FALSE) >> { >> library(quantmod) >> >> getSymbols("AVB", src = "yahoo", from = start, to = end) >> length = length( AVB$AVB.Close ) >> close = as.numeric( AVB$AVB.Close ) >> cat( "length = ", length(close ), "\n" ) >> for( i in 1:length-1 ) >> diff[i] = ((close[i+1] - close[i]) ) / close[i] >> u = mean(diff) >> stdDev = sd(diff) >> cat( "stdDev = ", stdDev, "\n" ) >> >> if ( norm == TRUE ) { >> diff = (diff - u) >> diff = diff / stdDev >> } >> return (diff) >> } >> >> I would like to generalize it to work for any stock by passing in the >> stock symbol. So the header for the >> function would be: >> >> getReturns <- function(symbol, norm = FALSE) >> >> Now how do I update this line: >> length = length( AVB$AVB.Close ) >> This statement will not work: >> length = length( symbol$AVB.Close ) >> because the name that holds the closing price is a function of the stock >> symbol. >> >> Thanks, >> Bob >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code.
Well, your function uses AVB$AVB.Close, so I assumed AVB is a list (a data frame can be thought of as a special list). What do you get when you type class(AVB)? Peter On Thu, Aug 9, 2018 at 2:24 PM rsherry8 <rsherry8 at comcast.net> wrote:> > Peter, > > Thanks for the response. I tired the following command: > AVB[["AVB.Close"]] > and I got: > Error in AVB[["AVB.Close"]] : subscript out of bounds > Are you assuming that AVB is a data frame? I do not think AVB is a data > frame. Is there a way > for me to check? > Thanks, > Bob > > On 8/9/2018 3:46 PM, Peter Langfelder wrote: > > If I understand it correctly, the function getSymbols creates a > > variable with the name being the stock symbol. Then use the function > > get(symbol) to retrieve the value of the variable whose name is > > contained in the character string `symbol'. Assign that to a variable > > (e.g. AVB). You may also have to modify the names of the components > > you retrieve from the list AVB. For that, you can use > > AVB[["AVB.Close"]] instead of AVB$AVB.Close. You can them use > > something like AVB[[paste0(symbol, ".Close"]] to generalize the > > retrieval of list components. > > > > HTH, > > > > Peter > > On Thu, Aug 9, 2018 at 12:40 PM rsherry8 <rsherry8 at comcast.net> wrote: > >> > >> I wrote the following function: > >> > >> # This method gets historical stock data for the stock Avalon Bay whose > >> symbol is AVB. > >> getReturns <- function(norm = FALSE) > >> { > >> library(quantmod) > >> > >> getSymbols("AVB", src = "yahoo", from = start, to = end) > >> length = length( AVB$AVB.Close ) > >> close = as.numeric( AVB$AVB.Close ) > >> cat( "length = ", length(close ), "\n" ) > >> for( i in 1:length-1 ) > >> diff[i] = ((close[i+1] - close[i]) ) / close[i] > >> u = mean(diff) > >> stdDev = sd(diff) > >> cat( "stdDev = ", stdDev, "\n" ) > >> > >> if ( norm == TRUE ) { > >> diff = (diff - u) > >> diff = diff / stdDev > >> } > >> return (diff) > >> } > >> > >> I would like to generalize it to work for any stock by passing in the > >> stock symbol. So the header for the > >> function would be: > >> > >> getReturns <- function(symbol, norm = FALSE) > >> > >> Now how do I update this line: > >> length = length( AVB$AVB.Close ) > >> This statement will not work: > >> length = length( symbol$AVB.Close ) > >> because the name that holds the closing price is a function of the stock > >> symbol. > >> > >> Thanks, > >> Bob > >> > >> ______________________________________________ > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > >> and provide commented, minimal, self-contained, reproducible code. >
Peter, Here is the R command and its output that you requested: > class(AVB) [1] "xts" "zoo" Bob On 8/9/2018 5:29 PM, Peter Langfelder wrote:> Well, your function uses AVB$AVB.Close, so I assumed AVB is a list (a > data frame can be thought of as a special list). What do you get when > you type class(AVB)? > > Peter > On Thu, Aug 9, 2018 at 2:24 PM rsherry8 <rsherry8 at comcast.net> wrote: >> Peter, >> >> Thanks for the response. I tired the following command: >> AVB[["AVB.Close"]] >> and I got: >> Error in AVB[["AVB.Close"]] : subscript out of bounds >> Are you assuming that AVB is a data frame? I do not think AVB is a data >> frame. Is there a way >> for me to check? >> Thanks, >> Bob >> >> On 8/9/2018 3:46 PM, Peter Langfelder wrote: >>> If I understand it correctly, the function getSymbols creates a >>> variable with the name being the stock symbol. Then use the function >>> get(symbol) to retrieve the value of the variable whose name is >>> contained in the character string `symbol'. Assign that to a variable >>> (e.g. AVB). You may also have to modify the names of the components >>> you retrieve from the list AVB. For that, you can use >>> AVB[["AVB.Close"]] instead of AVB$AVB.Close. You can them use >>> something like AVB[[paste0(symbol, ".Close"]] to generalize the >>> retrieval of list components. >>> >>> HTH, >>> >>> Peter >>> On Thu, Aug 9, 2018 at 12:40 PM rsherry8 <rsherry8 at comcast.net> wrote: >>>> I wrote the following function: >>>> >>>> # This method gets historical stock data for the stock Avalon Bay whose >>>> symbol is AVB. >>>> getReturns <- function(norm = FALSE) >>>> { >>>> library(quantmod) >>>> >>>> getSymbols("AVB", src = "yahoo", from = start, to = end) >>>> length = length( AVB$AVB.Close ) >>>> close = as.numeric( AVB$AVB.Close ) >>>> cat( "length = ", length(close ), "\n" ) >>>> for( i in 1:length-1 ) >>>> diff[i] = ((close[i+1] - close[i]) ) / close[i] >>>> u = mean(diff) >>>> stdDev = sd(diff) >>>> cat( "stdDev = ", stdDev, "\n" ) >>>> >>>> if ( norm == TRUE ) { >>>> diff = (diff - u) >>>> diff = diff / stdDev >>>> } >>>> return (diff) >>>> } >>>> >>>> I would like to generalize it to work for any stock by passing in the >>>> stock symbol. So the header for the >>>> function would be: >>>> >>>> getReturns <- function(symbol, norm = FALSE) >>>> >>>> Now how do I update this line: >>>> length = length( AVB$AVB.Close ) >>>> This statement will not work: >>>> length = length( symbol$AVB.Close ) >>>> because the name that holds the closing price is a function of the stock >>>> symbol. >>>> >>>> Thanks, >>>> Bob >>>> >>>> ______________________________________________ >>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code.
" I am thinking that there should be an R command to tell me about the structure of series" ?str ## perhaps also/instead ?summary Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Thu, Aug 9, 2018 at 2:29 PM, Peter Langfelder <peter.langfelder at gmail.com> wrote:> Well, your function uses AVB$AVB.Close, so I assumed AVB is a list (a > data frame can be thought of as a special list). What do you get when > you type class(AVB)? > > Peter > On Thu, Aug 9, 2018 at 2:24 PM rsherry8 <rsherry8 at comcast.net> wrote: > > > > Peter, > > > > Thanks for the response. I tired the following command: > > AVB[["AVB.Close"]] > > and I got: > > Error in AVB[["AVB.Close"]] : subscript out of bounds > > Are you assuming that AVB is a data frame? I do not think AVB is a data > > frame. Is there a way > > for me to check? > > Thanks, > > Bob > > > > On 8/9/2018 3:46 PM, Peter Langfelder wrote: > > > If I understand it correctly, the function getSymbols creates a > > > variable with the name being the stock symbol. Then use the function > > > get(symbol) to retrieve the value of the variable whose name is > > > contained in the character string `symbol'. Assign that to a variable > > > (e.g. AVB). You may also have to modify the names of the components > > > you retrieve from the list AVB. For that, you can use > > > AVB[["AVB.Close"]] instead of AVB$AVB.Close. You can them use > > > something like AVB[[paste0(symbol, ".Close"]] to generalize the > > > retrieval of list components. > > > > > > HTH, > > > > > > Peter > > > On Thu, Aug 9, 2018 at 12:40 PM rsherry8 <rsherry8 at comcast.net> wrote: > > >> > > >> I wrote the following function: > > >> > > >> # This method gets historical stock data for the stock Avalon Bay > whose > > >> symbol is AVB. > > >> getReturns <- function(norm = FALSE) > > >> { > > >> library(quantmod) > > >> > > >> getSymbols("AVB", src = "yahoo", from = start, to = end) > > >> length = length( AVB$AVB.Close ) > > >> close = as.numeric( AVB$AVB.Close ) > > >> cat( "length = ", length(close ), "\n" ) > > >> for( i in 1:length-1 ) > > >> diff[i] = ((close[i+1] - close[i]) ) / close[i] > > >> u = mean(diff) > > >> stdDev = sd(diff) > > >> cat( "stdDev = ", stdDev, "\n" ) > > >> > > >> if ( norm == TRUE ) { > > >> diff = (diff - u) > > >> diff = diff / stdDev > > >> } > > >> return (diff) > > >> } > > >> > > >> I would like to generalize it to work for any stock by passing in the > > >> stock symbol. So the header for the > > >> function would be: > > >> > > >> getReturns <- function(symbol, norm = FALSE) > > >> > > >> Now how do I update this line: > > >> length = length( AVB$AVB.Close ) > > >> This statement will not work: > > >> length = length( symbol$AVB.Close ) > > >> because the name that holds the closing price is a function of the > stock > > >> symbol. > > >> > > >> Thanks, > > >> Bob > > >> > > >> ______________________________________________ > > >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > >> https://stat.ethz.ch/mailman/listinfo/r-help > > >> PLEASE do read the posting guide http://www.R-project.org/ > posting-guide.html > > >> and provide commented, minimal, self-contained, reproducible code. > > > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/ > posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Peter was on the right track. getSymbols() allows you to specify that you want the value returned as an object instead of load()ed by setting auto.assign = FALSE. I've also made other changes to your function: - Use requireNamespace() so you don't alter the search() path - Use TTR::ROC() to calculate returns, instead of a loop - Use more meaningful names for the mean and standard deviation objects - Use isTRUE() to ensure 'norm' is 'TRUE' and not '1' or '"true"' or anything else that could be coerced to TRUE getReturns <- function(symbol, start = "2015-01-01", end = Sys.Date(), norm = FALSE) { stopifnot(requireNamespace("quantmod")) Data <- quantmod::getSymbols(symbol, src = "yahoo", from = start, to = end, auto.assign = FALSE) cat("length = ", NROW(Data), "\n") ret <- TTR::ROC(quantmod::Cl(Data), type = "discrete") mu <- mean(ret, na.rm = TRUE) sigma <- sd(ret, na.rm = TRUE) cat("stdDev = ", sigma, "\n") if (isTRUE(norm)) { ret <- (ret - mu) ret <- ret / sigma } return(ret) } x <- getReturns("IBM") length = 907 stdDev = 0.01245428 head(x) IBM.Close 2015-01-02 NA 2015-01-05 -0.015734932 2015-01-06 -0.021565971 2015-01-07 -0.006535554 2015-01-08 0.021734892 2015-01-09 0.004355530 On Thu, Aug 9, 2018 at 4:24 PM, rsherry8 <rsherry8 at comcast.net> wrote:> Peter, > > Thanks for the response. I tired the following command: > AVB[["AVB.Close"]] > and I got: > Error in AVB[["AVB.Close"]] : subscript out of bounds > Are you assuming that AVB is a data frame? I do not think AVB is a data > frame. Is there a way > for me to check? > Thanks, > Bob > > > On 8/9/2018 3:46 PM, Peter Langfelder wrote: >> >> If I understand it correctly, the function getSymbols creates a >> variable with the name being the stock symbol. Then use the function >> get(symbol) to retrieve the value of the variable whose name is >> contained in the character string `symbol'. Assign that to a variable >> (e.g. AVB). You may also have to modify the names of the components >> you retrieve from the list AVB. For that, you can use >> AVB[["AVB.Close"]] instead of AVB$AVB.Close. You can them use >> something like AVB[[paste0(symbol, ".Close"]] to generalize the >> retrieval of list components. >> >> HTH, >> >> Peter >> On Thu, Aug 9, 2018 at 12:40 PM rsherry8 <rsherry8 at comcast.net> wrote: >>> >>> >>> I wrote the following function: >>> >>> # This method gets historical stock data for the stock Avalon Bay whose >>> symbol is AVB. >>> getReturns <- function(norm = FALSE) >>> { >>> library(quantmod) >>> >>> getSymbols("AVB", src = "yahoo", from = start, to = end) >>> length = length( AVB$AVB.Close ) >>> close = as.numeric( AVB$AVB.Close ) >>> cat( "length = ", length(close ), "\n" ) >>> for( i in 1:length-1 ) >>> diff[i] = ((close[i+1] - close[i]) ) / close[i] >>> u = mean(diff) >>> stdDev = sd(diff) >>> cat( "stdDev = ", stdDev, "\n" ) >>> >>> if ( norm == TRUE ) { >>> diff = (diff - u) >>> diff = diff / stdDev >>> } >>> return (diff) >>> } >>> >>> I would like to generalize it to work for any stock by passing in the >>> stock symbol. So the header for the >>> function would be: >>> >>> getReturns <- function(symbol, norm = FALSE) >>> >>> Now how do I update this line: >>> length = length( AVB$AVB.Close ) >>> This statement will not work: >>> length = length( symbol$AVB.Close ) >>> because the name that holds the closing price is a function of the stock >>> symbol. >>> >>> Thanks, >>> Bob >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide >>> http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. > > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Joshua Ulrich | about.me/joshuaulrich FOSS Trading | www.fosstrading.com R/Finance 2018 | www.rinfinance.com