[R-SIG-Finance] checkBlotterUpdate fails on quantstrat

Joshua Ulrich josh.m.ulrich at gmail.com
Tue Jul 21 05:47:59 CEST 2015


On Mon, Jul 20, 2015 at 7:53 PM, Erol Biceroglu
<erol.biceroglu at alumni.utoronto.ca> wrote:
> Hello,
>
> I've been playing around with quanstrat and was looking forward to running
> *apply.paramset()* to optimize the strategy's parameters, only to find an
> empty set of results.
>
Empty set of results from what?  There isn't a call to apply.paramset
in your code.  If you are actually running apply.paramset, please
provide the output from sessionInfo().

> (Please note, my actual code follows after my message)
>
> After investigating, I found that *checkBlotterUpdate* fails with the
> message:
>
>> checkBlotterUpdate(tradeStrategy,tradeStrategy)
> [1] "portfolio P&L doesn't match sum of symbols P&L"
> [1] "portfolio P&L doesn't match account P&L"
> [1] FALSE
>
> Upon further investigation, I'm unable to run the following:
>> tradeStats(tradeStrategy)
> NULL
> Warning message:
> In tradeStats(tradeStrategy) : TotalNetProfit NA forSPY
>
> When I run this line (after executing everything), I find that the
> "strategy date" (the first date before the beginning of the time series) is
> duplicated, and in the 2nd instance, there are NAs in:
> -Pos.Value
> -Period.Unrealized.PL
> -Gross.Trading.PL
> -Net.Trading.PL
>
> I've tried to play around with it and unfortunately I can't figure out what
> would cause the duplicate, generate the NA.  Any thoughts or feedback would
> be greatly appreciated.  Thanks for your help.
>
You will likely get more help if you provide a _minimal_ reproducible
example (yours didn't run for me because I don't have IKTrading
installed).  It would also help to provide more detail about what
you've tried in order to solve your problem--"tried to play around
with it" doesn't help people know what you did.

The general advice I can give you is to individually run
applyIndicators, applySignals, and applyRules; and to check the
mktdata object after you run each function.

