Wednesday, June 8, 2011

A Quantstrat to Build on Part 3

This just does the same thing as A Quantstrat to Build on Part 2, but I use sigCrossover and sigComparison instead of sigThreshold as my signal.  Maybe it will help some struggling to understand implementation of the different signal types.  For this system, sigThreshold works best, since sigComparison and sigCrossover require us to hack another function (ReturnNumbers) to add a column of 0 (or any number as an argument) for comparison.  To see the difference, run mktdata[1:200] after running each signal type.  Hope this helps.

R code:

#thanks so much to the developers of quantstrat
#99% of this code comes from the demos in the quantstrat package  
#in this I make changes to the signal and rule
#to illustrate how sigCrossover and sigComparison
#work  
require(quantstrat)   
#now let's define our silly countupdown function
CUD <- function(price,n) {
#CUD takes the n-period sum of 1 (up days) and -1 (down days)
temp<-runSum(ifelse(ROC(price,1,type="discrete") > 0,1,-1),n)
colnames(temp) <- "CUD"
temp
}  
ReturnNumbers <- function(price,n) {
#just return an xts with 0 for every period
as.xts(rep(0,NROW(price)),order.by=index(price))
}  
try(rm("order_book.CUD",pos=.strategy),silent=TRUE)
try(rm("account.CUD","portfolio.CUD",pos=.blotter),silent=TRUE)
try(rm("port.st","symbols","symbol","stratCUD","initDate","initEq",
'start_t','end_t','num_periods'),silent=TRUE)  
#specify this for the rolling periods to use for our signal
num_periods=50   # Initialize a strategy object
stratCUD <- strategy("CUD")   # Add an indicator
stratCUD <- add.indicator(strategy = stratCUD, name = "CUD",
arguments = list(price = quote(Cl(mktdata)),n=num_periods),
label="CUD")
stratCUD <- add.indicator(strategy = stratCUD, name = "ReturnNumbers",
arguments = list(price = quote(Cl(mktdata)),n=0),
label="ReturnNumbers")  
# these are the same rules from the original sigThreshold
# I provide these as an illustration of sigCrossover and sigComparison
# sigComparison gives 1 (TRUE) or 0 (FALSE)
# sigCrossover gives 1(TRUE) or NA
# enter when CUD > 0
stratCUD <- add.signal(strategy = stratCUD, name="sigComparison",
arguments = list(columns=c("CUD","ReturnNumbers"),relationship="gte"),
label="CUD.gte.0")
# exit when CUD < 0
stratCUD <- add.signal(strategy = stratCUD, name="sigComparison",
arguments = list(columns=c("CUD","ReturnNumbers"),relationship="lt"),
label="CUD.lt.0")   stratCUD <- add.rule(strategy = stratCUD, name='ruleSignal',
arguments = list(sigcol="CUD.gte.0", sigval=TRUE, orderqty=1000,
ordertype='market', orderside='long', pricemethod='market', replace=FALSE),
type='enter', path.dep=TRUE)
stratCUD <- add.rule(strategy = stratCUD, name='ruleSignal',
arguments = list(sigcol="CUD.lt.0", sigval=TRUE, orderqty='all',
ordertype='market', orderside='long', pricemethod='market', replace=FALSE),
type='exit', path.dep=TRUE)       currency("USD")
symbols = c("GSPC","GDAXI")
for (symbol in symbols) {
stock(symbol, currency="USD",multiplier=1)
#use paste with ^ to get index data
getSymbols(paste("^",symbol,sep=""),adjust=T,from="1900-12-31")
assign(symbol,to.weekly(get(symbol)))
}       initDate='1950-12-31'
initEq=100000
port.st<-'CUD' #use a string here for easier changing of parameters and re-trying  
initPortf(port.st, symbols=symbols, initDate=initDate)
initAcct(port.st, portfolios=port.st, initDate=initDate)
initOrders(portfolio=port.st, initDate=initDate)   print("setup completed")  
# Process the indicators and generate trades
start_t<-Sys.time()
out<-try(applyStrategy(strategy=stratCUD , portfolios=port.st ) )
end_t<-Sys.time()
print("Strategy Loop:")
print(end_t-start_t)     start_t<-Sys.time()
updatePortf(Portfolio=port.st,Dates=paste('::',as.Date(Sys.time()),sep=''))
end_t<-Sys.time()
print("trade blotter portfolio update:")
print(end_t-start_t)  
# hack for new quantmod graphics, remove later
themelist<-chart_theme()
themelist$col$up.col<-'lightgreen'
themelist$col$dn.col<-'pink'   for(symbol in symbols){
dev.new()
chart.Posn(Portfolio=port.st,Symbol=symbol,theme=themelist)
#add the CUD indicator to the bottom of the chart
plot(add_TA(CUD(get(symbol)[,4],n=num_periods)))
}
mktdata[1:200] #will show how mktdata is used in quantstrat

Created by Pretty R at inside-R.org

No comments:

Post a Comment