Currency portfolios

Monthly Currency Carry

Original operational carry portfolio that ranks observable one-month FX forward discounts/premia, rather than inferring rates from a broker display.

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
MT5 EURUSD D1 historical chart for Monthly Currency Carry, with Unaltered EURUSD spot OHLC; Broker calendar-month markers. Context only.
Genuine MT5 EURUSD D1 chart, 2024-12-20 00:00 to 2025-09-19 00:00 broker time. EUR spot context; month boundaries dotted. Historical context only; no qualified entry, executed trade or performance result is claimed. Carry ranking requires synchronized spot and one-month forward quotes for the full eligible basket. None of those ranks or portfolio weights is implied by this spot chart.. Open image for full size.

How the rule works

Carry seeks compensation embedded in relative funding prices, rather than a chart pattern. Under the USD-per-foreign quote convention, S greater than F produces a positive carry score. A negative currency spot move can overwhelm that carry, especially during correlated unwinds. An institutional forward portfolio is materially different from holding retail MT5 CFDs with broker-specific swaps.

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.
  • Rank by carry=(S/F−1)×365/D, using actual maturity D and contemporaneous mid quotes observed before the rebalance decision. Positive carry means a foreign currency priced at a forward discount under this quote convention. Use executable forward ask/bid for trades, not ranking mids. Omit stale or unavailable forwards; never infer institutional carry solely from current central-bank policy rates.

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

Long entry

  • Buy the high-carry currency forward against USD or construct equivalent spot-plus-financing exposure only when its financing terms are explicitly recorded.

Short entry

  • Sell the low-carry currency forward against USD under the same convention.

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.07, request liquidation of every tradable leg at the next executable quote and remain in cash until the next monthly decision. This is a 7% month-to-date loss trigger, not a maximum drawdown guarantee; gaps and untradeable quotes can make losses larger.

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.07/portfolio volatility, 1.2/sum(abs(w)), 0.15/max(abs(w))). Thus volatility is a target ceiling of 7% rather than a guaranteed risk level; gross exposure is at most 120% of NAV and each currency at most 15%. Convert notionals to executable lot/contract sizes by rounding down and recheck caps.

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

  • Carry can suffer sharp unwinds during stress; exclude holiday/stale forwards and publish each currency's funding convention.

Worked example

  • Hypothetical S=1.1000 USD per currency unit, F=1.0950 and D=30 imply (1.1000/1.0950−1)×365/30=5.56% annualized carry score. This is a ranking statistic, not a promised yield: a 2% adverse spot move over the month can exceed the forward discount. A retail swap quote cannot establish that this executable one-month forward exists.

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 costMonthsAnnualized netMonthly profit factorMax drawdownLater-half annualized
5 bp × turnover434+1.37%1.3312.56%+0.82%
10 bp × turnover434+1.21%1.2912.80%+0.66%
20 bp × turnover434+0.91%1.2213.50%+0.35%

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