# A Quantstrat to Build on Part 3

June 8, 2011
By

(This article was first published on Timely Portfolio, and kindly contributed to R-bloggers)

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.

`#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 functionCUD <- 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 signalnum_periods=50   # Initialize a strategy objectstratCUD <- strategy("CUD")   # Add an indicatorstratCUD <- 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 > 0stratCUD <- add.signal(strategy = stratCUD, name="sigComparison",	arguments = list(columns=c("CUD","ReturnNumbers"),relationship="gte"),	label="CUD.gte.0")# exit when CUD < 0stratCUD <- 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=100000port.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 tradesstart_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 laterthemelist<-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

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

Tags: , ,