## FOMC Cycle Trading Strategy in Quantstrat

Another hotly anticipated FOMC meeting kicks off next week, so I thought it would be timely to highlight a less well-known working paper, “Stock Returns over the FOMC Cycle”, by Cieslak, Morse and Vissing-Jorgensen (current draft June 2014). Its main result is:

Over the last 20 years, the average excess return on stocks over Treasury bills follows a bi-weekly pattern over the Federal Open Market Committee meeting cycle. The equity premium over this 20-year period was earned entirely in weeks 0, 2, 4 and 6 in FOMC cycle time, with week 0 starting the day before a scheduled FOMC announcement day.

In this post, we’ll look to recreate their cycle pattern and then backtest a trading strategy to test the claim of economic significance. Another objective is to evaluate the R package Quantstrat “for constructing trading systems and simulation.”

## Data

Although the authors used 20 years of excess return data from 1994 to 2013, instead we’ll use S&P500 ETF (SPY) data from 1994 to March 2015 and the FOMC dates (from my previous post here http://www.returnandrisk.com/2015/01/fomc-dates-full-history-web-scrape.html).

As there is not a lot of out-of-sample data since the release of the paper in 2014, we’ll use all the data to detect the pattern, and then proceed to check the impact of transaction costs on the economic significance of one possible FOMC cycle trading strategy.

+ Show R code to setup and pre-process the required data

## FOMC Cycle Pattern

The chart and table below clearly show the bi-weekly pattern over the FOMC Cycle of Cieslak et al in SPY 5-day returns. This is based on calendar weekdays (i.e. day count includes holidays), with week 0 starting one day before a scheduled FOMC announcement day (i.e. on day -1). Returns in even weeks (weeks 0, 2, 4, 6) are positive, while those in odd weeks (weeks -1, 1, 3, 5) are lower and mostly slightly negative.

### Table of Returns by FOMC Week, Days & Phase

Week Days Phase Average 5-day Return (%)
-1 -6 to -2 Low 0.14
0 -1 to 3 High 0.59
1 4 to 8 Low -0.05
2 9 to 13 High 0.32
3 14 to 18 Low -0.12
4 19 to 23 High 0.45
5 24 to 28 Low -0.10
6 29 to 33 High 0.69
+ Show R code for the custom indicator function for the FOMC cycle and the above chart

## Economic Significance: FOMC Cycle Trading Strategy Using Quantstrat

In this section, we’ll create a trading strategy using the R Quantstrat package to test the claim of economic significance of the pattern. Note, Quantstrat is “still in heavy development” and as such is not available on CRAN but needs to be downloaded from the development web site. Nonetheless, it's been around for some time and it should be up to the backtesting task…

Based on the paper’s main result and our table above confirming the high-phase is more profitable, we’ll backtest a long only strategy that buys the SPY on even weeks (weeks 0, 2, 4, 6) and holds for 5 calendar days only, and compare it to a buy and hold strategy. In addition, we’ll look at the effect of transaction costs on overall returns.

A few things to note:

• We’ll use a bet size of 100% of equity for all trades. This may not be optimal in developing trading systems but will allow for easy comparison with the buy and hold passive strategy, which is 100% allocated
• Assume 5 basis points (0.05%) in execution costs (including commission and slippage), and initial equity of $100,000 • Execution occurs on the close of the same day that the buy/sell signal happens. Unfortunately, Quantstrat does not allow this out-of-the-box, so we need to do a hack - a custom indicator function that shifts the signals forward in time (see “get.fomc.cycle” function above) The following are the resulting performance metrics for the trading strategy, using 5 basis points for transaction costs, and comparisons with the passive buy and hold strategy (before and after transaction costs). ### Summary Performance for Trading Strategy ## return ## Annualized Return 0.0855 ## Annualized Std Dev 0.1382 ## Annualized Sharpe (Rf=0%) 0.6183 ### Trade Statistics ## Symbol Num.Trades Percent.Positive Net.Trading.PL Profit.Factor ## spy spy 525 59.61905 468196.8 1.587279 ## Max.Drawdown ## spy -107436.8 ### Monthly Returns ## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Total ## 1994 NA -2.4 -1.8 0.5 1.2 2.6 0.1 -0.9 0.2 5.7 0.3 0.4 5.8 ## 1995 0.9 3.2 0.3 1.9 1.8 0.8 2.1 0.1 1.7 -0.9 1.0 0.2 13.9 ## 1996 3.6 -3.3 1.5 -1.6 2.9 1.3 -0.8 3.1 0.8 -1.5 1.2 -0.3 6.9 ## 1997 3.1 -0.3 0.4 -3.5 3.1 1.5 3.6 2.8 5.8 -2.6 3.1 5.3 24.1 ## 1998 4.5 3.2 2.5 3.7 1.1 1.8 1.2 -5.6 -0.1 9.4 0.0 5.4 29.6 ## 1999 1.9 0.9 2.2 -3.8 -0.5 8.9 0.8 3.2 -4.7 8.3 0.9 5.8 25.4 ## 2000 -2.7 -0.3 6.1 6.3 1.0 2.9 0.6 0.3 -2.5 2.3 -3.7 0.6 10.8 ## 2001 0.1 -6.1 0.0 2.2 2.3 -2.7 3.5 0.8 -15.7 0.5 4.2 -2.2 -13.9 ## 2002 -3.1 -3.9 2.5 -0.5 -3.9 -2.1 0.6 -1.1 -2.5 5.8 -0.1 -5.9 -13.8 ## 2003 2.6 1.5 3.4 6.8 -0.9 3.4 1.4 2.9 1.4 4.6 1.8 1.7 35.2 ## 2004 -1.3 1.2 1.6 0.7 -1.3 0.6 -1.2 1.0 -0.9 -2.4 1.6 0.4 0.0 ## 2005 -0.6 1.2 0.4 1.5 3.3 0.9 1.8 -1.4 0.0 -3.2 1.2 -0.3 4.6 ## 2006 -0.8 -0.4 1.9 -0.6 -0.6 0.3 -1.5 -1.8 -0.8 1.6 -1.3 1.6 -2.6 ## 2007 2.6 -0.8 -0.6 2.3 -1.0 -0.4 -0.7 2.9 1.3 -2.1 2.1 -3.2 2.2 ## 2008 0.5 -1.4 2.3 6.4 5.6 -4.2 -2.5 1.9 -8.4 15.3 -2.2 -5.9 5.5 ## 2009 -2.8 -6.4 5.0 3.9 7.8 4.7 3.5 -3.3 2.8 0.6 4.4 -0.5 20.5 ## 2010 -1.7 3.0 2.1 -1.8 0.6 0.0 9.7 -4.4 2.4 2.0 2.6 4.0 19.5 ## 2011 1.2 -0.1 -1.1 1.7 -0.5 -1.1 0.8 2.8 -5.2 13.3 0.0 -4.0 6.9 ## 2012 0.5 1.0 3.1 0.1 -2.3 0.0 -2.1 1.9 1.6 -1.4 -1.4 0.8 1.8 ## 2013 0.3 1.7 0.7 0.8 2.0 -3.6 2.2 -3.0 0.1 1.2 1.8 2.4 6.5 ## 2014 -0.3 0.5 -0.9 1.3 0.5 1.2 -1.8 2.3 0.1 3.8 0.0 2.1 9.0 ## 2015 -5.4 3.3 0.6 NA NA NA NA NA NA NA NA NA -1.7 ### Summary Performance for Benchmark Buy and Hold Strategy ## return ## Annualized Return 0.0915 ## Annualized Std Dev 0.1935 ## Annualized Sharpe (Rf=0%) 0.4727 ### Comparison of Trading Strategy with Buy and Hold (BEFORE transaction costs) ### Comparison of Trading Strategy with Buy and Hold (AFTER transaction costs) + Show R code for the trading strategy using Quantstrat ## Conclusion ### FOMC Cycle Pattern We were able to clearly see the bi-weekly pattern over the FOMC cycle using SPY data, a la Cieslak, Morse and Vissing-Jorgensen. ### Economic Significance: FOMC Cycle Trading Strategy Before transaction costs, we were able to reproduce similar results to the paper, with the long only strategy of buying the SPY in even weeks and holding for 5 days. In our case, this strategy added about 2% p.a. to buy and hold returns, reduced volatility by 30% and increased the Sharpe ratio by 70% to 0.82 (from 0.47). However, after allowing for a reasonable 5 basis points (0.05%) in execution costs, annualized returns fall below that of the buy and hold strategy (9.15%) to 8.55%. As volatility remains lower, this means the risk-adjusted performance is better by only 30% now (Sharpe ratio of 0.62). See table below for details. Buy and Hold Long Only before Transaction Costs Long Only with 5bp Transaction Costs Annualized Return 0.0915 0.1129 0.0855 Annualized Std Dev 0.1935 0.1382 0.1382 Annualized Sharpe (Rf=0%) 0.4727 0.8169 0.6183 Execution costs (brokerage and slippage) can have a material impact on trading system performance. So the key takeaway is to be explicit in accounting for them when claiming economic significance. There are a lot of backtests out there that don’t… ### Quantstrat There is a bit of a learning curve with the Quantstrat package but once you get used to it, it’s a solid backtesting platform. In addition, it has other capabilities like optimization and walk-forward testing. The main issue I have is that it doesn’t natively allow you to execute on the daily close when you get a signal on that day’s close - you need to do a hack. This puts it at a bit of a disadvantage to other software like TradeStation, MultiCharts, NinjaTrader and Amibroker (presumably MatLab too). Hopefully the developers will reconsider this, to help drive higher adoption of their gReat package… #### Wednesday, 4 March 2015 ## Update on The Pre-FOMC Announcement Drift In the February 2015 edition of The Journal of Finance, a well known academic paper, “The Pre-FOMC Announcement Drift”, was finally published, almost 4 years after the working paper was released in the public domain in 2011. Authored by researchers, Lucca and Moench, at the US Federal Reserve, it documents the tendency for the S&P500 Index to rise in the 24 hours prior to scheduled FOMC announcements. However, perhaps somewhat surprisingly, no such pattern is observed for interest rate markets like Eurodollar rates or 10-year Treasuries. The paper can be downloaded from here http://onlinelibrary.wiley.com/doi/10.1111/jofi.12196/abstract. Since it’s been public information for some time now, I thought it would be interesting to check whether the drift continues. In this post, we’ll first try to reproduce the essential result of their work (in-sample) and then look at the post-public domain results (out-of-sample). Note, we won’t be trying to exactly replicate their research, but will use other interesting quant techniques nonetheless. ## Data Lucca and Moench used intra-day S&P500 data (2pm on the day prior to the announcement to 2pm on the day of the announcement) to… …show that since 1994, the S&P500 Index has on average increased 49 basis points in the 24-hours before scheduled FOMC announcements. As we don’t have ready access to such data, we’ll use daily close data for the S&P500 ETF (SPY) as a proxy. You could think of this as also checking the robustness of their result, by shifting the return calculation from 2pm to 4pm. In addition, their post-1994 sample was conducted from September 1994 to March 2011, but since we have both the SPY price data and the FOMC dates (from my previous post here http://www.returnandrisk.com/2015/01/fomc-dates-full-history-web-scrape.html), we’ll define in-sample as the period from January 1994 to March 2011, and out-of-sample as April 2011 to January 2015. Also, since we can easily get risk-free rate data from the Kenneth French Data Library http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html via Quandl, we’ll conduct our study using excess returns i.e. simple SPY percent return less risk-free rate of return. Here is the R code to setup and pre-process the required data: ################################################################################ # install packages and load them # ################################################################################ install.packages(c("quantmod", "Quandl", "boot", "eventstudies", "compute.es", "pwr", "stargazer"), repos = "http://cran.us.r-project.org") library(quantmod) library(Quandl) library(boot) library(eventstudies) library(stargazer) library(compute.es) library(pwr) ################################################################################ # get data # ################################################################################ # download csv file of FOMC announcement dates from previous post into working # directory, and read into R download.file( "https://docs.google.com/uc?export=download&id=0B4oNodML7SgSMlZxYW4yWTZabGs", "fomcdatesall.csv") fomcdatesall <- read.csv("fomcdatesall.csv", colClasses = c(rep("Date", 2), rep("numeric", 2), rep("character", 2)), stringsAsFactors = FALSE) # get S&P500 ETF prices getSymbols("SPY", from = "1994-01-01", to = "2015-02-28") # get fama french factors from quandl FF <- Quandl("KFRENCH/FACTORS_D", type="xts") # get daily risk-free rate of return i.e. "The Tbill return is the simple daily # rate that, over the number of trading days in the month, compounds to 1-month # TBill rate from Ibbotson and Associates, Inc." rets.rf <- FF["1994-01-01/2015-02-28", "RF"] / 100 # calculate SPY 1-day simple returns (close-to-close) rets <- cbind(ROC(SPY[, "SPY.Adjusted"], type = "discrete")[-1], rets.rf[-1]) rets$RF <- na.locf(rets$RF) # no Feb 2015 data at time of writing # calculate SPY excess return over risk-free tbill return xs.rets <- rets[, 1] - rets[, 2] names(xs.rets) <- "xs.ret" ################################################################################ # create in-sample data - Jan 1994 to Mar 2011 # ################################################################################ ins.dates <- subset(fomcdatesall, begdate > "1994-01-01" & begdate < as.Date("2011-03-31") & scheduled == 1, select = c(begdate, enddate)) # get in-sample SPY 1-day excess simple returns (close-to-close) ins.xs.rets <- xs.rets["/2011-03-31"] # get returns on fomc dates ins.xs.fomcrets <- ins.xs.rets[ins.dates$enddate, ]
# get returns on nonfomc dates
ins.xs.nonfomcrets <- ins.xs.rets[-which(index(ins.xs.rets)
%in% ins.dates$enddate), ] ################################################################################ # create out-of-sample data - Apr 2011 to Jan 2015 # ################################################################################ oos.dates <- subset(fomcdatesall, begdate > as.Date("2011-03-31") & begdate < as.Date("2015-02-28") & scheduled == 1, select = c(begdate, enddate)) # get out-of-sample SPY 1-day excess simple returns (close-to-close) oos.xs.rets <- xs.rets["2011-04-01/2015-02-28"] # get returns on fomc dates oos.xs.fomcrets <- oos.xs.rets[oos.dates$enddate, ]
# get returns on nonfomc dates
oos.xs.nonfomcrets <- oos.xs.rets[-which(index(oos.xs.rets)
%in% oos.dates$enddate), ] ## In-sample Analysis: Jan 1994 - Mar 2011 Lucca and Moench conducted what is known as an event study or empirical research method that enables one to study the impact of an event (e.g. FOMC announcements) on prices/returns (e.g. S&P500 Index). So let’s do something similar… ### Event Study There’s an R package, eventstudies, which has some handy functions to do event studies, so we’ll use it and then create a chart to visualize the findings for the 138 scheduled FOMC meetings from January 1994 to March 2011. Below is the R code snippet for the event study: ################################################################################ # in-sample event study # ################################################################################ # event study function plot.es <- function(dates, returns, window = 5) { # prepare data for event study ins.events <- data.frame(unit = names(returns), when = dates[, "enddate"], stringsAsFactors = FALSE) # map returns to event time e.g. event time index = 0 is mapped to calendar # end date of fomc meeting rets.evt <- phys2eventtime(z = returns, events = ins.events, width = window) # get 5-day window of returns either side of end date of fomc meeting rets.window <- window(x = rets.evt$z.e, start = -window, end = window)
# calculate cumulative return over entire window
rets.cum <- remap.cumprod(rets.window, is.pc = FALSE, is.returns = TRUE,
base = 1)
mean.rets.cum <- (rowMeans(rets.cum, na.rm = TRUE) - 1) * 100
# plot event study chart
plot(-window:window, mean.rets.cum, type = "l", lwd = 1,
xlab = "Days Relative to Announcement Date",
ylab = "Cumulative Excess Returns (%)",
main = paste("Cumulative SPY Excess Returns Around FOMC Announcements"),
xaxt = "n")
axis(1, at = seq(-window, window, by = 1))
points(-window:window, mean.rets.cum)
text(-window:window, mean.rets.cum, round(mean.rets.cum, 2),
adj = c(-0.25, 1), cex = 0.7)
abline(v = 0, h = 0)
abline(v = -1, lty = 2, col = "blue")
}

