-1

次の簡単な取引戦略があります。

参入シグナル: 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を取得 した後の進め方 (このトピックに関心のある方向け) については、こちらを参照してください:シグナルによる特定の日付での株式ポートフォリオの均等加重再配分

4

1 に答える 1

4

出力をどうしたいか正確にはわかりませんが、これが近いかどうかを確認してください

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
na.locf(m)
于 2014-12-16T14:05:36.280 に答える