[Blotter-commits] r287 - pkg/quantstrat/demo

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Tue Mar 16 15:37:31 CET 2010


Author: peter_carl
Date: 2010-03-16 15:37:31 +0100 (Tue, 16 Mar 2010)
New Revision: 287

Added:
   pkg/quantstrat/demo/faber.R
Log:
- demo of a long term trend system


Added: pkg/quantstrat/demo/faber.R
===================================================================
--- pkg/quantstrat/demo/faber.R	                        (rev 0)
+++ pkg/quantstrat/demo/faber.R	2010-03-16 14:37:31 UTC (rev 287)
@@ -0,0 +1,136 @@
+# This is a very simple trend following strategy for testing the results of:
+# Faber, Mebane T., "A Quantitative Approach to Tactical Asset Allocation." 
+# Journal of Risk Management (Spring 2007).
+# The article proposes a very simple quantitative market-timing model.  They 
+# test the model in sample on the US stock market since 1900 before testing
+# it out-of-sample in twenty other markets.
+
+# The article discusses a 200-day simple moving average, which is proposed
+# in Jeremy Seigel's book "Stocks for the Long Run" for timing the DJIA.  He 
+# concludes that a simple market timing strategy improves the absolute and
+# risk adjusted returns over a buy-and-hold strategy.  After all transaction
+# costs are included, the timing strategy falls short on the absolute return,
+# but still provides a better risk-adjusted return.  Siegel also tests timing on  
+# the Nasdaq composite since 1972 and finds better absolute and risk adjusted
+# returns.
+
+# The article implements a simpler version of the 200-day SMA, opting for a
+# 10-month SMA.  Monthly data is more easily available for long periods of time,
+# and the lower granularity should translate to lower transaction costs.  
+
+# The rules of the system are relatively simple:
+# - Buy when monthly price > 10-month SMA
+# - Sell and move to cash when monthly price < 10-month SMA
+
+# 1. All entry and exit prices are on the day of the signal at the close.
+# 2. All data series are total return series including dividends, updated monthly. 
+#    For the purposes of this demo, we only use price returns.
+# 3. Cash returns are estimated with 90-day commercial paper.  Margin rates for
+#    leveraged models are estimated with the broker call rate.  Again, for the
+#    purposes of this demo, we ignore interest and leverage.
+# 4. Taxes, commissions, and slippage are excluded.
+
+# This simple strategy is different from well-known trend-following systems in
+# three respects.  First, there's no shorting.  Positions are converted to cash on
+# a 'sell' signal, rather than taking a short position. Second, the entire position
+# is put on at trade inception.  No assumptions are made about increasing position
+# size as the trend progresses.  Third, there are no stops.  If the trend reverts
+# quickly, this system will wait for a sell signal before selling the position.
+
+# Data
+# Instead of using total returns data, this demo uses monthly data for the SP500
+# downloaded from Yahoo Finance.  We'll use about 10 years of data, starting at 
+# the beginning of 1998.
+
+# Load required libraries
+require(quantstrat)
+
+# Try to clean up in case the demo was run previously
+try(rm("account.longtrend","portfolio.longtrend",pos=.blotter),silent=TRUE)
+try(rm("ltaccount","ltportfolio","ClosePrice","CurrentDate","equity","GSPC","i","initDate","initEq","Posn","UnitSize","verbose"),silent=TRUE)
+try(rm("order_book.longtrend",pos=.strategy),silent=TRUE)
+
+# Set initial values
+initDate='1997-12-31'
+initEq=100000
+
+# Set up instruments with FinancialInstruments package
+currency("USD")
+symbols = c("XLF", "XLP", "XLE", "XLY", "XLV", "XLI", "XLB", "XLK", "XLU")
+for(symbol in symbols){ # establish tradable instruments
+    stock(symbol, currency="USD",multiplier=1)
+}
+
+# Load data with quantmod
+#getSymbols(symbols, src='yahoo', index.class=c("POSIXt","POSIXct"), from='1998-01-01')
+### Download monthly data instead?
+### GSPC=to.monthly(GSPC, indexAt='endof')
+getSymbols(symbols, src='yahoo', index.class=c("POSIXt","POSIXct"), from='1999-01-01')
+for(symbol in symbols) {
+    x<-get(symbol)
+    x<-to.monthly(x,indexAt='lastof',drop.time=TRUE)
+    indexFormat(x)<-'%Y-%m-%d'
+    colnames(x)<-gsub("x",symbol,colnames(x))
+    assign(symbol,x)
+}
+
+# Initialize portfolio and account
+initPortf('longtrend', symbols=symbols, initDate=initDate)
+initAcct('longtrend', portfolios='longtrend', initDate=initDate)
+initOrders(portfolio='longtrend', initDate=initDate)
+
+print("setup completed")
+
+# Initialize a strategy object
+s <- strategy("longtrend")
+
+# Add an indicator
+s <- add.indicator(strategy = s, name = "SMA", arguments = list(x = quote(Cl(mktdata)), n=10), label="SMA10")
+
+# There are two signals:
+# The first is when monthly price crosses over the 10-month SMA
+s<- add.signal(s,name="sigCrossover",arguments = list(data=quote(mktdata),columns=c("Close","SMA10"),relationship="gt"),label="Cl.gt.SMA")
+# The second is when the monthly price crosses under the 10-month SMA
+s<- add.signal(s,name="sigCrossover",arguments = list(data=quote(mktdata),columns=c("Close","SMA10"),relationship="lt"),label="Cl.lt.SMA")
+
+# There are two rules:
+# The first is to buy when the price crosses above the SMA
+s <- add.rule(s, name='ruleSignal', arguments = list(data=quote(mktdata), sigcol="Cl.gt.SMA", sigval=TRUE, orderqty=1000, ordertype='market', orderside='long', pricemethod='market'), type='enter', path.dep=TRUE)
+# The second is to sell when the price crosses below the SMA
+s <- add.rule(s, name='ruleSignal', arguments = list(data=quote(mktdata), sigcol="Cl.lt.SMA", sigval=TRUE, orderqty='all', ordertype='market', orderside='long', pricemethod='market'), type='exit', path.dep=TRUE)
+
+# Process the indicators and generate trades
+start_t<-Sys.time()
+out<-try(applyStrategy(strategy='s' , portfolios='longtrend'))
+end_t<-Sys.time()
+print("Strategy Loop:")
+print(end_t-start_t)
+
+# look at the order book
+#print(getOrderBook('longtrend'))
+
+start_t<-Sys.time()
+updatePortf(Portfolio='longtrend',Dates=paste('::',as.Date(Sys.time()),sep=''))
+end_t<-Sys.time()
+print("trade blotter portfolio update:")
+print(end_t-start_t)
+
+for(symbol in symbols){
+    dev.new()
+    chart.Posn(Portfolio='longtrend',Symbol=symbol,theme=chartTheme('white', up.col='lightgreen', dn.col='pink'), type='bar')
+    plot(addSMA(n=10,col='darkgreen', on=1))
+}
+
+
+###############################################################################
+# R (http://r-project.org/) Quantitative Strategy Model Framework
+#
+# Copyright (c) 2009-2010
+# Peter Carl, Dirk Eddelbuettel, Brian G. Peterson, Jeffrey Ryan, and Joshua Ulrich 
+#
+# This library is distributed under the terms of the GNU Public License (GPL)
+# for full details see the file COPYING
+#
+# $Id$
+#
+###############################################################################
\ No newline at end of file


Property changes on: pkg/quantstrat/demo/faber.R
___________________________________________________________________
Name: svn:keywords
   + Revision Id Date Author



More information about the Blotter-commits mailing list