[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