[R-SIG-Finance] Pair Trade

me at censix.com me at censix.com
Thu May 13 21:59:34 CEST 2010


Hi there. from a quick glance at you code I see this:

The residuals for GDX  and GLD are obviously identical at all
times(GLD$RES==GDX$RES) , so you do NOT need the symbol loop within the
date loop.

"..for(symbol in symbols){.. "

which is causing everything to be bought twice. instead i would suggest to
just use the GLD$RES and whenever you go long GLD, go short GDX within the
same "if" block. [if that is what you want to do here]

best regards

hope you can forgive the incomplete quoting style here but it is late in
the day :)

Soren

> Hello All,
>
>
>
>                 I'm trying to set up a back-test on a pairs trade using
> blotter, but I'm stuck. The code below results in both securities being
> bought or sold for each condition, when I need one security bought the
> other
> security sold for each condition. For example, if the residual is greater
> than 5, but GLD sell GDX. I've tried numerous alterations to no avail.
> I'm
> using R version 2.10.1(2009-12-14).  Any help is greatly appreciated.
>
>
>
> Best Regards,
>
> Trey Johnson
>
>
>
>
>
> library(quantmod)
>
> library(TTR)
>
> library(blotter)
>
>
>
> # Set initial values
>
> initDate='2007-07-31'
>
> endDate='2008-03-31'
>
> initEq=100000
>
>
>
> symbols = c("GLD", "GDX")
>
>
>
> # Set currency and instruments
>
> currency("USD")
>
>  for(symbol in symbols){
>
>      stock(symbol, currency="USD",multiplier=1)
>
>  }
>
>
>
> # Load data with quantmod
>
> print("Loading data")
>
> getSymbols(symbols, from=initDate, to=endDate,
> index.class=c("POSIXt","POSIXct"))
>
>
>
> #use adjusted price
>
>  for(symbol in symbols){
>
>       x=get(symbol)
>
>       x = adjustOHLC(x, use.Adjusted=TRUE)
>
> assign(symbol,x)
>
>  }
>
>
>
> mod <- specifyModel(Cl(GLD) ~ Cl(GDX))
>
>
>
> mod.bd <- buildModel(mod, method = "lm",
> training.per=c("2007-07-31","2008-03-31"))
>
>
>
> res<-residuals(mod.bd)
>
>
>
> GLD$RES <- residuals(mod.bd)
>
> GDX$RES <- residuals(mod.bd)
>
>
>
> # Set up a portfolio object and an account object in blotter
>
> initPortf(name='Pair Trade', symbols=symbols, initDate=initDate)
>
> initAcct(name='Pair Acct', portfolios='Pair Trade', initDate=initDate,
> initEq=initEq)
>
> verbose = TRUE
>
>
>
>
>
> # Create trades
>
> for( i in 2:NROW(GLD) ) {
>
>   CurrentDate=time(GLD)[i]
>
>   equity = getEndEq(Account='Pair Acct', CurrentDate)
>
>
>
> for(symbol in symbols) {
>
>     sym = get(symbol)
>
>     ClosePrice = as.numeric(Cl(sym[i,]))
>
>     Posn = getPosQty(Portfolio='Pair Trade', Symbol=symbol,
> Date=CurrentDate)
>
>     UnitSize = as.numeric(100)
>
>       #as.numeric(trunc((equity/NROW(symbols))/ClosePrice))
>
>      #UnitSize=as.numeric(trunc(equity/ClosePrice))
>
>
>
>     # Position Entry (assume fill at close)
>
>     if( Posn == 0 ) {
>
>     #enter position
>
>       if( as.numeric(sym[i,'RES']) > as.numeric(5) ) {
>
>         addTxn(Portfolio= 'Pair Trade', Symbol=symbol,
> TxnDate=CurrentDate,
> TxnPrice=ClosePrice, TxnQty=UnitSize, TxnFees=0, verbose=verbose)
>
>       }  else
>
>      #enter position
>
>       if( as.numeric(sym[i,'RES']) < as.numeric(-5) ) {
>
>         addTxn(Portfolio= 'Pair Trade', Symbol=symbol,
> TxnDate=CurrentDate,
> TxnPrice=ClosePrice, TxnQty=-UnitSize, TxnFees=0, verbose=verbose)
>
>       }
>
>     } else {
>
>       # exit position
>
>       if(  (Posn > 0 && as.numeric(sym[i,'RES']) < as.numeric(0)) || (Posn
> <
> 0 && as.numeric(sym[i,'RES']) > as.numeric(0))  ) {
>
>         # Store trade with blotter
>
>         addTxn(Portfolio='Pair Trade', Symbol=symbol, TxnDate=CurrentDate,
> TxnPrice=ClosePrice, TxnQty= -Posn, TxnFees=0, verbose=verbose)
>
>       }
>
>     }
>
> } #end symbol loop
>
>
>
>   # Calculate P&L and resulting equity with blotter
>
>   updatePortf(Portfolio='Pair Trade', Dates=CurrentDate)
>
>   updateAcct(name='Pair Acct', Dates=CurrentDate)
>
>   updateEndEq(Account='Pair Acct', Dates=CurrentDate)
>
>
>
> } # End date loop
>
>
>
>
> 	[[alternative HTML version deleted]]
>
> _______________________________________________
> R-SIG-Finance at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions
> should go.
>



More information about the R-SIG-Finance mailing list