plot.es(ins.dates, ins.xs.rets, 5)

The event study chart below clearly shows the pop in the SPY returns in the 1-day period before the FOMC announcement, which in our setup is about +0.33% (0.52% - 0.19%). This is the key finding of the paper. In addition, there is a noticeable drift higher on T-1 of +0.20% (0.19% - -0.01%).

### Summary Statistics: FOMC and Non-FOMC Dates

Here are the in-sample summary statistics and a plot of the FOMC excess returns.

## Summary Statistics for In-sample FOMC Dates
## ============================================
## Statistic  N   Mean  St. Dev.   Min    Max
## --------------------------------------------
## xs.ret    138 0.0033  0.0117  -0.0276 0.0471
## --------------------------------------------
##
## Summary Statistics for In-sample Non-FOMC Dates
## ==============================================
## Statistic   N    Mean  St. Dev.   Min    Max
## ----------------------------------------------
## xs.ret    4,205 0.0002  0.0127  -0.0985 0.1452
## ----------------------------------------------

### Statistical Significance Test

We’ll check first whether the FOMC returns are normally distributed using the Shapiro-Wilk normality test and looking at a Q-Q plot.

##  Shapiro-Wilk normality test
##
## data:  coredata(ins.xs.fomcrets)
## W = 0.967, p-value = 0.002021

