Raw backtest computations in R
This note – which originated from an answer on Stack Exchange/Quantitative Finance – discusses how raw signals can be translated into P/L or returns.
Raw P/L computation from a vector of signals in R can
be quite fast. As signal, I define a vector that is
1
if the portfolio is long, and 0
if it is not
invested. In different words, the signals define the
position; the changes in the signal define trades.
P <- c(100, 99, 104, 103, 105, 104) ## price series S <- c( 0, 1, 1, 0, 1, 0) ## position to be held dS <- c(0, diff(S)) ## change in position ==> trades (portfolio.value <- S*P - cumsum(dS*P))
Proportional Transactions costs are easy to add.
dSP <- dS*P ## with 10bp proportional fees (portfolio.value <- S*P - cumsum(dSP) - cumsum(abs(dSP)*0.001))
We have now stored all trades in the vector dS
. Here
is a sketch how you could handle the trades, using
package PMwR (which I maintain).
## trades library("PMwR") J <- journal(amount = dS, price = P, timestamp = seq_along(P)) J
pl(J)
pl
will give the total P/L. But you can easily split up
the trades.
trade <- dS != 0 trades <- split_trades(amount = dS[trade], price = P[trade], timestamp = seq_along(P)[trade]) trades
Call pl
for each single trade.
sapply(trades, function(x) pl(as.journal(x), pl.only = TRUE))