[R-SIG-Finance] Guy's example osFixedDollar not working in latest quantstrat

Jim Green student.northwestern at gmail.com
Fri May 11 03:13:19 CEST 2012


current svn version of quantstrat already fixed the order sizing
problem. Many thanks to Brian and the patch author!

Jim.

On 12 April 2012 21:15, Jim Green <student.northwestern at gmail.com> wrote:
> Good Evening!
>
> I was studying the Guy Yollin's presentation on quantstrat
> http://www.r-programming.org/files/quantstrat-II.pdf  and can't
> reproduce the result in latest quantstrat. Actually osFixedDollar was
> not even called per my basic logging. I've attached the pdf chart and
> the runnable code and the results on my machine. Hope someone could
> help..
>
> Thanks!
> Jim.
>
>
> ### code ###
>
> #!/usr/bin/env Rscript
> library(quantstrat)
> library(logging)
> basicConfig()
>
> # define stock list
> stock.str=c("SPY")
> # inz currency and stocks
> dummy <- currency('USD')
> for(symbol in stock.str){
>         stock(symbol, currency="USD",multiplier=1)
> }
> # download stocks
> start.date <- as.Date("2001-01-01")
> initDate <- start.date-1
> end.date <-as.Date("2011-08-06")
> getSymbols(stock.str,from=start.date,to=end.date,adjust=T)
>
> # inz portfolio, account, orders, strategy
> strat.name <- "MAX"
> initEq=1000000
> trade.percent <- 0.01
> tradeSize <- initEq * trade.percent
> 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)
>
> # indicators:
> strat <- add.indicator(strategy = strat, name = "SMA", arguments =
> list(x=quote(Cl(mktdata)), n=50),label= "ma50" )
> strat <- add.indicator(strategy = strat, name = "SMA", arguments =
> list(x=quote(Cl(mktdata)), n=200),label= "ma200")
> # signals:
> strat <- add.signal(strategy = strat,name="sigCrossover", arguments =
> list(columns=c("ma50","ma200"), relationship="gte"),
> label="ma50.gt.ma200")
> strat <- add.signal(strategy = strat,name="sigCrossover", arguments =
> list(column=c("ma50","ma200"),relationship="lt"),
> label="ma50.lt.ma200")
>
> osFixedDollar <- function(timestamp,orderqty, portfolio, symbol, ruletype, ...)
> {
>   logwarn("started osFixedDollar")
>   ClosePrice <- as.numeric(Cl(mktdata[timestamp,]))
>   orderqty <- sign(orderqty)*round(tradeSize/ClosePrice)
>   return(orderqty)
> }
>
> # rules:
> strat <- add.rule(
>   strategy = strat,
>   name='ruleSignal',
>   arguments = list(sigcol="ma50.gt.ma200",sigval=TRUE, orderqty=100,
> ordertype='market', orderside='long', osFUN='osFixedDollar'),
>   type='enter'
> )
>
> strat <- add.rule(
>   strategy = strat,
>   name='ruleSignal',
>   arguments = list(sigcol="ma50.lt.ma200",sigval=TRUE,
> orderqty='all', ordertype='market', orderside='long'),
>   type='exit'
> )
>
> out <- try(applyStrategy(strategy=strat , portfolios=strat.name, verbose=TRUE))
> getTxns(Portfolio=strat.name, Symbol=stock.str)
> getPortfolio(strat.name)$summary
> dummy <- updatePortf(Portfolio=strat.name,
>   Dates=paste('::',as.Date(Sys.time()),sep='')
> )
>
> pdf("quantstrat2_position_sizing_fixed.pdf")
> chart.Posn(Portfolio=strat.name,Symbol=stock.str)
> add_SMA(n=50 , on=1,col='blue',lwd=2)
> add_SMA(n=200, on=1,col='red',lwd=2)
>
> ### output ###
> [1] "SPY"
> [1] "2002-04-24 SPY 100 @ 91.9933301492183"
> [1] "2002-04-29 SPY -100 @ 89.8492574695683"
> [1] "2002-04-30 SPY 100 @ 90.6900702851173"
> [1] "2002-05-14 SPY -100 @ 92.674388529813"
> [1] "2003-05-12 SPY 100 @ 81.1354076349475"
> [1] "2004-08-25 SPY -100 @ 96.8566013672453"
> [1] "2004-10-27 SPY 100 @ 98.8180303441752"
> [1] "2006-07-25 SPY -100 @ 114.662711057191"
> [1] "2006-08-29 SPY 100 @ 118.211406993905"
> [1] "2007-12-28 SPY -100 @ 137.165700378348"
> [1] "2009-06-18 SPY 100 @ 88.5716570825431"
> [1] "2010-07-06 SPY -100 @ 100.84667390332"
> [1] "2010-10-15 SPY 100 @ 116.002709490181"
>                   Txn.Qty Txn.Price Txn.Fees  Txn.Value Txn.Avg.Cost
> 2000-12-30 19:00:00       0   0.00000        0      0.000      0.00000
> 2002-04-24 00:00:00     100  91.99333        0   9199.333     91.99333
> 2002-04-29 00:00:00    -100  89.84926        0  -8984.926     89.84926
> 2002-04-30 00:00:00     100  90.69007        0   9069.007     90.69007
> 2002-05-14 00:00:00    -100  92.67439        0  -9267.439     92.67439
> 2003-05-12 00:00:00     100  81.13541        0   8113.541     81.13541
> 2004-08-25 00:00:00    -100  96.85660        0  -9685.660     96.85660
> 2004-10-27 00:00:00     100  98.81803        0   9881.803     98.81803
> 2006-07-25 00:00:00    -100 114.66271        0 -11466.271    114.66271
> 2006-08-29 00:00:00     100 118.21141        0  11821.141    118.21141
> 2007-12-28 00:00:00    -100 137.16570        0 -13716.570    137.16570
> 2009-06-18 00:00:00     100  88.57166        0   8857.166     88.57166
> 2010-07-06 00:00:00    -100 100.84667        0 -10084.667    100.84667
> 2010-10-15 00:00:00     100 116.00271        0  11600.271    116.00271
>                   Net.Txn.Realized.PL
> 2000-12-30 19:00:00              0.0000
> 2002-04-24 00:00:00              0.0000
> 2002-04-29 00:00:00           -214.4073
> 2002-04-30 00:00:00              0.0000
> 2002-05-14 00:00:00            198.4318
> 2003-05-12 00:00:00              0.0000
> 2004-08-25 00:00:00           1572.1194
> 2004-10-27 00:00:00              0.0000
> 2006-07-25 00:00:00           1584.4681
> 2006-08-29 00:00:00              0.0000
> 2007-12-28 00:00:00           1895.4293
> 2009-06-18 00:00:00              0.0000
> 2010-07-06 00:00:00           1227.5017
> 2010-10-15 00:00:00              0.0000
>                   Long.Value Short.Value Net.Value Gross.Value Realized.PL
> 2000-12-30 19:00:00          0           0         0           0           0
>                   Unrealized.PL Gross.Trading.PL Txn.Fees Net.Trading.PL
> 2000-12-30 19:00:00             0                0        0              0
>
>
> ### sessioninfo()###
>> sessionInfo()
> R version 2.14.2 (2012-02-29)
> Platform: x86_64-unknown-linux-gnu (64-bit)
>
> locale:
>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>  [7] LC_PAPER=C                 LC_NAME=C
>  [9] LC_ADDRESS=C               LC_TELEPHONE=C
> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>
> attached base packages:
> [1] graphics  grDevices utils     datasets  stats     methods   base
>
> other attached packages:
>  [1] PerformanceAnalytics_1.0.4.4 quantstrat_0.6.4
>  [3] blotter_0.8.4                FinancialInstrument_0.13.6
>  [5] RPostgreSQL_0.3-2            DBI_0.2-5
>  [7] quantmod_0.3-17              TTR_0.21-1
>  [9] Defaults_1.1-1               xts_0.8-6
> [11] zoo_1.7-7
>
> loaded via a namespace (and not attached):
> [1] grid_2.14.2    lattice_0.20-0



More information about the R-SIG-Finance mailing list