As suspected they’re not e.g. fat tails, so we’ll test for statistical significance using a bootstrap confidence interval (CI) for the mean return and see whether it contains zero or not.

Based on the various CI’s calculated by the boot package, none of which contain zero, the FOMC returns are statistically significant. For example, the studentized CI is 0.15% to 0.53%.

## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 999 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = boot.mean, type = c("all"))
##
## Intervals :
## Level      Normal              Basic             Studentized
## 95%   ( 0.0014,  0.0051 )   ( 0.0014,  0.0051 )   ( 0.0015,  0.0053 )
##
## Level     Percentile            BCa
## 95%   ( 0.0014,  0.0051 )   ( 0.0013,  0.0051 )
## Calculations and Intervals on Original Scale

### Difference in Means Test by Bootstrap

In addition, I thought it would be interesting to test whether there is a statistical difference between returns on FOMC dates and non-FOMC dates. We’ll again use bootstrap resampling to do such a test. Here is the R code for this bootstrap and the R output.

################################################################################
# in-sample difference in means test by bootstrap                              #
################################################################################
# difference in means function for bootstrap
diff.means <- function(d, f) {
n <- nrow(d)
idx1 <- 1:table(as.numeric(d\$fomc))[2]
idx2 <- seq(length(idx1) + 1, n)
m1 <- sum(d[idx1,1] * f[idx1])/sum(f[idx1])
m2 <- sum(d[idx2,1] * f[idx2])/sum(f[idx2])
ss1 <- sum(d[idx1,1]^2 * f[idx1]) - (m1^2 * sum(f[idx1]))
ss2 <- sum(d[idx2,1]^2 * f[idx2]) - (m2^2 * sum(f[idx2]))
c(m1 - m2, (ss1 + ss2)/(sum(f) - 2))
}

