Currency portfolios
Currency Carry with Trend Filter
Original carry portfolio that admits a ranked carry leg only when its own spot trend agrees; it is not a replication of an academic strategy.
- Category
- Currency portfolios
- Timeframes
- D1 (monthly portfolio rebalance)
- Pairs
- AUD, CAD, CHF, EUR, GBP, JPY, NOK, NZD and SEK versus USD
- Test status
- Monthly family research; exact portfolio test incomplete

How the rule works
The trend filter removes a carry leg when its recent spot direction conflicts with the proposed exposure. It changes participation and dollar neutrality, so it is not automatically a better carry strategy. During an abrupt recovery it can stay in cash after selling a loser, then re-enter only at the next monthly decision. Test the carry and trend components separately to identify what drives any historical result.
Setup
- Use a fixed universe of AUD, CAD, CHF, EUR, GBP, JPY, NOK, NZD and SEK versus USD. Normalize every spot quote to Q = USD per one unit of foreign currency; invert USD/foreign quotes before computing returns. Synchronize closing observations at 17:00 America/New_York using a historical broker-offset schedule. Require 300 common, valid daily observations and at least six eligible currencies.
- At the last completed New York trading day of each month, freeze the ranking. Define t as that completed close. Ties are resolved alphabetically by ISO currency code. Set n=floor(number eligible/3), and select the highest n and lowest n currencies. Submit the rebalance at 08:00 Europe/London on the next common trading day, using then-executable prices.
- Calculate carry exactly as (S/F−1)×365/D with normalized spot/forward quotes. Form the same carry tails before applying the trend test. A high-carry long qualifies only if R63>0; a low-carry short only if R63<0. Allocate rejected legs to cash without substituting a weaker rank or re-expanding surviving legs.
Indicators
- Same-timestamp spot S and one-month outright forward F, both USD per foreign currency
- Carry score (S/F−1)×365/D, where D is actual calendar days to forward maturity
- 60-day sample covariance of normalized daily spot log returns
- 63-day entry trend Q[t]/Q[t−63]−1 and 21-day daily exit trend Q[t]/Q[t−21]−1
Long entry
- At next liquid-session open, establish a long high-carry forward/spot-financing exposure only for qualifying positive-trend currencies.
Short entry
- Establish a short low-carry exposure only for qualifying negative-trend currencies.
Stop loss
- There is no guaranteed per-leg price SL. At each completed New York daily close, value portfolio NAV after costs. If NAV/NAV_at_month_start−1 <= −0.06, request liquidation of every tradable leg at the next executable quote and remain in cash until the next monthly decision. This is a 6% month-to-date loss trigger, not a maximum drawdown guarantee; gaps and untradeable quotes can make losses larger.
- Additional daily trend exit: close a long when completed R21<=0 and a short when R21>=0, at the next quote. After an exit, hold that leg in cash until the next monthly selection. Carry ranks themselves are refreshed only monthly.
Exit
- At the next monthly rebalance, close legs no longer selected and adjust surviving notionals to the newly computed weights. Roll forward contracts on their stated settlement/maturity schedule using actual executable quotes. The signal does not justify allowing an expiring contract to settle accidentally.
- If a required quote is missing, initiate no new portfolio. Existing exposure remains a recorded risk until an executable quote becomes available; request exit then. Never fill a suspended market at its last stale price or pretend it could be force-closed after a fixed number of days.
Risk and position size
- Compute individual volatilities from 60 daily log returns. Within each selected tail, normalize inverse-volatility weights to +0.5 for the long side and −0.5 for the short side. If any volatility is zero or inputs are missing, do not initiate the portfolio. Let w be this signed weight vector and Σ the 60-day sample covariance matrix. Annualized portfolio volatility = sqrt(252 × wᵀΣw).
- Multiply every weight by k=min(0.06/portfolio volatility, 1.0/sum(abs(w)), 0.15/max(abs(w))). Thus volatility is a target ceiling of 6% rather than a guaranteed risk level; gross exposure is at most 100% of NAV and each currency at most 15%. Convert notionals to executable lot/contract sizes by rounding down and recheck caps.
- Compute the base capped carry weights before trend filtering, then set ineligible weights to zero. If absolute net foreign-currency weight exceeds 0.60 of NAV, scale all surviving weights down proportionally. Cash is allowed; do not scale back up to hit the volatility target.
Costs and execution
- Include bid/ask on every entry, reduction and roll, commissions, financing or forward points, and account-currency valuation. Do not splice spot returns, forward excess returns and broker swaps into one unexplained series. Forward quotes, calendars and historical funding must be independently available; an MT5 spot screenshot does not supply them.
When the method can fail
- Trend filters reduce participation and may lag reversals. Exclude non-deliverable or stale instruments and stress-test crisis periods separately.
Worked example
- Hypothetical selected carry longs A/B have R63 of +4%/−2%; selected shorts C/D have −3%/+1%. Keep A and C, hold B and D allocations in cash, and do not promote lower-ranked currencies. If A later has R21=−0.2%, its daily trend exit closes that leg at the next quote. No new replacement is bought before the next monthly rebalance.
Monthly family research and remaining test gap
The exact portfolio specification above remains incompletely tested. Public Internet data now supports the separate monthly family analysis below. A positive research result is not a pass for the strategy on this page.
Source: Adrien Verdelhan’s public MIT workbook, country-level monthly exchange-rate changes and interest-rate differences. Research window: 1984-03-30–2020-04-30; 434 calendar months including cash periods. The universe uses the nine named G10 currencies where observations are available, with at least six eligible currencies.
| Assumed cost | Months | Annualized net | Monthly profit factor | Max drawdown | Later-half annualized |
|---|---|---|---|---|---|
| 5 bp × turnover | 434 | +1.62% | 1.48 | 12.68% | +1.14% |
| 10 bp × turnover | 434 | +1.44% | 1.42 | 14.34% | +0.93% |
| 20 bp × turnover | 434 | +1.07% | 1.30 | 17.56% | +0.53% |
The reproducible monthly variant uses three-month momentum/volatility, lagged monthly interest differences for carry, top and bottom thirds, inverse-volatility weights capped at 20% per leg, and cash for rejected legs. Carry plus trend retains carry-selected legs only when their three-month trend agrees. Costs apply to absolute weight turnover, including closing to cash and final liquidation. Signals never use next-month prices or their availability.
Missing from this dataset: daily synchronized spot and forward levels, maturity and executable bid/ask, London 08:00 fills, NY 17:00 decision prices, daily volatility controls and the stated monthly loss-trigger exits. These cannot be reconstructed reliably from monthly returns. Historical interest differences are a funding proxy; they are not an executable forward quote.
MIT source and research datasets · Download full monthly results, units and data audit · Download reproduction code and source manifest
Execution and research protocol
- A spot chart illustrates one currency only. It cannot show cross-sectional ranks, contemporaneous forwards, portfolio weights or actual trading costs. Obtain synchronized historical inputs for every constituent before testing this rule.
- Freeze signals using information available at the decision timestamp. Convert all exchange rates to the stated quote convention before calculating returns and covariance. Record missing observations, executable bid/ask, forward maturity, interest, rolls and each cash allocation.
- Validate the full portfolio out of sample, including transaction costs and historical funding. The monthly loss threshold is an exit trigger, not a guaranteed maximum loss: quotes can gap or become unavailable. This rule has no claimed verified portfolio performance.
Adapt and test your version
- Treat these inputs as a reproducible starting specification. Choose a currency pair, session and holding period that match the time you can monitor the market, then record any changes to indicator periods, thresholds, stop distance or exits as a new version.
- Change one hypothesis at a time. Reserve a later period and additional pairs for evaluation before looking at their results. Include your account’s actual trading and financing costs, compare small parameter changes, and forward-test on demo. A selected profitable window does not validate the strategy or its modified version.
Reproduce the chart in MT5
- Display a D1 spot chart for one portfolio currency with month boundaries marked. This is price context only: the ranking, financing and covariance calculations require a separate synchronized multi-currency dataset. The chart is not evidence that a portfolio entry passed those tests.
Sources
- Drivers of carry and currency momentum — Distinct carry and momentum drivers and risk discussion.
- Currency Momentum Strategies — Cross-sectional momentum family evidence and trading-cost limitations.
- FX strategies in periods of distress — Gyntelberg and Schrimpf (2011) — Tail-risk context for FX systematic strategies.
