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