quantitative trading strategies in r part 3 of 3

Post on 28-Apr-2015

519 Views

Category:

Documents

10 Downloads

Preview:

Click to see full reader

DESCRIPTION

Quantitative Trading Strategies in RPart 3 of 3

TRANSCRIPT

40 60 80 100 120

40

60

80

mm

Computational Finance and Risk Management

Quantitative Trading Strategies in R

Part 3 of 3

Guy YollinPrincipal Consultant, r-programming.org

Visiting Lecturer, University of Washington

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 1 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 2 / 68

40 60 80 100 120

40

60

80

mm

Lecture references

TradeAnalytics project page on R-forge:http://r-forge.r-project.org/projects/blotter/

documents and demos for:

blotter packagequantstrat package

R-SIG-FINANCE:https://stat.ethz.ch/mailman/listinfo/r-sig-finance

Kent Russell’s Timely Portfolio blog:http://timelyportfolio.blogspot.com/

6-part quantstrat example

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 3 / 68

40 60 80 100 120

40

60

80

mm

Quantstrat demos

faber maCross bbands rsi macd faberMC

name='sigCrossover' Y Y Y N N Y

name='sigThreshold' N N N Y Y N

ordertype='market' Y Y Y Y Y Y

ordertype='stoplimit' N N N N Y N

type='enter' Y Y Y Y Y Y

type='exit' Y Y Y Y Y Y

type='risk' N N N N Y N

orderside='long' Y Y N Y Y Y

orderside='short' N N N Y N N

applyStrategy parameters N N Y Y Y N

index.class='Date' N Y Y Y Y N

index.class='POSIXt' Y N N N N N

multiasset Y N N Y N Y

multicurrency N N N N N Y

data adjusted N Y N N N N

updates Account N N N N N N

demos are located in ∼/R-2.13.1/library/quantstrat/demo

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 4 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 5 / 68

40 60 80 100 120

40

60

80

mm

MACD (Moving Average Convergence-Divergence)

Trend-following momentum indicator

Published by Gerald Appel in the late 1970

MACD Calculation

MACD = 12-day EMA - 26-day EMAMACD Signal Line = 9-day EMA of MACDMACD histogram = MACD - Signal Line

Interpretation

Buy/Sell when MACD Signal Line crosses 0

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 6 / 68

40 60 80 100 120

40

60

80

mm

MACD system in TradeStation

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 7 / 68

40 60 80 100 120

40

60

80

mm

MACD code in EasyLanguage

EasyLanguage code

i n p u t s : Fas tLength ( 12 ) , SlowLength ( 26 ) , MACDLength( 9 ) ;v a r i a b l e s : MyMACD( 0 ) , MACDSig( 0 ) ;

MyMACD = MACD( Close , FastLength , SlowLength ) ;MACDSig = XAverage ( MyMACD, MACDLength ) ;

i f MACDSig c r o s s e s above 0 thenBuy ( ”MacdLE ” ) next bar at market ;

i f MACDSig c r o s s e s below 0 thenS e l l ( ”MacdLX” ) next bar at market ;

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 8 / 68

40 60 80 100 120

40

60

80

mm

MACD indicator from TTR

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 9 / 68

40 60 80 100 120

40

60

80

mm

Initialize currency and trading instruments

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> library(quantstrat)

> # inz currency and stocks

> dummy <- currency('USD')

> stock.str = c("XLF")

> for(symbol in stock.str)

stock(symbol, currency="USD",multiplier=1)

> # download stocks

> start.data <- as.Date("1998-12-22")

> end.data <- as.Date("2011-08-09")

> initDate <- start.data-1

> for(symbol in stock.str)

getSymbols(symbol,from=start.data,to=end.data,adjust=T)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 10 / 68

40 60 80 100 120

40

60

80

mm

Initialize portfolio, account, and orders object

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz portfolio, account, orders, strategy

> strat.name <- "MACD"

> initEq=1000000

> trade.percent = 0.05

> dummy <- initPortf(name=strat.name,symbols=stock.str, initDate=initDate)

> dummy <- initAcct(name=strat.name,portfolios=strat.name,

initDate=initDate, initEq=initEq)

> initOrders(portfolio=strat.name,initDate=initDate)

> strat <- strategy(strat.name)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 11 / 68

