[R-SIG-Finance] quantstrat
Stephen Choularton
stephen at organicfoodmarkets.com.au
Tue Jan 11 06:19:15 CET 2011
Hi
OK, I have found this in the manual:
For the purposes of backtesting, and compatibility with the trade
accounting in blotter, this function will not allow a transaction to
cross your current position through zero. The accounting rules for
realizing gains in such cases are more complicated than we wish to
support. Also, many brokers will break, revise, or split such
transactions for the same reason. If you wish to do a "stop and reverse"
system, first stop (flatten), and then reverse (initiate a new position).
So now I know why I couldn't model short positions. is this correct?
Being able to go short is a pretty common sort of action.
I had a look at the bbands demo and it appeared to go long and short and
specified NULL as the ordertype rather than long or short. That got rid
of my warning that I was going short, but it didn't produce any short
trades.
Any help most welcome.
##########################################################
Original posting:
Hi
I'm trying to money the bbands demo to by it on the S&P/ ASX 200.
I think the Symbol is ^AXJO and I can get the info I want using it.
I have amended the code as follows:
# bbands
require(quantstrat)
try(rm("order_book.bbands",pos=.strategy),silent=TRUE)
try(rm("account.bbands","portfolio.bbands",pos=.blotter),silent=TRUE)
try(rm("account.st","portfolio.st","stock.str","stratBBands","initDate","initEq",'start_t','end_t'),silent=TRUE)
# some things to set up here
stock.str='^AXJO' # what are we trying it on
# we'll pass these
SD = 2 # how many standard deviations, traditionally 2
N = 20 # how many periods for the moving average, traditionally 20
currency('AUD')
stock(stock.str,currency='AUD',multiplier=1)
initDate='2006-12-31'
initEq=1000000
portfolio.st='bbands'
account.st='bbands'
initPortf(portfolio.st,symbols=stock.str, initDate=initDate)
initAcct(account.st,portfolios='bbands', initDate=initDate)
initOrders(portfolio=portfolio.st,initDate=initDate)
stratBBands <- strategy("bbands")
#one indicator
stratBBands <- add.indicator(strategy = stratBBands, name = "BBands",
arguments = list(HLC = quote(HLC(mktdata)), maType='SMA'))
#add signals:
stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments =
list(columns=c("Close","up"),relationship="gt"),label="Cl.gt.UpperBand")
stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments =
list(columns=c("Close","dn"),relationship="lt"),label="Cl.lt.LowerBand")
stratBBands <- add.signal(stratBBands,name="sigCrossover",arguments =
list(columns=c("High","Low","mavg"),relationship="op"),label="Cross.Mid")
# lets add some rules
stratBBands <- add.rule(stratBBands,name='ruleSignal', arguments =
list(sigcol="Cl.gt.UpperBand",sigval=TRUE, orderqty=-100,
ordertype='market', orderside=NULL, threshold=NULL),type='enter')
stratBBands <- add.rule(stratBBands,name='ruleSignal', arguments =
list(sigcol="Cl.lt.LowerBand",sigval=TRUE, orderqty= 100,
ordertype='market', orderside=NULL, threshold=NULL),type='enter')
stratBBands <- add.rule(stratBBands,name='ruleSignal', arguments =
list(sigcol="Cross.Mid",sigval=TRUE, orderqty= 'all',
ordertype='market', orderside=NULL, threshold=NULL),type='exit')
#alternately, to exit at the opposite band, the rules would be...
#stratBBands <- add.rule(stratBBands,name='ruleSignal', arguments =
list(data=quote(mktdata),sigcol="Lo.gt.UpperBand",sigval=TRUE, orderqty=
'all', ordertype='market', orderside=NULL, threshold=NULL),type='exit')
#stratBBands <- add.rule(stratBBands,name='ruleSignal', arguments =
list(data=quote(mktdata),sigcol="Hi.lt.LowerBand",sigval=TRUE, orderqty=
'all', ordertype='market', orderside=NULL, threshold=NULL),type='exit')
#TODO add thresholds and stop-entry and stop-exit handling to test
getSymbols(stock.str,from=initDate)
start_t<-Sys.time()
out<-try(applyStrategy(strategy=stratBBands ,
portfolios='bbands',mktdata='AXJO',
parameters=list(sd=SD,n=N),verbose=TRUE) )
# look at the order book
#getOrderBook('bbands')
end_t<-Sys.time()
print("strat execution time:")
print(end_t-start_t)
Time difference of 32.271 secs
start_t<-Sys.time()
updatePortf(Portfolio='bbands',Dates=paste('::',as.Date(Sys.time()),sep=''))
end_t<-Sys.time()
print("updatePortf execution time:")
print(end_t-start_t)
chart.Posn(Portfolio='bbands',Symbol=stock.str)
plot(add_BBands(on=1,sd=SD,n=N))
###############################################################################
# R (http://r-project.org/) Quantitative Strategy Model Framework
#
# Copyright (c) 2009-2010
# Peter Carl, Dirk Eddelbuettel, Brian G. Peterson, Jeffrey Ryan, and
Joshua Ulrich
#
# This library is distributed under the terms of the GNU Public
License (GPL)
# for full details see the file COPYING
#
# $Id: bbands.R 374 2010-08-17 18:43:35Z braverock $
#
###############################################################################
I get my prices with thus
> getSymbols(stock.str,from=initDate)
[1] "AXJO"
but note the hat has been dropped!
and just afterwards I get thIs:
rategy=stratBBands , portfolios='bbands',
parameters=list(sd=SD,n=N),verbose=TRUE) )
Error in get(symbol) : object '^AXJO' not found
I've looked at the notes for applyStrategy and I've tried specifically
referring to AXJO like this:
>
> out<-try(applyStrategy(strategy=stratBBands ,
portfolios='bbands',mktdata='AXJO',
parameters=list(sd=SD,n=N),verbose=TRUE) )
Error in get(symbol) : object '^AXJO' not found
but I still get the message.
Can anyone advise me how to resolve this?
--
Stephen Choularton Ph.D., FIoD
More information about the R-SIG-Finance
mailing list