我一直在修改几个月前使用quantstrat进行的回测。一切都很好,直到我添加了信号和规则 6(唐奇安通道低(我的完整代码如下。任何帮助将不胜感激。
提前谢谢。
PS:对不起,如果代码看起来很乱,这是我第一次在这里提问。
library(blotter)
library(quantstrat)
library(xts)
library(quantmod)
Sys.setenv(TZ="UTC")
getSymbols('^DJI', from="2016-01-01", to="2016-12-31", index.class="POSIXct", adjust=T)
colnames(DJI)<- c("Open","High","Low","Close","Volume","Adjusted")
currency("AUD")
Sys.setenv(TZ="UTC")
initdate <- '2016-01-03'
startdate <- '2016-01-04'
enddate <- '2016-12-30'
portfolioname <- "Dow Jones"
accountname <- "Dow Jones"
contracts <- 1
txncost <- -0.79
margin <- 15000
strategyname <- accountname
startingcapital <- 1e+6
symbollist <- 'DJI'
instrument<-"DJI"
rm.strat(strategyname)
initPortf(portfolioname,
symbollist,initDate=initdate,currency="AUD")
initAcct(accountname,portfolios=portfolioname,initDate=initdate,initEq=startingcapital,currency="AUD")
initOrders(portfolio=portfolioname,initDate=initdate)
strategy(strategyname,store=TRUE)
strat <- getStrategy(strategyname)
summary(strat)
osInvestAll <- function (data, timestamp, orderqty, ordertype, orderside, equity, portfolio, symbol, ruletype, ..., orderprice)
{
datePos <- format(timestamp,"%Y-%m-%d")
updatePortf(Portfolio=portfolio,Symbol=symbol,Dates=datePos)
updateAcct(portfolio,Dates=datePos)
updateEndEq(portfolio,Dates=datePos)
Posn <- getPosQty(portfolio,Symbol=symbol,Date=datePos)
equity <- getEndEq(portfolio,datePos)
ClosePrice <- getPrice(get(symbol))[datePos]
#UnitSize <- as.numeric(trunc(equity*0.25/ClosePrice))
if (Posn == 0) {
osInvestAll <- UnitSize } else
{osInvestAll <- 0
}
}
Rule1<-function(price,SMA,...)
{ifelse(price>SMA,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=40),label="SMA40")
add.indicator(strategyname, name="Rule1", arguments=list(price = quote(mktdata$Close), SMA=quote(mktdata$SMA.SMA40)), label="Rule1Signal")
Rule2<-function(SMA2,SMA5,...)
{ifelse(SMA5>SMA2,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=2),label="SMA2")
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Close),n=5),label="SMA5")
add.indicator(strategyname, name="Rule2", arguments=list(SMA5=quote(mktdata$SMA.SMA5), SMA2=quote(mktdata$SMA.SMA2)), label="Rule2Signal")
#Daily range less than the 10 day average range, buy next day if todays close was higher (+1) or short if it was lower
#HLC <- HLC(DJI)
Rule3<-function(HLC, n)
{
DJI$TR <- ATR(HLC(DJI),10)[,1]
DJI$todays <-DJI$High-DJI$Low
Rule3 <- ifelse(DJI$todays>DJI$TR, ifelse((HLC$Close > lag.xts(HLC$Close)), -1,1), ifelse((HLC$Close > lag.xts(HLC$Close)), 1, -1))
}
add.indicator(strategyname, name="Rule3", arguments=list(HLC=quote(HLC(mktdata)), n=10), label="Rule3Signal")
##Donchian Channel
#High
Rule4 <- function(H,L,Close)
{ifelse(Close>H,1,0)}
add.indicator(strategy=strategyname,name="DonchianChannel",
arguments=list(HL=quote(mktdata$Close),n=50),label="DCH")
add.indicator(strategyname, name="Rule4", arguments=list(H=quote(mktdata$high.DCH),L=quote(mktdata$low.DCH),Close=quote(mktdata$Close)), label="Rule4Signal")
#Low
Rule6 <- function(H,L,Close)
{ifelse(Close<L,-1,0)}
add.indicator(strategy=strategyname,name="DonchianChannel",
arguments=list(HL=quote(mktdata$Close),n=50),label="DCH")
add.indicator(strategyname, name="Rule6", arguments=list(H=quote(mktdata$high.DCH),L=quote(mktdata$low.DCH),Close=quote(mktdata$Close)), label="Rule6Signal")
#Rule 5
Rule5<-function(H15,L15)
{
X<-(H15+L15)/2
ifelse(DJI$Close>X,1,-1)}
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$High),n=15),label="H15")
add.indicator(strategy=strategyname,name="SMA",
arguments=list(x=quote(mktdata$Low),n=15),label="L15")
add.indicator(strategyname, name="Rule5", arguments=list(Close=quote(mktdata$Close), H15=quote(mktdata$High),L15=quote(mktdata$Low)), label="Rule5Signal")
RuleSum <- function(R1,R2,R3,R4,R5,R6,...)
{
RuleSum <- ( R1 + R2 + R3 + R4 + R5 + R6 )
}
add.indicator(strategyname, name="RuleSum", arguments=list(R1=quote(mktdata$Close.Rule1Signal), R2=quote(mktdata$SMA.SMA5.Rule2Signal),R3=quote(mktdata$todays.Rule3Signal),R4=quote(mktdata$Rule4Signal),R5=quote(mktdata$Close.Rule5Signal),R6=quote(mktdata$Close.Rule6Signal)), label="RuleSum")
#Signals
add.signal(strategyname,name="sigThreshold",
arguments=list(column="Close.Rule1Signal.RuleSum",relationship="gt",threshold=0,cross=FALSE),
label="signal.gt.zero")
add.signal(strategyname,name="sigThreshold",
arguments=list(column="Close.Rule1Signal.RuleSum",relationship="lt",threshold=0,cross=FALSE),
label="signal.lt.zero")
#Rules
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.gt.zero", sigval=TRUE,
replace=FALSE,
prefer='open',
orderside='long',
ordertype='market',
orderqty=1,
orderset='ocolong'
),
type='enter',
label='LE'
)
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.gt.zero", sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='market',
orderqty='all',
orderset='ocolong'
),
type='exit',
label='LX'
)
trailingStopPercent <- .20
add.rule(strategyname, name = 'ruleSignal',
arguments=list(sigcol="signal.gt.zero" , sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='stoptrailing',
tmult=TRUE,
threshold=quote(trailingStopPercent),
orderqty='all',
orderset='ocolong'
),
type='chain', parent="LE",
label='StopTrailingLong',
enabled=TRUE
)
###short rules
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.lt.zero", sigval=TRUE,
replace=FALSE,
prefer='open',
orderside='short',
ordertype='market',
orderqty=-1,
orderset='ocoshort'
),
type='enter',
label='SE'
)
add.rule(strategyname,name='ruleSignal',
arguments = list(sigcol="signal.lt.zero", sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='short',
ordertype='market',
orderqty='all',
orderset='ocoshort'
),
type='exit',
label='SX'
)
trailingStopPercent <- .20
add.rule(strategyname, name = 'ruleSignal',
arguments=list(sigcol="signal.lt.zero" , sigval=TRUE,
replace=FALSE,
prefer='close',
orderside='long',
ordertype='stoptrailing',
tmult=TRUE,
threshold=quote(trailingStopPercent),
orderqty='all',
orderset='ocoshort'
),
type='chain', parent="SE",
label='StopTrailingShort',
enabled=TRUE
)
summary(getStrategy(strategyname))
applyStrategy(strategy=strategyname,portfolios=portfolioname,verbose=TRUE,update.equity = TRUE, showEq = TRUE) #verbose=FALSE not to print
updatePortf(strategyname)
updateAcct(strategyname)
updateEndEq(strategyname)
如果在收到错误后运行traceback()
,则可以快速确定代码中的问题可能出在哪里。
您没有正确指定R4
中用于RuleSum
指示器的列名,该列名应R4=quote(mktdata$Close.Rule4Signal)
。
一旦您纠正了RuleSum
的add.indicator
,您的回测就会起作用:
add.indicator(strategyname, name="RuleSum", arguments=list(R1=quote(mktdata$Close.Rule1Signal), R2=quote(mktdata$SMA.SMA5.Rule2Signal),R3=quote(mktdata$todays.Rule3Signal),R4=quote(mktdata$Close.Rule4Signal),R5=quote(mktdata$Close.Rule5Signal),R6=quote(mktdata$Close.Rule6Signal)), label="RuleSum")
提示:出于调试目的,您可以通过调用
res <- applyIndicators(strategyname, DJI)
在你完成所有add.indicator
之后(在你添加add.signal
之前,在你运行applyStrategy
之前。 如果此代码按预期工作,那么您就知道问题可能出在信号或规则上。 然后您可以使用applySignals
等测试信号工作...