40 60 80 100 120

40

60

80

mm

The add.signals function

quantstrat supports the following signal types:

sigCrossover crossover signal (”gt”, ”lt”, ”eq”, ”gte”, ”lte”)

sigComparison comparison signal (”gt”, ”lt”, ”eq”, ”gte”, ”lte”)

sigThreshold threshold signal (”gt”, ”lt”, ”eq”, ”gte”, ”lte”)

sigPeak peak/valley signals (”peak”, ”bottom”)

sigFormula signal calculated from a formula

R Code: The add.signals function

> args(add.signal)

function (strategy, name, arguments, parameters = NULL, label = NULL,

..., enabled = TRUE, indexnum = NULL, store = FALSE)

NULL

Main arguments:

strategy strategy object

name name of the signal (one of the 5 supported signals)

arguments arguments to be passed to the indicator functionGuy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 12 / 68

40 60 80 100 120

40

60

80

mm

The sigThreshold function

The sigThreshold function generates a threshold signal

R Code: The sigThreshold function

> args(sigThreshold)

function (label, data = mktdata, column, threshold = 0, relationship = c("gt",

"lt", "eq", "gte", "lte"), cross = FALSE)

NULL

Main arguments:

label text label to apply to the output

data data to apply comparison

column column name to apply comparison

threshold numeric threshold to compare

relationship relationship to test (”gt”, ”lt”, ”eq”, ”gte”, ”lte”)

cross if TRUE, then signal will be TRUE only for the firstobservation to cross the threshold

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 13 / 68

40 60 80 100 120

40

60

80

mm

Define indicators and signals

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # indicators:

> strat <- add.indicator(strategy = strat, name = "MACD",

arguments = list(x=quote(Cl(mktdata))) )

> # signals:

> strat <- add.signal(strategy = strat, name="sigThreshold",

arguments = list(column="signal",relationship="gt",threshold=0,cross=TRUE),

label="signal.gt.zero")

> strat <- add.signal(strategy = strat,name="sigThreshold",

arguments = list(column="signal",relationship="lt",threshold=0,cross=TRUE),

label="signal.lt.zero")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 14 / 68

40 60 80 100 120

40

60

80

mm

Define order sizing function

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> osPercentEquity <- function (timestamp,orderqty,portfolio,symbol,ruletype,...)

tempPortfolio <- getPortfolio(portfolio)

dummy <- updatePortf(Portfolio=portfolio,

Dates=paste('::',as.Date(timestamp),sep=''))

trading.pl <- sum(getPortfolio(portfolio)$summary$Net.Trading.PL)

assign(paste("portfolio.",portfolio,sep=""),tempPortfolio,pos=.blotter)

total.equity <- initEq+trading.pl

tradeSize <- total.equity * trade.percent

ClosePrice <- as.numeric(Cl(mktdata[timestamp,]))

orderqty <- sign(orderqty)*round(tradeSize/ClosePrice)

return(orderqty)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 15 / 68

40 60 80 100 120

40

60

80

mm

Define entry and exit rules

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # rules:

> strat <- add.rule(strategy = strat,name='ruleSignal',

arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty=100,

ordertype='market', orderside='long', osFUN='osPercentEquity'),type='enter')

> strat <- add.rule(strategy = strat,name='ruleSignal',

arguments = list(sigcol="signal.lt.zero",sigval=TRUE, orderqty='all',

ordertype='market', orderside='long'),type='exit')

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 16 / 68

40 60 80 100 120

40

60

80

mm

Applying the strategy to a portfolio

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # parameters:

> fastMA = 12

> slowMA = 26

> signalMA = 9

> maType="EMA"

> # apply strategy

> out<-try(applyStrategy(strategy=strat, portfolios=strat.name,

parameters=list(nFast=fastMA, nSlow=slowMA, nSig=signalMA,maType=maType),

verbose=F))

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 17 / 68

40 60 80 100 120

40

60

80

mm

Call updatePortf to update portfolio P&L

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> dummy <- updatePortf(Portfolio=strat.name,

Dates=paste('::',as.Date(Sys.time()),sep=''))

> if(sum(duplicated(index(getPortfolio(strat.name)$summary)))>0)

tempPortfolio <- getPortfolio(strat.name)

