我有以下简单的交易策略:
进场信号:当 IBM 的价格高于布林带上限时。
收盘信号:当 IBM 的价格低于布林带下限时。
以下是布林带:
require(quantmod)
# load IBM data
tickers = c("IBM")
myEnv = new.env()
getSymbols(tickers, from="2012-01-03", to="2014-12-01", env=myEnv)
close.prices = do.call(merge, eapply(myEnv, Cl))
close.prices = close.prices[,pmatch(tickers,colnames(close.prices))]
colnames(close.prices) = c("IBM")
# extract the upper and lower bollinger band with TTR's BBands function
bb.up = BBands(close.prices, n=20, maType = SMA)[,3]
bb.dn = BBands(close.prices, n=20, maType = SMA)[,1]
现在棘手的部分是仅当 IBM 的价格在重新分配日期低于布林带下限时才平仓。否则,我们将上一个周期的信号滚动到下一个周期。要完成每周重新分配:
# apply the startpoints function to pick the week's first trading day for
# re-allocating the portfolio
startpoints = function (x, on = "weeks", k = 1) {
head(endpoints(x, on, k) + 1, -1)
}
sig.bb.up = ifelse(close.prices > bb.up, 1, 0)
sig.bb.up = sig.bb.up[startpoints(bb.up),]
sig.bb.dn = ifelse(close.prices < bb.dn, 1, 0)
sig.bb.dn = sig.bb.dn[startpoints(bb.dn),]
现在的整个问题是如何定义一个正确编码的信号函数sig.bb,一旦价格在重新分配日期高于其上布林带,则包含“1”,然后持有股票直到价格低于其在随后的任何重新分配日期降低布林带。
我尝试的是捕捉第一个观察结果,然后根据 sig.bb 向量的第一个条目滚动所有以下观察结果
sig.bb = ifelse(index(close.prices[1,1]) == "2012-01-03", sig.bb.up,
ifelse(close.prices > bb.up, 1,
ifelse(close.prices < bb.dn, 0, lag(sig.bb))))
返回“NA”...
获得sig.bb后如何继续(对于那些对此主题感兴趣的人)可以在这里找到: 根据信号在特定日期对股票投资组合进行等权重分配