# create stratified in-sample data for bootstrap
ins.xs.rets.boot <- data.frame(rets = c(coredata(ins.xs.fomcrets),
coredata(ins.xs.nonfomcrets)), fomc = c(rep(1, nrow(ins.xs.fomcrets)),
rep(0, nrow(ins.xs.nonfomcrets))))
# perform bootstrap
set.seed(1)
(boot.diffmean <- boot(ins.xs.rets.boot, diff.means, R = 999, stype = "f",
strata = ins.xs.rets.boot[,2]))
# get 95% confidence interval using the studentized method
boot.ci(boot.diffmean, type = c("stud"))
# compare with Student's t-Test (for reference)
t.test(ins.xs.fomcrets, ins.xs.nonfomcrets)
## STRATIFIED BOOTSTRAP
##
##
## Call:
## boot(data = ins.xs.rets.boot, statistic = diff.means, R = 999,
##     stype = "f", strata = ins.xs.rets.boot[, 2])
##
##
## Bootstrap Statistics :
##         original       bias     std. error
## t1* 0.0030971019 3.046648e-05 1.022256e-03
## t2* 0.0001602753 1.229334e-07 8.573936e-06
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 999 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = boot.diffmean, type = c("stud"))
##
## Intervals :
## Level    Studentized
## 95%   ( 0.0011,  0.0050 )
## Calculations and Intervals on Original Scale