tempPortfolio$summary <- as.xts(aggregate(x=tempPortfolio$summary,

by=index(tempPortfolio$summary), FUN=sum))

assign(paste("portfolio.",strat.name,sep=""),tempPortfolio,pos=.blotter)

warning("duplicates removed after update")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 18 / 68

40 60 80 100 120

40

60

80

mm

Chart MACD system performance for XLF

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> source("chart_Posn.R")

> chart_Posn(Portfolio=strat.name,Symbol="XLF")

> plot(add_MACD())

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 19 / 68

40 60 80 100 120

40

60

80

mm

MACD system performance for XLF

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 20 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 21 / 68

40 60 80 100 120

40

60

80

mm

Quantstrat/Blotter portfolios with multiple assets

While most of the quantstrat demos use a single asset, the real powerof the architecture is that it supports multiple assets

To use a multiple-asset portfolio, simply supply a symbol list whencalling initPortf

All functionality should simply work with the entire portfolio of assets

applying a strategy via applyStrategy will generate transactions forall assets according to the define trading rulescalculating portfolio P&L via updatePortf will accumulate the P&Lfor all assets

Due to the additional calculations required, working with multi-assetportfolios can be time consuming

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 22 / 68

40 60 80 100 120

40

60

80

mm

Initialize currency and trading instruments

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # clear out old portfolios and orders

> try(rm(list=ls(pos=.blotter),pos=.blotter),silent=TRUE)

> try(rm(list=ls(pos=.strategy),pos=.strategy),silent=TRUE)

> # inz currency and stocks

> stock.str = c("XLF", "XLP", "XLE", "XLY", "XLV", "XLI", "XLB", "XLK", "XLU")

> for(symbol in stock.str)

stock(symbol, currency="USD",multiplier=1)

> # download stocks

> start.data <- as.Date("1998-12-22")

> end.data <- as.Date("2011-08-09")

> initDate <- start.data-1

> for(symbol in stock.str)

getSymbols(symbol,from=start.data,to=end.data,adjust=T)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 23 / 68

40 60 80 100 120

40

60

80

mm

Initialize portfolio, account, and orders object

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz portfolio, account, orders, strategy

> strat.name <- "MACD"

> initEq=1000000

> trade.percent = 0.05

> dummy <- initPortf(name=strat.name,symbols=stock.str, initDate=initDate)

> dummy <- initAcct(name=strat.name,portfolios=strat.name,

initDate=initDate, initEq=initEq)

> initOrders(portfolio=strat.name,initDate=initDate)

> strat <- strategy(strat.name)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 24 / 68

40 60 80 100 120

40

60

80

mm

The blotter_portfolio object

myPortfolio

--------------------

blotter_portfolio

symbols

--------------------

listsymbols

--------------------

listsymbols

--------------------

list

summary

--------------------

portfolio_summary xts

Long.Value

Short.Value

Net.Value

Gross.Value

Period.Realized.PL

Period.Unrealized.PL

Gross.Trading.PL

Txn.Fees

Net.Trading.PL

txn

--------------------

transactions xts

posPL

--------------------

posPL xts

posPL.USD

--------------------

posPL xts

Pos.Qty

Con.Mult

Ccy.Mult

Pos.Value

Pos.Avg.Cost

Txn.Value

Period.Realized.PL

Period.Unrealized.PL

Gross.Trading.PL

Txn.Fees

Net.Trading.PL

Txn.Qty

Txn.Price

Txn.Value

Txn.Avg.Cost

Pos.Qty

Pos.Avg.Cost

Gross.Txn.Realized.PL

Txn.Fees

Net.Txn.Realized.PL

Con.Mult

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 25 / 68

40 60 80 100 120

40

60

80

mm

Symbols in the botter_portfolio object

R Code:

> macdPortfolio <- getPortfolio(strat.name)

> names(macdPortfolio)

[1] "symbols" "summary"

> length(macdPortfolio$symbols)

[1] 9

> names(macdPortfolio$symbols)

[1] "XLF" "XLP" "XLE" "XLY" "XLV" "XLI" "XLB" "XLK" "XLU"

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 26 / 68

40 60 80 100 120

40

60

80

mm

Define indicators and signals

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # indicators:

