[R-SIG-Finance] Blotter example by kafka from R-bloggers

Stephen Choularton stephen at organicfoodmarkets.com.au
Wed Dec 22 20:01:52 CET 2010


Hi

I'm working on the Blotter example by kafka from R-bloggers.  The code 
goes like this:

require(xts)
require(quantmod)
Sys.setenv(TZ="GMT")
initDate='2000-01-01'
getSymbols('SPY',from=initDate,index.class=c("POSIXt","POSIXct"))
SPY<-adjustOHLC(SPY,use.Adjusted=T)

#yesterday's price
tmp<-lag(SPY,1)

# if today's low is higher than yesterday's close 1, else 0
signal<-ifelse(Lo(SPY)>Cl(tmp),1,0)
signal[1]<-0

#let's plot cumulitative return to make sure, that we are on the right path
tmp<-lag(Delt(Cl(SPY)),-1)
tmp[length(tmp)]<-0
plot(cumprod(signal*tmp+1))
  
SPY<-Cl(SPY)
symbols<-c('SPY')

rm(list=ls(envir=.blotter),envir=.blotter)
initPortf(ltportfolio,symbols, initDate=initDate)
initAcct(ltaccount,portfolios=c(ltportfolio), initDate=initDate,initEq=initEq)
  
signal<-signal['2000-02-01::']

for(iin  1:length(signal))
{
	currentDate=  time(signal)[i]
	equity=  getEndEq(ltaccount, currentDate)
	position=  getPosQty(ltportfolio, Symbol=symbols[1], Date=currentDate)	

	if(position==0)
	{
		#open a new position if signal is>0
		if(signal[i]>0)
		{
			closePrice<-as.double(Cl(SPY[currentDate]))
			unitSize=  as.numeric(trunc((equity/closePrice)))
                         # 5$ per transaction
			addTxn(ltportfolio, Symbol=symbols[1],  TxnDate=currentDate, TxnPrice=closePrice, TxnQty=  -unitSize , TxnFees=5, verbose=T)
		}

	}
	else
	{
		#position is open. If signal is 0 - close it.
		if(as.double(signal[i])==0  &&  position<0)
		{
			position=  getPosQty(ltportfolio, Symbol=symbols[1], Date=currentDate)
			closePrice<-as.double((Cl(SPY[currentDate])))#as.double(get(symbols[1])[i+100])

                         # 5$ per transaction
			addTxn(ltportfolio, Symbol=symbols[1],  TxnDate=currentDate, TxnPrice=closePrice, TxnQty=  -position , TxnFees=5, verbose=T)

		}

	}
	updatePortf(ltportfolio, Dates=  currentDate)
	updateAcct(ltaccount, Dates=  currentDate)
	updateEndEq(ltaccount, Dates=  currentDate)



There appears to be some sort of transcription problem at:

	if(as.double(signal[i])==0  &&  position<0)

so I have changed it to:

	if(as.double(signal[i])==0  &&  position<0)

so the code now reads:

require(xts)
require(quantmod)

Sys.setenv(TZ="GMT")
initDate='2000-01-01'
getSymbols('SPY',from=initDate,index.class=c("POSIXt","POSIXct"))
SPY<-adjustOHLC(SPY,use.Adjusted=T)

#yesterday's price
tmp<-lag(SPY,1)

# if today's low is higher than yesterday's close 1, else 0
signal<-ifelse(Lo(SPY)>Cl(tmp),1,0)
signal[1]<-0

#let's plot cumulitative return to make sure, that we are on the right path
tmp<-lag(Delt(Cl(SPY)),-1)
tmp[length(tmp)]<-0
plot(cumprod(signal*tmp+1))
  
SPY<-Cl(SPY)
symbols<-c('SPY')

rm(list=ls(envir=.blotter),envir=.blotter)
initPortf(ltportfolio,symbols, initDate=initDate)
initAcct(ltaccount,portfolios=c(ltportfolio), initDate=initDate,initEq=initEq)
  
signal<-signal['2000-02-01::']

for(iin  1:length(signal))
{
	currentDate=  time(signal)[i]
	equity=  getEndEq(ltaccount, currentDate)
	position=  getPosQty(ltportfolio, Symbol=symbols[1], Date=currentDate)	

	if(position==0)
	{
		#open a new position if signal is>0
		if(signal[i]>0)
		{
			closePrice<-as.double(Cl(SPY[currentDate]))
			unitSize=  as.numeric(trunc((equity/closePrice)))
                         # 5$ per transaction
			addTxn(ltportfolio, Symbol=symbols[1],  TxnDate=currentDate, TxnPrice=closePrice, TxnQty=  -unitSize , TxnFees=5, verbose=T)
		}

	}
	else
	{
		#position is open. If signal is 0 - close it.
		if(as.double(signal[i])==0  &&  position<0)
		{
			position=  getPosQty(ltportfolio, Symbol=symbols[1], Date=currentDate)
			closePrice<-as.double((Cl(SPY[currentDate])))#as.double(get(symbols[1])[i+100])

                         # 5$ per transaction
			addTxn(ltportfolio, Symbol=symbols[1],  TxnDate=currentDate, TxnPrice=closePrice, TxnQty=  -position , TxnFees=5, verbose=T)

		}

	}
	updatePortf(ltportfolio, Dates=  currentDate)
	updateAcct(ltaccount, Dates=  currentDate)
	updateEndEq(ltaccount, Dates=  currentDate)
  
	equity=  getEndEq(ltaccount, currentDate)

}
plot(getAccount(ltaccount)[["TOTAL"]]$End.Eq)

	equity=  getEndEq(ltaccount, currentDate)

}
plot(getAccount(ltaccount)[["TOTAL"]]$End.Eq)

but I keep on getting error messages like this:

Error in getEndEq(ltaccount, currentDate) : object 'ltaccount' not found
 > plot(getAccount(ltaccount)[["TOTAL"]]$End.Eq)
Error in getAccount(ltaccount) : object 'ltaccount' not found
 >
 > equity = getEndEq(ltaccount, currentDate)
Error in getEndEq(ltaccount, currentDate) : object 'ltaccount' not found
 >
 > }
Error: unexpected '}' in "}"
 > plot(getAccount(ltaccount)[["TOTAL"]]$End.Eq)
Error in getAccount(ltaccount) : object 'ltaccount' not found

I have tried references to blotter like library(blotter) and 
require(blotter) but it makes no difference.

I appreciate I haven't declared these objects/variables but often with R 
and finance they seem to come with the package.  Can anyone point out 
what I am doing wrong?

-- 
Stephen Choularton Ph.D., FIoD



More information about the R-SIG-Finance mailing list