[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