> strat <- add.indicator(strategy = strat, name = "MACD",

arguments = list(x=quote(Cl(mktdata))) )

> # signals:

> strat <- add.signal(strategy = strat, name="sigThreshold",

arguments = list(column="signal",relationship="gt",threshold=0,cross=TRUE),

label="signal.gt.zero")

> strat <- add.signal(strategy = strat,name="sigThreshold",

arguments = list(column="signal",relationship="lt",threshold=0,cross=TRUE),

label="signal.lt.zero")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 27 / 68

40 60 80 100 120

40

60

80

mm

Define order sizing function

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> osPercentEquity <- function (timestamp,orderqty,portfolio,symbol,ruletype,...)

tempPortfolio <- getPortfolio(portfolio)

dummy <- updatePortf(Portfolio=portfolio,

Dates=paste('::',as.Date(timestamp),sep=''))

trading.pl <- sum(getPortfolio(portfolio)$summary$Net.Trading.PL)

assign(paste("portfolio.",portfolio,sep=""),tempPortfolio,pos=.blotter)

total.equity <- initEq+trading.pl

tradeSize <- total.equity * trade.percent

ClosePrice <- as.numeric(Cl(mktdata[timestamp,]))

orderqty <- sign(orderqty)*round(tradeSize/ClosePrice)

return(orderqty)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 28 / 68

40 60 80 100 120

40

60

80

mm

Define entry and exit rules

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # rules:

> strat <- add.rule(strategy = strat,name='ruleSignal',

arguments = list(sigcol="signal.gt.zero",sigval=TRUE, orderqty=100,

ordertype='market', orderside='long', osFUN='osPercentEquity'),type='enter')

> strat <- add.rule(strategy = strat,name='ruleSignal',

arguments = list(sigcol="signal.lt.zero",sigval=TRUE, orderqty='all',

ordertype='market', orderside='long'),type='exit')

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 29 / 68

40 60 80 100 120

40

60

80

mm

Applying the strategy to a portfolio

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # parameters:

> fastMA = 12

> slowMA = 26

> signalMA = 9

> maType="EMA"

> # apply strategy

> out<-try(applyStrategy(strategy=strat, portfolios=strat.name,

parameters=list(nFast=fastMA, nSlow=slowMA, nSig=signalMA,maType=maType),

verbose=F))

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 30 / 68

40 60 80 100 120

40

60

80

mm

Call updatePortf to update portfolio P&L

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> dummy <- updatePortf(Portfolio=strat.name,

Dates=paste('::',as.Date(Sys.time()),sep=''))

> if(sum(duplicated(index(getPortfolio(strat.name)$summary)))>0)

tempPortfolio <- getPortfolio(strat.name)

tempPortfolio$summary <- as.xts(aggregate(x=tempPortfolio$summary,

by=index(tempPortfolio$summary), FUN=sum))

assign(paste("portfolio.",strat.name,sep=""),tempPortfolio,pos=.blotter)

warning("duplicates removed after update")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 31 / 68

40 60 80 100 120

40

60

80

mm

Chart portfolio performance

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> library(PerformanceAnalytics)

> trading.pl <- getPortfolio(strat.name)$summary$Net.Trading.PL

> rets <- trading.pl/initEq

> charts.PerformanceSummary(rets,colorset = bluefocus,xlab="")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 32 / 68

40 60 80 100 120

40

60

80

mm

MACD portfolio performance−

0.01

5−

0.00

50.

005

Cum

ulat

ive

Ret

urn

Net.Trading.PL Performance

−0.

005

0.00

00.

005

Dai

ly R

etur

n

1998−12−21 2000−07−03 2002−01−02 2003−07−01 2005−01−03 2006−07−03 2008−01−02 2009−07−01 2011−01−03

−0.

025

−0.

010

Dra

wdo

wn

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 33 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 34 / 68

40 60 80 100 120

40

60

80

mm

MACD optimization

The inventor of MACD suggests that the difference between a 12-dayand 26-day exponential moving average be calculated and thensmooth via a 9-day exponential moving average

Our research interest is to explore if other values provide superiorresults

We will try 3 different values for each of fastMA, slowMA, andsignalMA, 27 different settings

All testing will be done on the 9-asset portfolio of S&P Sector SelectETFs with data from Dec-1998 through Aug-2011

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 35 / 68

