I tried this on stack exchange, but think it is a better question here. I am beginning user and I need help with an error / bad output I am getting when calculating returns (using ROC) on stock closing prices. I created a trading strategy using 1,0,-1 as signals, but can't return an accurate percentage for my returns. I know the code is incorrect, but unsure how to correct it. Any help is much appreciated!
sum(ROC(Cl(x)) * x$signal, na.rm=TRUE) # Return of fully invested account
This returns: -0.004259766 Where, based on my strategy, it actually should be: 0.101174
Calculating this using: (88.16-80.06) / 80.06
Date Closing Price Signal
2015-03-06: 80.06 1 # enter trade
2015-05-12: 88.16 -1 # exit trade
Hopefully that helps clarify my question. If not, please leave comments on how to improve it further.
Find sample code below:
getSymbols("CAT", src="google", from="2014-07-30", to="2015-07-29")
#######################################
######### BOLLINGER BANDS #############
#######################################
x <- na.omit(merge(CAT, BBands(Cl(CAT))))
x$sig <- NA
x$sig[c(FALSE, diff(sign(Cl(x) - x$mavg), na.pad=FALSE) != 0)] <- 0
x$sig[Cl(x) > x$up] <- -1 # short when Close is above up
x$sig[Cl(x) < x$dn] <- 1 # long when Close is below dn
x$sig[1] <- 0 # flat on the first day
x$sig[nrow(x)] <- 0 # flat on the last day
# Fill in the signal for other times
x$sig <- na.locf(x$sig)
x$sig <- Lag(x$sig)
x$sig[1] <- 0
#######################################
############ STOCHASTICS ##############
#######################################
y <- na.omit(merge(CAT, stoch(Cl(CAT))))
y$diff <- y$fastK - y$slowD
y$sig <- ifelse(y$diff >= -.1 & y$diff <= .1,1,0)
y$sig <- Lag(y$sig)
y$sig[1] <- 0
#######################################
############### MACD ##################
#######################################
z <- na.omit(merge(CAT, MACD(Cl(CAT))))
z$diff <- z$macd - z$signal
z$sig <- ifelse(z$diff >= -0.1 & z$diff <= 0.1,1,0)
z$sig <- Lag(z$sig)
z$sig[1] <- 0
#######################################
################ MERGE ################
#######################################
all <- merge(x$sig,y$sig,z$sig)
all[is.na(all)] <- 0
all <- cbind(all,rowSums(all))
all$..2 <- all$sig*all$sig.1*all$sig.2;
x$signal <- cbind(all$..2)
x$signal <- na.locf(x$signal)
x$signal <- Lag(x$signal)
x$signal[1] <- 1
#######################################
######## $$$ RETURNS $$$ ##############
#######################################
sum(abs(diff(x$signal, na.pad=FALSE))) # number of trades
sum(diff(Cl(x)) * x$signal, na.rm=TRUE) # PnL of 1 share
cumsum(diff(Cl(x), na.pad=FALSE) * x$signal[-1]) # equity over time
sum(ROC(Cl(x)) * x$signal, na.rm=TRUE) # Return of fully invested account
cumsum(ROC(Cl(x), na.pad=FALSE) * x$sig[-1]) # cumulative return
myReturn <- lag(x$signal) * dailyReturn(x)
charts.PerformanceSummary(cbind(dailyReturn(x),myReturn))