Я открыл новый вопрос, поскольку исходный пост был уже слишком длинным, и решение, к которому я пришел в значительной степени отрицает этот пост.
Ниже приведен обходной путь, который я нашел для добавления индикаторов с периодичностью, отличной от периодичности ваших данных. Решение было основано на этом сообщении на сайте R-SIG. - Список рассылки по финансам Брайана Петерсона.
Есть две основные проблемы с кодом.
1) Стратегия не открывает никаких позиций, несмотря на генерируемые сигналы (соответствующие столбцы существуют в mktdata
после запуска стратегии)
2) Как ни странно, если indMerge()
явно не переименовывает столбец SMA в "SPY.SMA"
и используется add.signal(columns = c("SPY.Close", SPY.SMA"))
, возникает следующая ошибка (то есть я не могу передать columns = c("Close", "SMA")
в 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
Поскольку единственным найденным мной способом обойти эту ошибку является приведенный ниже код, приведенное ниже решение фактически бесполезно в портфеле с более чем одним символом. В любом случае, вот код:
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")