40 60 80 100 120

40

60

80

mm

The Omega performance measure

The Omega performance measure† is a reward-to-risk ratio that can beapplied to a time-series of returns

Ω(L) =

∫ bL (1 − F (r))dr∫ L

a F (r)drwhere L is some return threshold (e.g. 0)

Omega uses all of the information in the return series and is thus wellsuited for non-normal distributions

Omega is essentially the ratio of a call price to a put price

Omega performance measure is calculated by the Omega function inPerformanceAnalytics

Ω(L) =C (L)

P(L)

†Shadwick and Keating. ”A Universal Performance Measure.”Journal of PerformanceMeasurement, Spring 2002

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 36 / 68

40 60 80 100 120

40

60

80

mm

The Omega performance measure

0.6

0.8

1.0

Portfolio Returns Cumulative Distribution Function

Pro

port

ion <

= x

Omega Performance Measure

P/L Distribution

Density

1.0

1.5

0.6

0.8

1.0

Portfolio Returns Cumulative Distribution Function

Pro

port

ion <

= x 0

.60.8

1.0

Portfolio Returns Cumulative Distribution Function

Pro

port

ion <

= x

R Tools for Portfolio Optimization26

-0.5 0.0 0.5 1.0

0.0

0.2

0.4

daily return

Pro

port

ion <

= x

daily return

Density

-1.0 -0.5 0.0 0.5 1.0 1.5

0.0

0.5

-0.5 0.0 0.5 1.0

0.0

0.2

0.4

daily return

Pro

port

ion <

= x

a bL

-0.5 0.0 0.5 1.0

0.0

0.2

0.4

daily return

Pro

port

ion <

= x

a bLa bL

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 37 / 68

40 60 80 100 120

40

60

80

mm

MACD optimization

R Code:

> fastMA <- c(5,10,15)

> slowMA <- c(20,25,30)

> signalMA <- c(1,5,10)

> parm.comb <- expand.grid(fastMA=fastMA,slowMA=slowMA,signalMA=signalMA)

> head(parm.comb,12)

fastMA slowMA signalMA

1 5 20 1

2 10 20 1

3 15 20 1

4 5 25 1

5 10 25 1

6 15 25 1

7 5 30 1

8 10 30 1

9 15 30 1

10 5 20 5

11 10 20 5

12 15 20 5

> num.opts <- nrow(parm.comb)

> res.vec <- rep(NA,num.opts)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 38 / 68

40 60 80 100 120

40

60

80

mm

Optimization loop

R Code:

> for(i in 1:num.opts)

# initialize portfolio and orders

try(rm(list=ls(pos=.blotter),pos=.blotter),silent=TRUE)

try(rm(list=ls(pos=.strategy),pos=.strategy),silent=TRUE)

dummy <- initPortf(name=strat.name,symbols=stock.str, initDate=initDate)

initOrders(portfolio=strat.name,initDate=initDate)

# apply strategy

fastMA = parm.comb[i,"fastMA"]

slowMA = parm.comb[i,"slowMA"]

signalMA = parm.comb[i,"signalMA"]

out<-try(applyStrategy(strategy=strat, portfolios=strat.name,

parameters=list(nFast=fastMA, nSlow=slowMA, nSig=signalMA,maType=maType),

verbose=F))

# calculate performance matric

dummy <- updatePortf(Portfolio=strat.name,

Dates=paste('::',as.Date(Sys.time()),sep=''))

trading.pl <- getPortfolio(strat.name)$summary$Net.Trading.PL

rets <- trading.pl/initEq

omega <- as.numeric(Omega(rets))

res.vec[i] <- omega

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 39 / 68

40 60 80 100 120

40

60

80

mm

Optimization

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 40 / 68

40 60 80 100 120

40

60

80

mm

Optimization summary

Performed a true multi-parameter grid search on a multi-assetportfolio

Functionality not supported within TradeStation or similar packages

Optimal values:

fastMA = 15 (default = 12)slowMA = 25 (default = 26)signalMA = 10 (default = 9)

Process ran for approximately 8.5 hours on the RStudio cloud

Embarrassingly parallel problem that would be idea for any of R’sparallel computing capabilities (e.g. snow, NetWorkSpaces etc.)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 41 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 42 / 68