The difference in means is +0.31% and the 95% confidence interval is +0.11% to +0.50% (i.e. does not contain zero) and hence we can conclude that there is a statistically significant difference between SPY returns on FOMC and non-FOMC dates, a la Lucca and Moench - all good so far…

## Out-of-sample Analysis: April 2011 to January 2015

Let’s now do out-of-sample testing to see whether the pattern has continued to hold up after the working paper was in the public domain.

### Event Study

There are 31 scheduled FOMC meetings from April 2011 to January 2015.

The out-of-sample chart below continues to show a positive drift in SPY returns in the 1-day period before the FOMC announcement, but is less pronounced at about 0.25% (0.32% - 0.07%). Also, the previous positive return on T-1 is now negative 0.16% (0.07% - 0.23%).

### Summary Statistics: FOMC and Non-FOMC Dates

Here are the out-of-sample summary statistics and a plot of the FOMC excess returns.

## Summary Statistics for Out-of-sample FOMC Dates
## ===========================================
## Statistic N   Mean  St. Dev.   Min    Max
## -------------------------------------------
## xs.ret    31 0.0026  0.0137  -0.0295 0.0466
## -------------------------------------------
##
## Summary Statistics for Out-of-sample Non-FOMC Dates
## ============================================
## Statistic  N   Mean  St. Dev.   Min    Max
## --------------------------------------------
## xs.ret    952 0.0005  0.0096  -0.0651 0.0449
## --------------------------------------------

