FXMacroData now publishes a daily Risk Sentiment composite score — a single bounded signal that cuts through the noise and tells you, in one number, whether the market is hunting for yield or fleeing to safety. The score runs from -1.0 (extreme risk-off) to +1.0 (extreme risk-on) and is updated every business day at market close.
What's New
The Risk Sentiment endpoint aggregates four independently normalised cross-asset signals into a single composite score. Each component is converted to a 252-day rolling z-score, then the weighted sum is compressed through a tanh function into the [-1, +1] range so the output remains comparable across different market regimes.
OFR Financial Stress Index — 40 %
The US Office of Financial Research Financial Stress Index is the highest-weighted input. It captures systemic stress across equity, credit, funding, and volatility markets simultaneously, making it the broadest single measure of broad-market risk appetite in the composite.
Gold Price — 20 %
Gold is the canonical safe-haven asset. Its z-score contribution rises during periods of capital flight and falls when investors rotate out of defensive positions into growth assets. Sourced from the Royal Mint daily London fix via the commodities/gold endpoint.
AUD/USD — 20 %
The Australian dollar is among the most liquid risk-sensitive currencies in G10. Its strong correlation with global commodity demand and equity risk appetite makes AUD/USD a reliable real-time barometer of the prevailing market mood.
USD/JPY — 20 %
The yen is the world's deepest safe-haven currency. When risk aversion rises, investors unwind JPY-funded carry trades, driving USD/JPY lower. The pair's z-score therefore rises during risk-on periods and falls sharply when fear dominates.
Each daily observation includes a human-readable regime label — risk_on,
neutral, or risk_off — determined by fixed thresholds on the composite score
(above +0.25 is risk-on, below −0.25 is risk-off). This means you can filter directly for regime type
without writing any threshold logic yourself.
Why It Matters for Traders
Macro fundamentals — policy rates, inflation, growth differentials — set the long-run trend in FX. But on a day-to-day and week-to-week basis, risk appetite is often the dominant driver of commodity and growth-linked currencies. AUD, NZD, and CAD are structurally correlated with global risk appetite because their economies depend on commodity exports and attract yield-seeking capital in benign environments. JPY and CHF move in the opposite direction for the inverse reason: deep bond markets, net-creditor status, and reserve-currency demand.
🟢 Risk-On Regime
Score > +0.25
Favour: AUD, NZD, CAD, EM FX. Carry trades extend. Commodity currencies lead. JPY and CHF underperform.
🔴 Risk-Off Regime
Score < −0.25
Favour: JPY, CHF. Carry trades unwind. AUD, NZD, CAD, EM FX underperform. Gold demand rises.
With the composite endpoint you can build regime-conditional overlays directly into your analysis workflow. Rather than monitoring four separate data series and applying your own normalisation, you retrieve a single pre-built score that already accounts for cross-asset correlation and relative signal weights. That is time saved every morning before the open.
The endpoint also pairs naturally with the AUD policy rate, JPY policy rate, and the COT positioning dashboard — layering regime context on top of fundamental and positioning signals for a more complete pre-trade picture.
Practical Example: Pulling the Latest Risk Sentiment Score
You want to know the current risk regime before deciding whether to extend an AUD/JPY carry position. A single call retrieves the most recent composite reading:
curl "https://fxmacrodata.com/api/v1/risk_sentiment?start_date=2026-04-14&end_date=2026-04-21&api_key=YOUR_API_KEY"
Representative response:
{
"data": [
{
"date": "2026-04-21",
"score": 0.38,
"regime": "risk_on",
"components": {
"ofr_fsi": -0.72,
"gold": -0.31,
"aud_usd": 0.58,
"usd_jpy": 0.44
}
},
{
"date": "2026-04-17",
"score": 0.22,
"regime": "neutral",
"components": {
"ofr_fsi": -0.41,
"gold": -0.18,
"aud_usd": 0.29,
"usd_jpy": 0.31
}
},
{
"date": "2026-04-16",
"score": -0.11,
"regime": "neutral",
"components": {
"ofr_fsi": 0.08,
"gold": 0.15,
"aud_usd": -0.22,
"usd_jpy": -0.19
}
},
{
"date": "2026-04-15",
"score": -0.41,
"regime": "risk_off",
"components": {
"ofr_fsi": 0.65,
"gold": 0.52,
"aud_usd": -0.48,
"usd_jpy": -0.37
}
},
{
"date": "2026-04-14",
"score": -0.58,
"regime": "risk_off",
"components": {
"ofr_fsi": 0.89,
"gold": 0.61,
"aud_usd": -0.55,
"usd_jpy": -0.52
}
}
]
}
The response shows a fast reversal from risk-off (14–15 April) through neutral (16–17 April) into a confirmed risk-on reading by 21 April. The component breakdown reveals that most of the shift came from a sharp drop in the OFR Financial Stress Index and a recovery in AUD/USD — not just a single data series moving. That multi-source confirmation makes the signal more reliable than any single-asset proxy. With this in hand, you have a quantified, same-day basis for extending the AUD/JPY carry or re-entering commodity-currency longs.
Practical Example: Regime-Filtered Carry Strategy
Carry strategies systematically borrow in low-rate currencies (JPY, CHF) and invest in high-rate currencies (AUD, NZD, CAD). They perform well in stable, risk-on environments and can suffer sharp, sudden drawdowns when risk appetite collapses. Using the composite score as a regime filter allows you to stay in carry during favourable conditions and step aside when the signal turns risk-off.
For example, you might run a simple rule: enter or hold AUD/JPY longs only when the composite score
has been in the risk_on regime for at least two consecutive days; exit to cash when the
score drops below −0.25. You can implement this in Python using the endpoint directly:
import requests
API_KEY = "YOUR_API_KEY"
url = "https://fxmacrodata.com/api/v1/risk_sentiment"
params = {"start_date": "2026-01-01", "end_date": "2026-04-21", "api_key": API_KEY}
resp = requests.get(url, params=params)
data = resp.json()["data"]
# Build a carry-entry signal: in carry when score > +0.25 for 2+ consecutive days
in_carry = False
for i, row in enumerate(data):
if i == 0:
continue
prev = data[i - 1]
if prev["regime"] == "risk_on" and row["regime"] == "risk_on":
in_carry = True
elif row["score"] < -0.25:
in_carry = False
print(f"{row['date']} score={row['score']:+.2f} regime={row['regime']:<9} carry={'ON' if in_carry else 'OFF'}")
This pattern gives you a data-driven, macro-grounded trigger for carry positioning that reacts to the full cross-asset picture — not just one pair. Pair it with the AUD policy rate series and the COT dashboard to layer fundamental and positioning context on top of the regime signal.
Methodology: How the Composite Is Built
For transparency, here is the precise calculation behind the score:
- Rolling z-score normalisation: For each component series, the trailing 252-business-day (approximately one calendar year) mean and standard deviation are computed daily. Each day's value is then expressed as (value − mean) / std, producing a unit-free signal.
- Sign alignment: Components where a higher value indicates more risk aversion (OFR FSI and gold) are inverted so that all four signals move in the same direction — positive means risk-on.
- Weighted sum: The four z-scores are combined: OFR FSI (40%) + gold (20%) + AUD/USD (20%) + USD/JPY (20%).
- tanh compression: The weighted sum is passed through tanh(x / 1.5), which smoothly bounds the output to the (−1, +1) open interval while preserving the sign and relative magnitude of movements.
-
Regime labelling: score > +0.25 →
risk_on; score < −0.25 →risk_off; otherwise →neutral.
The weights reflect both the empirical correlation of each signal with broad risk appetite and the desire to avoid over-indexing on any single market. The OFR FSI receives the highest weight because it is itself an aggregate of multiple market stress indicators and therefore already represents a diversified cross-market view.
Get Started
The Risk Sentiment endpoint is available to all FXMacroData API subscribers. Query it today:
First steps
- Pull the current regime:
curl "https://fxmacrodata.com/api/v1/risk_sentiment?start_date=2026-04-14&end_date=2026-04-21&api_key=YOUR_API_KEY" - Explore the full composite and component history on the Market Summary dashboard
- Layer regime context onto carry signals using the AUD policy rate and JPY policy rate series
- Validate positioning alignment with the COT dashboard
- No API key yet? Subscribe to get started — a free tier is available.