40 60 80 100 120

40

60

80

mm

RSI (Relative Strength Index)

Momentum oscillator (value between 0 and 100)

Published by Welles Wilder in the late 1970

RSI Calculation

RSI = 100 − 100

1 + RS

RS =mean(up changes)

mean(down changes)

typical lengths are 14-days, 9-days, or 25-days

Interpretation

Trade reversals between thresholds (e.g. 70/30)Trade break-outs above/below thresholds (e.g. 70/30)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 43 / 68

40 60 80 100 120

40

60

80

mm

Semiconductor HOLDR stocks

HOLDRS are ETFs that represent a basket of stocks in a specificindustry segment

The Semiconductor HOLDR includes large-cap semiconductormanufacturers as well as semiconductor equipment manufacturers

We’ll apply the RSI system to 5 components of the semiconductorHOLDR ETF

INTC - IntelTXN - Texas InstrumentAMAT - Applied MaterialsADI - Analog DevicesALTR - Altera

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 44 / 68

40 60 80 100 120

40

60

80

mm

Initialize currency and trading instruments

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz currency and stocks

> stock.str = c("INTC","TXN","AMAT","ADI","ALTR")

> for(symbol in stock.str)

stock(symbol, currency="USD",multiplier=1)

> # download stocks

> start.data <- as.Date("1998-12-22")

> end.data <- as.Date("2011-08-09")

> initDate <- start.data-1

> for(symbol in stock.str)

getSymbols(symbol,from=start.data,to=end.data,adjust=T)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 45 / 68

40 60 80 100 120

40

60

80

mm

Initialize portfolio, account, and orders object

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz portfolio, account, orders, strategy

> strat.name <- "RSI"

> initEq=1000000

> trade.percent = 0.05

> dummy <- initPortf(name=strat.name,symbols=stock.str, initDate=initDate)

> dummy <- initAcct(name=strat.name,portfolios=strat.name,

initDate=initDate, initEq=initEq)

> initOrders(portfolio=strat.name,initDate=initDate)

> strat <- strategy(strat.name)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 46 / 68

40 60 80 100 120

40

60

80

mm

Define indicators and signals

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # indicators:

> strat <- add.indicator(strategy = strat, name = "RSI",

arguments = list(price = quote(getPrice(mktdata))), label="RSI")

> # signals:

> strat <- add.signal(strategy = strat, name="sigThreshold",

arguments = list(threshold=70, column="RSI",relationship="gt", cross=TRUE),

label="RSI.gt.70")

> strat <- add.signal(strategy = strat, name="sigThreshold",

arguments = list(threshold=30, column="RSI",relationship="lt",cross=TRUE),

label="RSI.lt.30")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 47 / 68

40 60 80 100 120

40

60

80

mm

Define short entry and exit rules

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # rules:

> strat <- add.rule(strategy = strat, name='ruleSignal',

arguments = list(sigcol="RSI.gt.70", sigval=TRUE, orderqty=-1000,

ordertype='market', orderside='short', osFUN='osPercentEquity', replace=FALSE),

type='enter', path.dep=TRUE)

> strat <- add.rule(strategy = strat, name='ruleSignal',

arguments = list(sigcol="RSI.lt.30", sigval=TRUE, orderqty='all',

ordertype='market', orderside='short', replace=FALSE),

type='exit', path.dep=TRUE)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 48 / 68

40 60 80 100 120

40

60

80

mm

Define long entry and exit rules

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # rules:

> strat <- add.rule(strategy = strat, name='ruleSignal',

arguments = list(sigcol="RSI.lt.30", sigval=TRUE, orderqty= 1000,

ordertype='market', orderside='long', osFUN='osPercentEquity', replace=FALSE),

type='enter', path.dep=TRUE)

> strat <- add.rule(strategy = strat, name='ruleSignal',

arguments = list(sigcol="RSI.gt.70", sigval=TRUE, orderqty='all',

ordertype='market', orderside='long', replace=FALSE),

type='exit', path.dep=TRUE)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 49 / 68

40 60 80 100 120

40

60

80

mm

Applying the strategy to a portfolio

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # apply strategy

> out<-try(applyStrategy(strategy=strat, portfolios=strat.name,

parameters=list(n=2),verbose=F))

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 50 / 68

