[R-SIG-Finance] Bug in ruleOrderProc - txnfees is not a numeric?

Brian G. Peterson brian at braverock.com
Tue Jan 14 16:45:02 CET 2014


Ivan,

Thanks for the reproducible example.  We'll investigate.

Brian

On 01/14/2014 09:28 AM, Ivan Popivanov wrote:
> Hi Brian,
>
> return(as.numeric(res)) - same thing, I tried it before posting here.
> There is no problem if I use return(100*sign(orderqty)), which indicates
> the path dependency I was trying to imply. The problem doesn't seem to
> occur for long only positions - it gotta be switching. I believe, the
> problem is outside os.all.equity. Notice, it has a lot of debug output
> and it clearly indicates that the function returns, and returns a
> numeric before the problem is hit. For me it's easy to repro it
> (although it takes longer) with the attached script (it needs some
> adjustments). The problem is hit for 2001-04-08. I don't touch txnFees
> anywhere in my code, so I have no control over this behaviour - it needs
> to be type casted somewhere - from what you are saying - taking the type
> into account.
>
> Thanks for the comments about the testing.
>
> Can you point me to code which computes the portfolio size as you suggested?
>
>  From my experience, it's often needed to be able to show the strategy
> performance over years, with all the system on. That's an area quanstrat
> lacks - both in terms of examples and testing (I am pretty sure this is
> a regression since the last time I looked at it).
>
> Thanks,
> Ivan
>
>
>
>
> On Tue, Jan 14, 2014 at 9:26 AM, Brian G. Peterson <brian at braverock.com
> <mailto:brian at braverock.com>> wrote:
>
>     You don't actually include how you're calculating txnfees, and your
>     example is not reproducible, so I'm forced to guess.
>
>     try
>
>       return(as.numeric(res))
>
>     in your function.
>
>     As noted in the documentation, txnFees can be a string name of a
>     function, so forcing it to as.numeric is a really bad idea.
>
>     I'll also note that you don't need to call updatePortf every time.
>     That's extremely expensive by comparison to just adding up the
>     realized P&L (from closed transaction) and Unrealized P&L (from your
>     open position) yourself.  You should also be aware that this
>     approach (or yours) will only capture equity changes in a single
>     instrument (since instruments are processed one at a time).
>
>     Most literature on evaluating trading strategies (see e.g. Aronson
>     or Tomasini and Jaekle) tends to do system design on fixed trade
>     sizes because it is much easier to evaluate whether or not your
>     system really has any edge, or is just participating in market
>     drift.  I tend to separate the order sizing decisions till very late
>     in the strategy development process.
>
>     Regards,
>
>     Brian
>
>
>     On 01/13/2014 07:15 PM, Ivan Popivanov wrote:
>
>         It only happens when I use a custom function to compute the
>         position size,
>         but it won't happen with a constant size. So it may have
>         something to do
>         with the splitting of orders. My function uses all available equity
>         rounding up - it's at the end. I get the following error:
>
>         Error in `/.default`(TxnFees, abs(TxnQty)) :
>             non-numeric argument to binary operator
>
>         It seems that the fault is in ruleOrderProc, the caller of addTxn,
>         whereabouts txnfees is indeed an xts object. To me the fix is to
>         pass
>         as.numeric(txnfees) to addTxn.
>
>         Regards,
>         Ivan
>
>         PS: Is my osAllEquity a good way to implement the compounding
>         growth or is
>         there a better alternative? I think it's worth having an example to
>         illustrate this functionality.
>
>         osAllEquity = function(
>                 timestamp,
>                 orderqty,
>         portfolio.name <http://portfolio.name>,
>                 symbol,
>                 ...)
>         {
>              verbose = TRUE
>              # verbose = FALSE
>
>              if(verbose) cat("\n=====")
>              if(verbose) cat(paste( "\n", timestamp, sep=""))
>
>              if(verbose) cat(paste( "\n   orderqty=", orderqty, sep=""))
>              portfolio = updatePortf(Portfolio=portfoli__o.name
>         <http://portfolio.name>, Dates=paste('::',
>         as.Date(timestamp), sep=''))
>              # end.eq = getEndEq(portfolio.name <http://portfolio.name>,
>         as.Date(timestamp))
>              # print( end.eq )
>              pnl = sum(getPortfolio(portfolio.__name
>         <http://portfolio.name>)$summary$Net.Trading.PL
>         <http://Net.Trading.PL>)
>              end.eq = initEq + pnl
>              if(verbose) cat(paste( "\n   pnl=", pnl, sep=""))
>              if(verbose) cat(paste( "\n   equity=", end.eq, sep=""))
>              close.price = as.numeric(Cl(mktdata[__timestamp,]))
>              if(verbose) cat(paste("\n   close price=", close.price,
>         sep=""))
>              res = as.numeric( ceiling( end.eq / close.price ) ) * sign(
>         orderqty )
>              if(verbose) cat(paste("\n   qty=", res, sep=""))
>              if(verbose) cat("\n=====\n")
>              # return(sign(orderqty*1000))
>              # res = 1000*sign(orderqty)
>              return(res)
>         }
>
>                  [[alternative HTML version deleted]]
>
>         _________________________________________________
>         R-SIG-Finance at r-project.org <mailto:R-SIG-Finance at r-project.org>
>         mailing list
>         https://stat.ethz.ch/mailman/__listinfo/r-sig-finance
>         <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.
>
>
>     --
>     Brian G. Peterson
>     http://braverock.com/brian/
>     Ph: 773-459-4973 <tel:773-459-4973>
>     IM: bgpbraverock
>
>     _________________________________________________
>     R-SIG-Finance at r-project.org <mailto:R-SIG-Finance at r-project.org>
>     mailing list
>     https://stat.ethz.ch/mailman/__listinfo/r-sig-finance
>     <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.
>
>
>
>
> _______________________________________________
> 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.
>

-- 
Brian G. Peterson
http://braverock.com/brian/
Ph: 773-459-4973
IM: bgpbraverock



More information about the R-SIG-Finance mailing list