> Here's the code:
> ---------
> rm(list=ls())
> library(quantstrat)
> library(timeDate)
> library(stringr)
> library(IKTrading)
>
>
> Sys.setenv(TZ="UTC")
> startDate<-as.Date("1993-02-02", format="%Y-%m-%d")
> endDate<-as.Date("2015-07-17", format="%Y-%m-%d")
>
> getSymbols(Symbols = c("SPY", "^VIX")
>            ,src="yahoo"
>            , verbose=TRUE
>            , warnings=TRUE
>            , auto.assign=TRUE
>            , return.class = "xts"
>            , index.class = "Date"
>            ,from = startDate
>            , to = endDate
> )
>
> #set Financial instrument objects
> currency("USD")
> stock(primary_id = c("SPY", "VIX"),currency = "USD")
>
>
> #name
> tradeStrategy <-"SPYVIXStrategy"
>
> #Date, one day before prices
> strategyDate <- min(index(SPY)) - 1
>
>
> #rm.strat(tradeStrategy)
> #rm(mktdata)
>
> NumSh<-3
> VIXThreshold <- 20
> PctThreshold <- 0.75
>
> #init portfolio and account
> initPortf(name = tradeStrategy
>           , symbols = "SPY" #as defined in Financial instrument
>           , initDate = strategyDate)
>
> initAcct(name = tradeStrategy
>          ,portfolios = tradeStrategy
>          ,initDate = strategyDate
>          ,initEq = 10e6 #as.vector(first(SPY$SPY.Close))*NumSh
> )
>
>
>
> #order book, and strategy
> initOrders(portfolio = tradeStrategy
>            , initDate = strategyDate
> )
>
> #position limits
> addPosLimit(tradeStrategy, symbol = "SPY", strategyDate, maxpos = NumSh,
> longlevels = NumSh)
>
> strategy( tradeStrategy, store = TRUE)
>
>
>
> #define indicator function
> PctStrat <- function(x){
> data<-merge(
>   runPercentRank(x=ifelse(diff(x)<0,0,diff(x)),cumulative = FALSE
>   )
>   , ifelse(diff(x)<0,0,diff(x))
>   , x
> )
> names(data) <- c("Percentile", "PositiveDiffs","VIX.Close")
>
> data<-xts(x = sapply(data
>                      ,function(x){ifelse(is.na(x),0,x)}
>                     ), order.by = index(data)
>           )
>
> return(data)
> }
>
>
> #add indicator
> add.indicator(strategy = tradeStrategy
>   , name = "PctStrat"
> , arguments = list( x = quote(VIX$VIX.Close))
>   , label = "VIXPct"
> )
>
>
> # >=75th percentile move
> add.signal(strategy = tradeStrategy
>            , name = "sigThreshold"
>            , arguments = list(column = c("Percentile.VIXPct")
>                               , threshold = quote(PctThreshold) #0.75
>                               , relationship = "gte"
>                               , cross = FALSE
>            )
>            , label = "Pct.gte.3Qt"
> )
>
> #<75th percentile move
> add.signal(strategy = tradeStrategy
>            , name = "sigThreshold"
>            , arguments = list(column = c("Percentile.VIXPct")
>                               , threshold = quote(PctThreshold) #0.75
>                               , relationship = "lt"
>                               , cross = FALSE
>            )
>            , label = "Pct.lt.3Qt"
> )
>
> #>VIX 20
> add.signal(strategy = tradeStrategy
>            , name = "sigThreshold"
>            , arguments = list(column = c("VIX.Close.VIXPct")
>                               , threshold = quote(VIXThreshold) #20
>                               , relationship = "gt"
>                               , cross = FALSE
>            )
>            , label = "HighVolatility"
> )
>
>
> #<=VIX 20
> add.signal(strategy = tradeStrategy
>            , name = "sigThreshold"
>            , arguments = list(column = c("VIX.Close.VIXPct")
>                               , threshold = quote(VIXThreshold) #20
>                               , relationship = "lte"
>                               , cross = FALSE
>            )
>            , label = "LowVolatility"
> )
>
> #intersect signals
> add.signal(strategy = tradeStrategy
>            , name = "sigAND"
>            , arguments = list(columns = c("Pct.lt.3Qt", "LowVolatility"),
> cross = TRUE)
>            , label = "Pct.lt.3qt.LowVol"
> )
>
> add.signal(strategy = tradeStrategy
>            , name = "sigAND"
>            , arguments = list(columns = c("Pct.lt.3Qt", "HighVolatility"),
> cross = FALSE)
>            , label = "Pct.lt.3qt.HighVol"
> )
>
> add.signal(strategy = tradeStrategy
>            , name = "sigAND"
>            , arguments = list(columns = c("Pct.gte.3Qt", "HighVolatility"),
> cross = FALSE)
>            , label = "Pct.gte.3qt.HighVol"
> )
>
> add.signal(strategy = tradeStrategy
>            , name = "sigAND"
>            , arguments = list(columns = c("Pct.gte.3Qt", "LowVolatility"),
> cross = TRUE)
>            , label = "Pct.gte.3qt.LowVol"
> )
>
> #rules
> add.rule(strategy = tradeStrategy
>          , name = "ruleSignal"
>          , arguments = list(sigcol="Pct.lt.3qt.LowVol"
>                             , sigval=TRUE
>                             , orderqty=NumSh
>                             , ordertype="market"
>                             , orderside=NULL#"long"
>                             , osFUN = "osMaxPos"
>          )
>          , type = "enter"
> )
>
> add.rule(strategy = tradeStrategy
>          , name = "ruleSignal"
>          , arguments = list(sigcol= "HighVolatility" #"Pct.lt.3qt.HighVol"
>                             , sigval=TRUE
>                             , orderqty="all"
>                             , ordertype="market"
>                             , orderside=NULL#"long"
>                             , osFUN = "osMaxPos"
>          )
>          , type = "exit"
> )
>
> add.rule(strategy = tradeStrategy
>          , name = "ruleSignal"
>          , arguments = list(sigcol="Pct.gte.3qt.LowVol"
>                             , sigval=TRUE
>                             , orderqty=1
>                             , ordertype="market"
>                             , orderside=NULL#"long"
>                             , osFUN = "osMaxPos"
>          )
>          , type = "exit"
> )
>
>
> applyStrategy(strategy = tradeStrategy
>               , portfolios = tradeStrategy
> )
>
> updatePortf(tradeStrategy)
> updateAcct(tradeStrategy)
> updateEndEq(tradeStrategy)
>
>
> ###From Guy Yollin's Slides
> checkBlotterUpdate <- function(port.st,account.st,verbose=TRUE)
> {
>   ok <- TRUE
>   p <- getPortfolio(port.st)
>   a <- getAccount(account.st)
>   syms <- names(p$symbols)
>   port.tot <- sum(sapply(syms,FUN = function(x) eval(parse(
>     text=paste("sum(p$symbols",x,"posPL.USD$Net.Trading.PL)",sep="$")))))
>   port.sum.tot <- sum(p$summary$Net.Trading.PL)
>   if( !isTRUE(all.equal(port.tot,port.sum.tot)) ) {
>     ok <- FALSE
>     if( verbose )
>       print("portfolio P&L doesn't match sum of symbols P&L")
>   }
>   initEq <- as.numeric(first(a$summary$End.Eq))
>   endEq <- as.numeric(last(a$summary$End.Eq))
>   if( !isTRUE(all.equal(port.tot,endEq-initEq)) ) {
>     ok <- FALSE
>     if( verbose )
>       print("portfolio P&L doesn't match account P&L")
>   }
>   if( sum(duplicated(index(p$summary))) ) {
>     ok <- FALSE
>     if( verbose )
>       print("duplicate timestamps in portfolio summary")
>   }
>   if( sum(duplicated(index(a$summary))) ) {
>     ok <- FALSE
>     if( verbose )
>       print("duplicate timestamps in account summary")
>   }
>   return(ok)
> }
> ###End Guy Yollin's code
>
> #This fails
> checkBlotterUpdate(tradeStrategy,tradeStrategy)
>
> chart.Posn(tradeStrategy
>          , Symbol = "SPY"
>          #, Dates = "1994::"
>          #, Dates = "2012::"
>          ,TA = "add_TA(VIX$VIX.Close)"
>
> )
>
> #Here's an error
> tradeStats(tradeStrategy)
>
> #Here's the source of the error, an NA on the 2nd line
> getPortfolio(tradeStrategy)$symbols$SPY$posPL[1:10]
>
> -------
> End code
>
>
> Erol Biceroglu
>
>
> *erol.biceroglu at alumni.utoronto.ca <erol.biceroglu at alumni.utoronto.ca>*
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> 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.



-- 
Joshua Ulrich  |  about.me/joshuaulrich
FOSS Trading  |  www.fosstrading.com



More information about the R-SIG-Finance mailing list