[R-SIG-Finance] Bug in tradeStats function?

Brian G. Peterson brian at braverock.com
Mon Nov 24 04:47:33 CET 2014


Yes, it looks like a bug.

One thing I've considered to simplify the code base would be to have 
'tradeStats' use the 'trades' generated by 'perTradeStats' as inputs to 
the calcs.

I'll take a closer look tomorrow.  Any further assistance will of course 
be appreciated, feel free to continue the analisis off-list (and we can 
ping the list once it is resolved).

Regards,

Brian


On 11/23/2014 05:14 PM, Nick White wrote:
> Hi all,
>
> Not sure if I've found a bug here, but I've had some issues with tradeStats
> in getting a correct number of trades (as opposed to number of
> transactions).
>
> For reproducibility, I'm using the "AMZN" demo from Rev 1317 -- latest code
> here:
> https://r-forge.r-project.org/scm/viewvc.php/pkg/blotter/demo/amzn_test.R?view=markup&revision=1317&root=blotter
> )
>
> So I set `Sys.setenv(TZ="UTC")` and then run the demo script.
>
> I then call:
>
>> getTxns("amzn_port","amzn")
>
>                      Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost
> Net.Txn.Realized.PL
> 2010-01-14 00:00:00       0      0.00        0         0         0.00
>              0
> 2010-01-14 15:18:50    -400    127.49        0    -50996       127.49
>          50996
> 2010-01-14 15:18:53     400    127.49        0     50996       127.49
>              0
> 2010-01-14 15:21:50    -300    127.26        0    -38178       127.26
>          38178
> 2010-01-14 15:21:53     300    127.26        0     38178       127.26
>              0
> 2010-01-14 15:23:07     100    127.17        0     12717       127.17
>         -12717
> 2010-01-14 15:23:10    -100    127.19        0    -12719       127.19
>              2
> 2010-01-14 15:37:56    -400    127.12        0    -50848       127.12
>          50848
> 2010-01-14 15:37:59     400    127.12        0     50848       127.12
>              0
> 2010-01-14 15:38:32    -500    127.23        0    -63615       127.23
>          63615
> 2010-01-14 15:38:35     500    127.23        0     63615       127.23
>              0
> 2010-01-14 15:38:37     300    127.27        0     38181       127.27
>         -38181
> 2010-01-14 15:38:40    -300    127.30        0    -38190       127.30
>              9
> 2010-01-14 15:46:08   -1300    126.95        0   -165035       126.95
>         165035
> 2010-01-14 15:46:11    1300    126.95        0    165035       126.95
>              0
>
> and we see 14 transactions comprising 7 flat-to-flat trades (though, of
> course, there is the portfolio initiation at midnight on the 14th, which
> brings it up to 15 entries)
>
> However, when I call
>
>     > t(tradeStats("amzn_port"))
>                     amzn
> Portfolio          "amzn_port"
> Symbol             "amzn"
> Num.Txns           "14"
> Num.Trades         "9"
> Net.Trading.PL     "11"
> Avg.Trade.PL       "35309.44"
> Med.Trade.PL       "38178"
> Largest.Winner     "165035"
> Largest.Loser      "-38181"
> Gross.Profits      "368683"
> Gross.Losses       "-50898"
> Std.Dev.Trade.PL   "59503.98"
> Percent.Positive   "77.77778"
> Percent.Negative   "22.22222"
> Profit.Factor      "7.243566"
> Avg.Win.Trade      "52669"
> Med.Win.Trade      "50848"
> Avg.Losing.Trade   "-25449"
> Med.Losing.Trade   "-25449"
> Avg.Daily.PL       "317785"
> Med.Daily.PL       "317785"
> Std.Dev.Daily.PL   NA
> Ann.Sharpe         NA
> Max.Drawdown       "-109.0012"
> Profit.To.Max.Draw "0.1009164"
> Avg.WinLoss.Ratio  "2.06959"
> Med.WinLoss.Ratio  "1.998035"
> Max.Equity         "102.0036"
> Min.Equity         "-37.00018"
> End.Equity         "11"
>
> Where we get the correct number of trades (14) , but the incorrect number
> of trades (9). This also stands contrary to `perTradeStats` which gets it
> 'right' with 7 line items (apols for formatting)
>
>> perTradeStats("amzn_port")
>                  Start                 End Init.Pos Max.Pos Num.Txns
> Max.Notional.Cost Net.Trading.PL       MAE      MFE Pct.Net.Trading.PL
>    Pct.MAE      Pct.MFE tick.Net.Trading.PL   tick.MAE  tick.MFE
> 1 2010-01-14 15:18:50 2010-01-14 15:18:53     -400    -400        2
>     -50996              0   0.00000 72.00098       0.0000000000
>   0.0000000000 0.0014118946                   0   0.000000 18.000244
> 2 2010-01-14 15:21:50 2010-01-14 15:21:53     -300    -300        2
>     -38178              0 -33.00082  0.00000       0.0000000000
> -0.0008643937 0.0000000000                   0 -11.000275  0.000000
> 3 2010-01-14 15:23:07 2010-01-14 15:23:10      100     100        2
>      12717              2   0.00000 12.94995       0.0001572698
>   0.0000000000 0.0010183181                   2   0.000000 12.949951
> 4 2010-01-14 15:37:56 2010-01-14 15:37:59     -400    -400        2
>     -50848              0 -32.04150  0.00000       0.0000000000
> -0.0006301429 0.0000000000                   0  -8.010376  0.000000
> 5 2010-01-14 15:38:32 2010-01-14 15:38:35     -500    -500        2
>     -63615              0   0.00000 45.00031       0.0000000000
>   0.0000000000 0.0007073851                   0   0.000000  9.000061
> 6 2010-01-14 15:38:37 2010-01-14 15:38:40      300     300        2
>      38181              9 -39.00018  9.00000       0.0002357193
> -0.0010214553 0.0002357193                   3 -13.000061  3.000000
> 7 2010-01-14 15:46:08 2010-01-14 15:46:11    -1300   -1300        2
>    -165035              0   0.00000 91.00357       0.0000000000
>   0.0000000000 0.0005514198                   0   0.000000  7.000275
>
>
> In my own data set of some fills from Friday I get the following (XYZ is
> the dummy ticker)
>
>> t(perTradeStats(b.strategy,"XYZ"))
>                      [,1]
> Start               "2014-11-21 14:30:01"
> End                 "2014-11-21 20:42:26"
> Init.Pos            "200"
> Max.Pos             "50263"
> Num.Txns            "95"
> ***SNIP***
>
>
> So `perTradeStats` has rightly calculated the position as being flat to
> flat with 95 transactions comprising one single trade starting at 14:30 and
> ending at 20:42 UTC....BUT tradeStats makes the error again
>
>
> Portfolio          "list_demo"
> Symbol             "XYZ"
> Num.Txns           "95"
> Num.Trades         "94"
>
> This is not the first time I've bumped up against this. In other examples
> for my own trades, I've found that tradeStats is sensitive to how you've
> indexed the data (for example, it doesn't seem to like it if you have some
> things as "Date" and others as "POSIXct". But in the above case, ensuring
> all indexes are classed the same way still produces the transactions /
> trades error.
>
> I think there might perhaps be something assumed in the `tradeDef` function
> that may need to be made more explicit depending on system options for time
> zone or index class...but thought I'd get some initial thoughts from the
> community before proceeding further to reconcile.
>
> Any ideas?
>
> n.
>
>> sessionInfo()
> R version 3.1.1 (2014-07-10)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
>
> locale:
> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
> States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C
>                    LC_TIME=English_United States.1252
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>
> other attached packages:
> [1] blotter_0.9.1637              PerformanceAnalytics_1.4.3541
> FinancialInstrument_1.1       quantmod_0.4-2                TTR_0.22-0.1
>                 xts_0.9-7                     zoo_1.7-12
>
> loaded via a namespace (and not attached):
> [1] grid_3.1.1          lattice_0.20-29     quantstrat_0.9.1632 tools_3.1.1
>
> 	[[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.
>


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



More information about the R-SIG-Finance mailing list