[R-SIG-Finance] Potential bug in quantstrat in how it handles "F" symbol
Sergey Pisarenko
drseergio at gmail.com
Thu Mar 1 18:47:11 CET 2012
Hi,
Just a follow-up. When I step through applyStrategy with a debugger
and I get to the lines:
for (symbol in symbols) {
if (isTRUE(load.mktdata))
mktdata <- get(symbol)
"get(symbol)" returns FALSE
"get(symbol, envir=.GlobalEnv)" returns market data for Ford.
/Sergey
On Thu, Mar 1, 2012 at 6:35 PM, Sergey Pisarenko <drseergio at gmail.com> wrote:
> Hi Brian and rex,
>
> Thank you for looking into this. This is strange because that's
> exactly what's happening. Here's how I load the data:
>
> watched <- c('F')
>
> symbols <- vector()
> for (symbol in watched) {
> ubars <- tryCatch(getSymbols(symbol, src='MySQL',
> auto.assign=FALSE), error=function(e) NULL)
> # skip if we don't have enough data
> if (is.null(ubars) || nrow(ubars) < startDay) next
> symbols <- c(symbols, symbol)
> bars <- ubars[index(ubars) >= as.Date(from)]
> assign(symbol, bars)
> }
>
> When I do:
>> F
>
> I get the data but "get" inside of applyStrategy still fails with an
> error. It fails with:
> Error in mktdata[, keep] : incorrect number of dimensions
>
> I attach a sample runnable script to this e-mail.
>
> --
> Kind Regards,
> Sergey Pisarenko.
>
> On Thu, Mar 1, 2012 at 3:04 PM, Brian G. Peterson <brian at braverock.com> wrote:
>> On Wed, 2012-02-29 at 23:53 -0800, rex wrote:
>>> Sergey Pisarenko <drseergio at gmail.com> [2012-02-29 22:29]:
>>> >
>>> >The issue here is that get('F') will return FALSE because F is defined
>>> >as FALSE in R. This will obviously cause a failure down the road where
>>> >market data is read and manipulated.
>>>
>>> Hello Sergey,
>>>
>>> Easy fix:
>>>
>>> > if (F == FALSE) print('F == FALSE')
>>> [1] "F == FALSE"
>>> > F <- 'F'
>>> > if (F == FALSE) print('F == FALSE')
>>> >
>>
>> According to the R FAQ[1]:
>> "In R, T and F are just variables being set to TRUE and FALSE,
>> respectively, but are not reserved words as in S and hence can be
>> overwritten by the user. (This helps e.g. when you have factors with
>> levels "T" or "F".) Hence, when writing code you should always use TRUE
>> and FALSE."
>>
>> I think you'll find that blotter, quantstrat, FinancialInstrument all
>> use TRUE and FALSE correctly.
>>
>> If you are trying to load data for Ford, you would already have locally
>> overwritten the F variable with your data for Ford.
>>
>>> require(quantmod, quietly=TRUE)
>>> getSymbols('F')
>> [1] "F"
>>> head(F)
>> F.Open F.High F.Low F.Close F.Volume F.Adjusted
>> 2007-01-03 7.56 7.67 7.44 7.51 78652200 7.48
>> 2007-01-04 7.56 7.72 7.43 7.70 63454900 7.67
>> 2007-01-05 7.72 7.75 7.57 7.62 40562100 7.59
>> 2007-01-08 7.63 7.75 7.62 7.73 48938500 7.70
>> 2007-01-09 7.75 7.86 7.73 7.79 56732200 7.76
>> 2007-01-10 7.79 7.79 7.67 7.73 42397100 7.70
>>> head(get('F'))
>> F.Open F.High F.Low F.Close F.Volume F.Adjusted
>> 2007-01-03 7.56 7.67 7.44 7.51 78652200 7.48
>> 2007-01-04 7.56 7.72 7.43 7.70 63454900 7.67
>> 2007-01-05 7.72 7.75 7.57 7.62 40562100 7.59
>> 2007-01-08 7.63 7.75 7.62 7.73 48938500 7.70
>> 2007-01-09 7.75 7.86 7.73 7.79 56732200 7.76
>> 2007-01-10 7.79 7.79 7.67 7.73 42397100 7.70
>>
>> so, get('F') will only return FALSE if you don't have any data loaded.
>>
>> That is a problem on your end, I think, and not a problem in the
>> package.
>>
>> Regards,
>>
>> - Brian
>>
>> Ref:
>> [1]
>> http://sites.stat.psu.edu/~dhunter/R/doc/manual/R-FAQ.html#What-are-the-differences-between-R-and-S_003f
>> (see section 3.3.3)
>>
>> --
>> Brian G. Peterson
>> http://braverock.com/brian/
>> Ph: 773-459-4973
>> IM: bgpbraverock
>>
>> _______________________________________________
>> R-SIG-Finance at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> -- Subscriber-posting only. If you want to post, subscribe first.
>> -- Also note that this is not the r-help list where general R questions should go.
More information about the R-SIG-Finance
mailing list