Kicking the Tires on a Currency Sleeve (And Why I’m Not Forcing It…Yet)
Part 13 talks about my failed attempt at using FX as a hedge
This is part 13 of my series — Building & Scaling an Algorithmic Trading Platform.
Misadventure or Missed Opportunity?
I am not and never have been an FX trader. But at some point in any multi-sleeve setup you look over at FX and think: “Surely there’s some clean, orthogonal alpha sitting in currencies.”
They trade 24/5, the macro linkage is obvious, brokers like OANDA make it trivial to execute, and in theory you can:
hedge risk-off regimes (long USD/JPY, USD/CHF, etc.),
run carry,
run momentum,
or tie FX to rates/macro structure.
So I decided to give FX its own experiment: treat it as a possible orthogonal alpha sleeve (low correlation to my dual + vol sleeves), or maybe a light hedge. Worst case, I learn something and park it. Best case, I get a new sleeve that actually pulls its weight.
This post is the story of that experiment — including the part where the numbers basically told me to move on in four different languages currency pairs.
1. The Idea: A Simple FX Momentum + Carry Sleeve
I kept the concept straightforward and implementation-friendly for OANDA.
Universe (that I considered):
EUR/USD
GBP/USD
USD/JPY
EUR/JPY
Signals:
Momentum: 20-day and 60-day returns
Carry: pulled from OANDA financing (annualized bps per pair)
I defined a simple score:
score = mom20 + w * mom60 + carry_score
with different weights on mom60 over time (started at 0.5, then reduced).
Sizing logic (core version):
Raw weight ≈
score / vol20(higher score, lower vol → larger weight)Normalize gross to 1.0
Cap daily weight changes (turnover cap)
Scale to a target portfolio vol (e.g., 10% annual)
Apply gross exposure cap (e.g., 0.8)
Execution:
Daily EOD loop:
Compute signals and weights
Apply risk gates / caps
Convert weights → units per pair
Skip tiny trades (reduce churn)
Track equity, cash, and portfolio P&L
It’s basically the FX version of my other sleeves:
signal → target weights → minimal friction → track everything to CSV.
2. First Pass: 4-Pair Sleeve, 5,000-Day Backtest
The first full run (about 5,000 days, ~20 years) with a 10% vol target, 5% turnover cap, and moderate gross cap produced:
ROI: ~39%
CAGR: ~1.68%
Sharpe: ~0.27
Max drawdown: ~–18.8%
Worst 5% daily: about –1.0%
Avg daily turnover: ~0.14 (pretty high)
Average weights were tiny:
EUR/USD ≈ –1.7%
GBP/USD ≈ +2.3%
USD/JPY ≈ +4.3%
EUR/JPY ≈ +2.0%
So:
Not blowing up.
Not adding meaningful juice.
Turning over more than I’d like.
Sharpe nowhere near “this belongs in production.”
That’s a yellow flag, not a red one — but definitely not a green one.
3. Tightening the Sleeve: Lower Turnover, Same Problem
The next iterations focused on trimming churn:
higher rebalance threshold (only rebalance on meaningful weight drift),
lower turnover cap (e.g., 2% daily),
slightly lower target vol (6–8%)
gross cap around 0.6–0.8.
Result: turnover fell nicely. But performance didn’t really improve.
Typical output:
ROI: high 20s%
CAGR: ~1.2–1.3%
Sharpe: ~0.25
Max DD: ~–17%
Avg daily turnover: ~0.12
It became a politer version of the same sleeve: still meh, just churning less.
When you compress risk, lower Sharpe is fine — but only if you had a real edge to begin with. Here, it looked like I was just scaling a weak edge down to a weaker edge.
4. Getting More Selective: Thresholds, Fewer Pairs, Same Story
At this point I tried to turn the sleeve into something more “sniper-like”:
Introduce a score threshold: only trade when |score| ≥ some cutoff
Raise rebalance threshold further (e.g., 5–10%)
Keep turnover cap around 1–2%
Experiment with cutting the universe:
first to 4 pairs (as before, but more selective),
then to 2 pairs (EUR/USD and USD/JPY),
finally to a single-pair USD/JPY-only setup.
Some results along the way:
4-pair stricter config:
ROI: ~13%
CAGR: ~0.8%
Sharpe: ~0.22
Max DD: ~–10%
Turnover: ~0.026 — nice and low, but no edge.
2-pair (EUR/USD, USD/JPY), higher thresholds and modest vol:
ROI: ~–8%
CAGR: ~–2.2%
Sharpe: ~–0.28
Max DD: ~–18%
USD/JPY-only, very selective (high score threshold, low vol target, low gross cap):
ROI: ~–12.5%
CAGR: ~–8.3%
Sharpe: ~–0.9
Max DD: ~–20%
Average weight actually skewed short.
In other words: the more I tried to “clean it up,” the more the edge disappeared or went negative. That’s not what you want to see if you’re doing honest research.
5. What This Actually Tells Me About This FX Sleeve
A few takeaways:
The current momentum+carry spec doesn’t show a robust edge
Across multiple configurations, windows, and universes, the Sharpe never really broke out. Sometimes positive, often near zero, sometimes negative.Turnover is manageable, but not the problem
I managed to cut daily turnover down to ~2–3%. The issue is not cost yet; it’s that the sleeve doesn’t earn enough to justify any cost.Signal quality is just weak in this configuration
The idea (mom20 + scaled mom60 + carry) might just not be strong enough over this period, on these pairs, at this horizon, with this rebalancing frequency.Pushing harder (higher vol, higher selectivity) made it worse
That’s a pretty good sign that I’m amplifying noise, not signal.
From a portfolio point of view, this fails both tests:
As a standalone alpha sleeve: Sharpe isn’t there.
As a meaningful diversifier: with such low returns and non-trivial drawdowns, it doesn’t justify the risk.
6. So: Orthogonal Alpha, Hedge, or “Not Yet”?
Right now, this FX momentum+carry sleeve is:
Not a good orthogonal alpha sleeve (Sharpe too low).
Not especially hedge-like (no strong defensive behavior during equity stress).
Not terrible, but not something I’d willingly fund with real capital.
So I’m putting it into the “research sandbox, not production” bucket for now.
Within my classification framework:
Core engine: still the dual allocator.
Orthogonal alpha: vol sleeve, possibly other future sleeves (like vol term-structure, rates/credit RV).
Hedges: cash, maybe small structural hedges in vol or duration someday.
Opportunistic: event/macro trades, not nailed down yet.
FX momentum+carry: currently fails the bar for orthogonal alpha.
That doesn’t mean FX is off the table forever — just that this specific approach, as tested, isn’t worth pushing further right now.
7. Where I Might Take FX Next (Or Why It’s Okay to Punt)
If I revisit FX, it’ll likely be with a different angle:
Risk-off micro-hedges: tiny, rule-based long USD/JPY or USD/CHF when equity risk blows out, treated as a hedge sleeve, not alpha.
Short-horizon mean reversion: very tight, intraday or daily mean-reversion with strict stops — but that’s a different data/infra problem.
Carry-only sleeve: focus purely on carry with heavy regime gating, rather than mixing momentum + carry in one formula.
But the important part is that I’m not going to force FX into the system just because it seems “diversified” on paper.
If the results don’t show actual edge, the right move is to log the experiments, keep the code, and move on — not to bury a weak sleeve inside a bigger allocator and convince myself it’s diversification.
Closing
I went into this FX experiment hoping to find a small, neat momentum+carry sleeve I could tuck into the “orthogonal alpha” bucket with 5–10% notional, report a Sharpe > 1, and call it a win.
Instead, I got:
Sharpe in the 0.2–0.3 range at best,
negative runs in some selective configurations,
and a clear signal that this particular spec isn’t worth trading as-is.
Which, honestly, is still a good outcome: I’d rather learn early that an idea isn’t pulling its weight, than quietly wedge it into the stack because it sounds smart.
For now, currency trading goes on the “interesting, but not yet” shelf. The system will stay focused on the dual allocator, the volatility sleeve, and the Bayesian blender — where the evidence is stronger.
If I revisit FX, it’ll be with a fresh structure and stricter demands (and hopefully a better understanding of the intricacies of the market). Until then: I’ll log it and archive it but won’t let sunk-cost bias to design my portfolio.
The information presented in Math & Markets is not investment or financial advice and should not be construed as such.