### Statistical Significance Test

For the 31 out-of-sample FOMC returns, the bootstrapped studentized 95% CI is -0.21% to 0.82% (i.e. contains zero), so we now can’t reject the null hypothesis that these returns are equal to zero.

## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 999 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = boot.mean1, type = c("all"))
##
## Intervals :
## Level      Normal              Basic             Studentized
## 95%   (-0.0021,  0.0074 )   (-0.0023,  0.0071 )   (-0.0021,  0.0082 )
##
## Level     Percentile            BCa
## 95%   (-0.0018,  0.0076 )   (-0.0015,  0.0083 )
## Calculations and Intervals on Original Scale

### Difference in Means Test by Bootstrap

Similarly, the bootstrapped difference in means 95% CI of -0.25% to +0.69%, indicates we also cannot reject the null hypothesis that there is no difference between SPY excess returns on FOMC and non-FOMC dates at the 5% level.

## STRATIFIED BOOTSTRAP
##
## Call:
## boot(data = oos.xs.rets.boot, statistic = diff.means, R = 999,
##     stype = "f", strata = oos.xs.rets.boot[, 2])
##
##
## Bootstrap Statistics :
##         original        bias     std. error
## t1* 2.117564e-03 -1.125171e-04 2.416125e-03
## t2* 9.424895e-05  1.024752e-07 8.292720e-06
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 999 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = boot.diffmean1, type = c("stud"))
##
## Intervals :
## Level    Studentized
## 95%   (-0.0025,  0.0069 )
## Calculations and Intervals on Original Scale

### Required Out-of-sample Size

The results above could be due to small sample size. So how large an out-of-sample would we need for statistical significance if the drift does indeed persist? Thinking out of my finance box and into the clinical research box, we can get a rough estimate if we're prepared to make some assumptions e.g normality. This is a common problem faced in clinical trial design but by using previous study results (e.g. effect size) an answer can be derived.

In our case, by using the in-sample FOMC and non-FOMC returns, conducting a standard Welch two sample t-test to get the effect size (i.e. the strength of the difference in the FOMC and non-FOMC returns), and with some trial and error, we get a ball park estimate of 120 FOMC meetings or 15 years (120 / 8 meetings per year)!

## Conclusion

For the in-sample period with 138 FOMC meetings, we were able to derive a similar result of an average pre-FOMC announcement drift of +0.33% using close-to-close data (compared to Lucca and Moench’s +0.49% using 2pm-2pm data). Furthermore, there was a statistically significant difference in the mean returns on FOMC and non-FOMC days.

Out-of-sample, the picture is less clear. Based on the much smaller sample size of 31 meetings, there is still a positive drift (+0.25%) using close-to-close returns. However, we can’t conclude now that this or the difference in mean returns on FOMC and non-FOMC days is statistically significant at the 5% level.

A few possible reasons for the second finding:

• small out-of-sample size, and so only (a very long) time will tell if the drift persists…
• if the pattern has indeed weakened after publication of the working paper, a possible explanation is that the market is semi-strong form efficient (defined at Wikipedia, http://en.wikipedia.org/wiki/Efficient-market_hypothesis#Semi-strong-form_efficiency, as “…prices adjust to publicly available new information very rapidly and in an unbiased fashion, such that no excess returns can be earned by trading on that information.”
• the pattern exists, but is time-varying…
• the FOMC has become more transparent since Lucca and Moench discovered the pattern, and hence there is less uncertainty (risk) regarding monetary policy decisions, which leads to a lower risk premium for such events. See http://www.frbsf.org/education/publications/doctor-econ/2012/august/transparency-lessons-financial-crisis e.g.
• “April 27, 2011: Added Chairman’s press conference to the release of projections.”
• “January 25, 2012: Provided a statement of longer-run goals and monetary policy strategy including a 2% inflation target. Fed policymakers began reporting their short-term interest rate projections over the next few years.”

So if you’re of the conservative inclination, you’ll proceed with caution. On the other hand, if you’re game like Richard Branson, you’ll say with glee “Screw it, let’s do trade it!”