我面临以下简单的交易策略:
买入:当股票价格高于布林带上限时。
卖出:当股票价格低于布林带下限时。
持有:出现买入信号,因此我们持有股票,直到出现卖出信号的重新分配日。
我们只考虑使用 GSee 的起点功能的每周重新分配日期。
require(quantmod)
# load stock 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")
# now apply the simple trading strategy
m <- merge(close.prices, BBands(close.prices, n=20, maType="SMA"))
m$sig[with(m, IBM > up) & index(m) %in% index(m)[startpoints(m, on="weeks")]] <- 1
m$sig[with(m, IBM < dn) & index(m) %in% index(m)[startpoints(m, on="weeks")]] <- 0
m$sig[1] <- 0
m <- na.locf(m)
sig <- m$sig
到目前为止,一切都很好!现在,我有更多的价格系列想要从中提取信号:
tickers <- c("IBM","AAPL")
getSymbols(tickers, from="2012-01-01", to="2013-12-01")
close.prices <- do.call(merge, lapply(tickers, function(x) Cl(get(x))))
colnames(close.prices) <- c("IBM","APPLE")´
我想将上述交易策略应用于该资产组合,而不为每个单独的资产定义矩阵(此处为“m”)。我习惯于循环思考,但肯定有一种更优雅的方法可以避免循环。
结果应如下所示:
> sig[100:110]
IBM APPLE
2012-05-24 1 0
2012-05-25 1 0
2012-05-29 1 0
2012-05-30 1 0
2012-05-31 1 0
2012-06-01 1 0
2012-06-04 0 0
2012-06-05 0 0
2012-06-06 0 0