40 60 80 100 120

40

60

80

mm

Call updatePortf to update portfolio P&L

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> dummy <- updatePortf(Portfolio=strat.name,

Dates=paste('::',as.Date(Sys.time()),sep=''))

> if(sum(duplicated(index(getPortfolio(strat.name)$summary)))>0)

tempPortfolio <- getPortfolio(strat.name)

tempPortfolio$summary <- as.xts(aggregate(x=tempPortfolio$summary,

by=index(tempPortfolio$summary), FUN=sum))

assign(paste("portfolio.",strat.name,sep=""),tempPortfolio,pos=.blotter)

warning("duplicates removed after update")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 51 / 68

40 60 80 100 120

40

60

80

mm

Chart portfolio performance

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> chart_Posn(Portfolio=strat.name,Symbol="AMAT",Dates="2009::2011")

> plot(add_RSI())

> trading.pl <- getPortfolio(strat.name)$summary$Net.Trading.PL

> rets <- trading.pl/initEq

> charts.PerformanceSummary(rets,colorset = bluefocus,xlab="")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 52 / 68

40 60 80 100 120

40

60

80

mm

AMAT performance for RSI strategy

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 53 / 68

40 60 80 100 120

40

60

80

mm

RSI portfolio performance0.

00.

51.

01.

5

Cum

ulat

ive

Ret

urn

Net.Trading.PL Performance

−0.

020.

020.

04

Dai

ly R

etur

n

1998−12−21 2000−07−03 2002−01−02 2003−07−01 2005−01−03 2006−07−03 2008−01−02 2009−07−01 2011−01−03

−0.

15−

0.05

0.00

Dra

wdo

wn

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 54 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 55 / 68

40 60 80 100 120

40

60

80

mm

Bollinger bands

Bollinger bands are a volatility-sensitive price channel

Published by John Bollinger in the early 1980s

RSI Calculation

Calculate a simple moving average (typically 20 days) of the C (eitherthe close or weighted-close)Upper band: MA + N × StdDev(C )Lower band: MA− N × StdDev(C )N typically in the range of 2 to 3

Interpretation

Trade reversals between the upper and lower bandsTrade break-outs above/below the bands

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 56 / 68

40 60 80 100 120

40

60

80

mm

Oil services HOLDR stocks

HOLDRS are ETFs that represent a basket of stocks in a specificindustry segment

The oil services HOLDR includes companies specifically involved in oildrilling and related services

We’ll apply the Bollinger band system to 5 components of the oilservices HOLDR ETF

SLB - SchlumbergerRIG - TransoceanHAL - HaliburtonBHI - Baker HughesDO - Diamond Offshore

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 57 / 68

40 60 80 100 120

40

60

80

mm

Initialize currency and trading instruments

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz currency and stocks

> stock.str = c("SLB","RIG","HAL","BHI","DO")

> for(symbol in stock.str)

stock(symbol, currency="USD",multiplier=1)

> # download stocks

> start.data <- as.Date("1998-12-22")

> end.data <- as.Date("2011-08-09")

> initDate <- start.data-1

> for(symbol in stock.str)

getSymbols(symbol,from=start.data,to=end.data,adjust=T)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 58 / 68

40 60 80 100 120

40

60

80

mm

Initialize portfolio, account, and orders object

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # inz portfolio, account, orders, strategy

> strat.name <- "BBANDS"

> initEq=1000000

> trade.percent = 0.05

> dummy <- initPortf(name=strat.name,symbols=stock.str, initDate=initDate)

> dummy <- initAcct(name=strat.name,portfolios=strat.name,

initDate=initDate, initEq=initEq)

> initOrders(portfolio=strat.name,initDate=initDate)

> strat <- strategy(strat.name)

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 59 / 68

40 60 80 100 120

40

60

80

mm

Define indicators and signals

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # indicators:

> strat <- add.indicator(strategy = strat, name = "BBands",

arguments = list(HLC = quote(HLC(mktdata)), maType='SMA'))

> # signals:

> strat <- add.signal(strat,name="sigCrossover",

arguments = list(columns=c("Close","up"),relationship="gt"),

label="Cl.gt.UpperBand")

> strat <- add.signal(strat,name="sigCrossover",

arguments = list(columns=c("Close","dn"),relationship="lt"),

label="Cl.lt.LowerBand")

