The strategy trades EUR/USD daily, shorting during EU hours and going long during US hours, deducting a 1-pip spread, exploiting intraday patterns between trading sessions.

I. STRATEGY IN A NUTSHELL

This strategy trades EUR/USD daily, shorting during European hours and going long during U.S. hours, capturing intraday patterns and liquidity differences. A 1-pip spread is applied, and execution is consistent to exploit time-based market dynamics.

II. ECONOMIC RATIONALE

Intraday FX patterns arise from exporter activity and time-zone segmentation. Financial intermediaries transfer currencies across sessions and demand a risk premium, causing systematic exchange rate fluctuations aligned with home market business hours.

III. SOURCE PAPER

Currency Returns in Different Time Zones [Click to Open PDF]

Jiang, Kellogg School of Management – Department of Finance; National Bureau of Economic Research (NBER)

<Abstract>

European currencies have positive average returns during US business hours and negative average returns during foreign business hours. I propose a risk-based explanation: Because news about US growth prospects arrives mostly during US business hours, US investors require higher risk premia to hold risky foreign currencies in these hours. Consistent with this argument, I find the difference in a currency’s returns between US and foreign business hours widens if the currency has a higher risk exposure, and when its exchange rate becomes more volatile. These results connect currency returns in different time zones to currency risk premia observable at lower frequencies, and support asset pricing models with recursive preferences and long-run risks.

IV. BACKTEST PERFORMANCE

Annualised Return9.07%
Volatility11.55%
Beta-0.015
Sharpe Ratio 0.79
Sortino Ratio-1.295
Maximum DrawdownN/A
Win Rate36%

V. FULL PYTHON CODE

from AlgorithmImports import *
class IntradayCurrencySeasonality(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        
        data = self.AddForex("EURUSD", Resolution.Minute, Market.FXCM)
        data.SetFeeModel(CustomFeeModel())
        self.symbol = data.Symbol
    def OnData(self, data):
        time = self.Time
        
        if time.hour == 3 and time.minute == 0:     # NY
            self.SetHoldings(self.symbol,-1)
        if time.hour == 11 and time.minute == 0:    # NY
            self.Liquidate(self.symbol)
            self.SetHoldings(self.symbol,1)
        if time.hour == 17 and time.minute == 0:    # NY
            self.Liquidate(self.symbol)
# Custom fee model.
class CustomFeeModel(FeeModel):
    def GetOrderFee(self, parameters):
        fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 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