2013-08-20 17 views
1

我在回溯測試布林通道波段策略時遇到了困難。邏輯是,如果收盤值大於上限波段,並且在穿越平均值時關閉該位置。如果收盤價低於下限價位,我也想做一個多頭頭寸,並且在平倉時平倉。到目前爲止,這是我:布林通道波段R

bbands <- BBands(stock$Close, n=20,sd=2)

sig1 <- Lag(ifelse((stock$Close >bbands$up),-1,0))

sig2 <- Lag(ifelse((stock$Close <bbands$dn),1,0))

sig3 <- Lag(ifelse((stock$Close > bbands$mavg),1,-1))

sig <- sig1 + sig2

...這是我在哪裏卡住了,怎麼辦我使用sig3來獲得想要的結果sults?

回答

4
library(quantmod) 

getSymbols("SPY", src="yahoo", from="2013-01-01", to="2013-08-01") 
x <- na.omit(merge(SPY, BBands(Cl(SPY)))) 

x$sig <- NA 

# Flat where Close crossed the mavg 
x$sig[c(FALSE, diff(sign(Cl(x) - x$mavg), na.pad=FALSE) != 0)] <- 0 
x$sig[Cl(x) > x$up] <- -1 # short when Close is above up 
x$sig[Cl(x) < x$dn] <- 1 # long when Close is below dn 
x$sig[1] <- 0 # flat on the first day 
x$sig[nrow(x)] <- 0 # flat on the last day 

# Fill in the signal for other times 
x$sig <- na.locf(x$sig) # wherever sig is NA, copy previous value to next row 

# Now Lag your signal to reflect that you can't trade on the same bar that 
# your signal fires 
x$sig <- Lag(x$sig) 
x$sig[1] <- 0 # replace NA with zero position on first row 

現在,sig是你的位置。如果你有你的位置,你可以計算出其他像交易的數量,損益等

sum(abs(diff(x$sig, na.pad=FALSE))) # number of trades 

sum(diff(Cl(x)) * x$sig, na.rm=TRUE) # PnL of 1 share 
cumsum(diff(Cl(x), na.pad=FALSE) * x$sig[-1]) # equity over time 

sum(ROC(Cl(x)) * x$sig, na.rm=TRUE) # Return of fully invested account 
cumsum(ROC(Cl(x), na.pad=FALSE) * x$sig[-1]) # cumulative return 
+0

這正是我一直在尋找,謝謝你這麼多@GSee – Jason

+0

@ GSEE當我在運行此一對交易傳播'#交易數量','#PnL of 1 Share','#equity隨着時間的推移','#cumulative return'回到'NA'值,是否可能是因爲在一些點差是否定的? – Jason

+0

@ user2634864更可能是某個地方有一個NA;如果有任何值爲NA,則將其乘以或加上數字也將導致NA – GSee