A Quantstrat to Build on Part 3

[This article was first published on Timely Portfolio, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

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

To leave a comment for the author, please follow the link and comment on their blog: Timely Portfolio.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)