[R] Trying to Generalize a Function in R

Joshua Ulrich jo@h@m@u|r|ch @end|ng |rom gm@||@com
Fri Aug 10 01:15:58 CEST 2018


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 using 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 using 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 using 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 using 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




More information about the R-help mailing list