I opened a new question as the original post was already too long and the solution I have arrived at pretty much negates that post.
Below is the workaround I have found for adding indicators of a periodicity different to that of your data. The solution was built upon this post on the R-SIG-Finance mailing list by Brian Peterson.
There are two main issues with the code.
1) The strategy does not take any positions despite signals being generated (the appropriate columns exist in mktdata
after running the strategy)
2) Strangely, if indMerge()
does not explicitly rename the SMA column to "SPY.SMA"
and add.signal(columns = c("SPY.Close", SPY.SMA"))
is used then the following error is thrown (that is to say I cannot pass columns = c("Close", "SMA")
in add.signal
:
Warning message:
In match.names(columns, colnames(data)) :
all columns not located in Close SMA for SPY.Open SPY.High SPY.Low SPY.Close
SPY.Volume SPY.Adjusted SMA Cl.gt.SMA
As the only way I have found to get around this error is the code as it is below, the below solution is effectively useless in a portfolio with more than one symbol. Anyway, here's the code:
require(quantstrat)
require(quantmod)
require(FinancialInstrument)
symbols = "SPY"
initDate="2000-01-01"
from="2003-01-01"
to="2016-12-31"
options(width=70)
options("getSymbols.warning4.0"=FALSE)
#set account currency and system timezone
currency('USD')
stock("SPY",currency="USD",multiplier=1)
Sys.setenv(TZ="UTC")
#trade sizing and initial equity settings
tradeSize <- 1e6
initEq <- tradeSize*length(symbols)
#Brians code
#>> http://r.789695.n4.nabble.com/R-Quantstrat-package-question-td3772989.html
indMerge <- function(x, period, k, SMAlength, maType){
mktdata <- getSymbols(x, auto.assign = FALSE)
xW = to.period(mktdata, period = period, k = k, indexAt = "startof")
smaW = wSMA = SMA(Cl(xW), n = SMAlength, maType = maType)
x <- cbind(mktdata, smaW[paste(first(index(mktdata)) ,
last(index(mktdata)) , sep='/')])
colnames(x)[ncol(x)] = paste("SPY", ".", "SMA", sep = "")
x <- na.locf(x)
x
}
#get the data
getSymbols(symbols, from=from, to=to, src="yahoo", adjust=TRUE)
#apply the weekly SMA to the data without the use of add.indicator
SPY = indMerge(x = symbols, period = "weeks", k = 1, SMAlength = 14, maType = "SMA")
#set up the portfolio, account and strategy
strategy.st <- portfolio.st <- account.st <- "mtf.strat"
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD')
initAcct(account.st, portfolios=portfolio.st, initDate=initDate,
currency='USD',initEq=initEq)
initOrders(portfolio.st, initDate=initDate)
strategy(strategy.st, store=TRUE)
#add signals
add.signal(strategy.st, name = "sigComparison", arguments = list(columns =
c("SPY.Close", "SPY.SMA"), relationship = "gt"), label = "Cl.gt.SMA")
add.signal(strategy.st, name = "sigComparison", arguments = list(columns =
c("SPY.Close", "SPY.SMA"), relationship = "lt"), label = "Cl.lt.SMA")
#test = applySignals(strategy.st, mktdata = SPY)
#add.rules
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigCol = "Cl.gt.SMA",
sigval = 1, orderqty = 900, ordertype = "market", orderside = "long"),
type = "enter")
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigCol = "Cl.lt.SMA",
sigval = 1, orderqty = "all", ordertype = "market", orderside = "long"),
type = "exit")
strat = getStrategy(strategy.st)
summary(strat)
#apply the strategy and get the transactions
applyStrategy(strategy = strategy.st, portfolios = portfolio.st)
getTxns(Portfolio = portfolio.st, Symbol = "SPY")