> strat <- add.signal(strat,name="sigCrossover",

arguments = list(columns=c("High","Low","mavg"),relationship="op"),

label="Cross.Mid")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 60 / 68

40 60 80 100 120

40

60

80

mm

Define entry and exit rules

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # rules:

> strat <- add.rule(strat,name='ruleSignal',

arguments = list(sigcol="Cl.gt.UpperBand",sigval=TRUE, orderqty=-100,

ordertype='market', orderside=NULL, threshold=NULL),type='enter')

> strat <- add.rule(strat,name='ruleSignal',

arguments = list(sigcol="Cl.lt.LowerBand",sigval=TRUE, orderqty= 100,

ordertype='market', orderside=NULL, threshold=NULL),type='enter')

> strat <- add.rule(strat,name='ruleSignal',

arguments = list(sigcol="Cross.Mid",sigval=TRUE, orderqty= 'all',

ordertype='market', orderside=NULL, threshold=NULL),type='exit')

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 61 / 68

40 60 80 100 120

40

60

80

mm

Applying the strategy to a portfolio

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> # parameters:

> SD = 2

> N = 20

> # apply strategy

> out<-try(applyStrategy(strategy=strat, portfolios=strat.name,

parameters=list(sd=SD,n=N),verbose=F))

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 62 / 68

40 60 80 100 120

40

60

80

mm

Call updatePortf to update portfolio P&L

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> dummy <- updatePortf(Portfolio=strat.name,

Dates=paste('::',as.Date(Sys.time()),sep=''))

> if(sum(duplicated(index(getPortfolio(strat.name)$summary)))>0)

tempPortfolio <- getPortfolio(strat.name)

tempPortfolio$summary <- as.xts(aggregate(x=tempPortfolio$summary,

by=index(tempPortfolio$summary), FUN=sum))

assign(paste("portfolio.",strat.name,sep=""),tempPortfolio,pos=.blotter)

warning("duplicates removed after update")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 63 / 68

40 60 80 100 120

40

60

80

mm

Chart portfolio performance

Initialize portfolio, account, orders,

strategy

Add indicators, signals, and rules

Generate performance reports

and graphs

Initialize currency and

instruments, and load historic data

Apply strategy to portfolio

InitializationBar-by-bar processing

Reporting

Update portfolio, account, equity

Define strategy Update

R Code:

> chart_Posn(Portfolio=strat.name,Symbol="DO",Dates="2009::2011")

> plot(add_BBands())

> trading.pl <- getPortfolio(strat.name)$summary$Net.Trading.PL

> rets <- trading.pl/initEq

> charts.PerformanceSummary(rets,colorset = bluefocus,xlab="")

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 64 / 68

40 60 80 100 120

40

60

80

mm

DO performance for BBands strategy

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 65 / 68

40 60 80 100 120

40

60

80

mm

Bollinger bands portfolio performance0.

000.

010.

020.

03

Cum

ulat

ive

Ret

urn

Net.Trading.PL Performance

−0.

010

0.00

00.

010

Dai

ly R

etur

n

1998−12−21 2000−07−03 2002−01−02 2003−07−01 2005−01−03 2006−07−03 2008−01−02 2009−07−01 2011−01−03

−0.

025

−0.

010

Dra

wdo

wn

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 66 / 68

40 60 80 100 120

40

60

80

mm

Outline

1 MACD example

2 MACD example extended to multiple assets

3 Optimizing the MACD trading system

4 RSI example

5 Bollinger band example

6 Summary

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 67 / 68

40 60 80 100 120

40

60

80

mm

Summary of blotter and quantstrat

Transaction infrastructure for defining instruments, transactions,portfolios and accounts for trading systems and simulation. Providesportfolio support for multi-asset class and multi-currency portfolios.Still in heavy development.

Despite beta-status, software is used everyday by hearty workingprofessions in asset management

Inherent flexibility provided by R allows analysis that is stillunavailable in some dedicated commercial packages

Although the software is free, be prepared to pay some dues in terms oftime and effort to get things working

R-SIG-FINANCE is your friend

Guy Yollin (Copyright© 2011) Quantitative Trading Strategies in R quantstrat-III 68 / 68

top related