The strategy trades AUD/USD by identifying overreaction days, opening positions at 17:00 in the direction of the move, and closing by day-end, leveraging significant intraday volatility.

I. STRATEGY IN A NUTSHELL

Trade AUD/USD by detecting overreaction days—when daily returns exceed the 50-day average plus two standard deviations (Wong, 1997). Open a position at 17:00 in the direction of the overreaction and close by day’s end, capturing intraday spikes in volatility.

II. ECONOMIC RATIONALE

Overreaction days exhibit strong intraday momentum driven by behavioral biases. Prices tend to continue in the overreaction direction, creating exploitable market inefficiencies. This approach leverages psychological and behavioral patterns in financial markets for consistent short-term gains.

III. SOURCE PAPER

Price Overreactions in the Forex and Trading Strategies [Click to Open PDF]

Guglielmo Maria Caporale, Alex Plastun — Brunel University London – Department of Economics and Finance; London South Bank University; CESifo (Center for Economic Studies and Ifo Institute); German Institute for Economic Research (DIW Berlin); Sumy State University.

<Abstract>

This paper explores price overreactions in the FOREX by using both daily and intraday data on the EURUSD, USDJPY, USDCAD, AUDUSD and EURJPY exchange rates over the period 01.01.2008-31.12.2018. It applies a dynamic trigger approach to detect overreactions and then various statistical methods, including cumulative abnormal returns analysis, to test the following hypotheses: the intraday behaviour of hourly returns on overreaction days is different from that on normal days (H1), there are detectable patterns in intraday price dynamics on overreaction days (H2) and on the following days (H3). The results suggest that there are statistically significant differences between intraday dynamics on overreaction and normal days respectively; also, prices tend to change in the direction of the overreaction during the overreaction day, but move in the opposite direction on the following day. Finally, there exist trading strategies that generate abnormal profits by exploiting the detected anomalies, which can be seen as evidence of market inefficiency.

IV. BACKTEST PERFORMANCE

Annualised Return4.78%
Volatility6.3%
Beta0.143
Sharpe Ratio0.76
Sortino Ratio-0.197
Maximum DrawdownN/A
Win Rate47%

V. FULL PYTHON CODE

from AlgorithmImports import *
class PriceOverreactionsintheForex(QCAlgorithm):
    def initialize(self):
        self.set_start_date(2009, 1, 1)
        self.set_cash(100000)
        self.period: int = 50
        
        self.symbol: Symbol = self.add_forex('AUDUSD', Resolution.MINUTE, Market.OANDA).symbol
        self.securities[self.symbol].set_fee_model(CustomFeeModel())
        
        self.daily_returns: RollingWindow = RollingWindow[float](self.period)
        self.open_price: float | None = None
        
        self.settings.minimum_order_margin_portfolio_percentage = 0.
        self.schedule.on(self.date_rules.every_day(self.symbol), self.time_rules.at(17, 0), self.at17)
            
    def at17(self):
        history : dataframe = self.history(self.symbol, self.period, Resolution.DAILY)
        if len(history) == self.period:
            if 'close' in history:
                closes: np.ndarray = np.array(history['close'].values)
                daily_returns: np.ndarray = closes[1:] / closes[:-1] - 1
                avg_ret: float = np.average(daily_returns)
                std: float = np.std(daily_returns)
                
                price: float = self.securities[self.symbol].close
                ret: float = price / closes[-1] - 1
                
                if ret > avg_ret + 2*std: 
                    self.set_holdings(self.symbol, 1)
                    holdings_q: float = self.portfolio[self.symbol].quantity
                    self.market_on_close_order(self.symbol, -holdings_q)
# Custom fee model
class CustomFeeModel(FeeModel):
    def get_order_fee(self, parameters):
        fee = parameters.security.price * parameters.order.absolute_quantity * 0.00005
        return OrderFee(CashAmount(fee, "USD"))

VI. Backtest Performance

Leave a Reply

Discover more from Quant Buffet

Subscribe now to keep reading and get access to the full archive.

Continue reading