← Blog

One number, twenty-one inputs, and a divisor that moves

A single macro number is easier to argue with than thirty tiles, which is the point of it. Built the way ours is, it measures one thing: how many independent channels agree today. It cannot tell you how severe any one of them is, it is not comparable across days when a feed has failed, and the weights inside it are an opinion rather than a measurement.

What the number actually is

The composite score is a weighted average of signed, capped contributions. Each input's daily move is divided by a scale, capped at −1 to +1, given a sign for whether rising helps or hurts Indian equities, and then averaged using our weights over whichever inputs actually reported.

Multiply that average by 100, round it to a whole number, and you have the figure on the gauge, somewhere between −100 and +100. Nothing else happens to it. There is no smoothing, no memory of yesterday, no adjustment for what any of it did afterwards.

The formula, written out, is score = 100 × Σ(w·c) ÷ Σ(w), where w is an input's weight and c is its capped signed contribution. Both sums run over the same set: the inputs that returned data this minute. That last clause is doing far more work than it looks like it is, and it gets its own section below.

Twenty-one inputs feed it. Twenty are tiles on the page, and their weights sum to 1.33. The twenty-first is the day's net foreign institutional cash flow, which is not in the tile table at all — it is folded into the score at the moment of scoring, at a weight of 0.12. Add them and the all-present divisor is 1.45.

The page shows thirty tiles. Ten of them carry no weight and are not in the score at any point — the 5-year and 30-year US yields, the 2s10s curve, WTI, silver, natural gas, the Dow, Shanghai, the KOSPI and the FTSE. They are on the screen because they are worth looking at, which is a different test from being worth scoring.

From a price move to a contribution

Take one input all the way through, with illustrative figures rather than a reading from any particular day.

Suppose the dollar index closes 0.9% below the previous session. Its saturation scale is 0.6, so the raw ratio is −1.5. That is outside the permitted range, so it is capped to −1. The dollar's sign is −1, because a rising dollar is a headwind for Indian equities — the four legs of that are in the dollar index and emerging markets — and multiplying the two negatives gives a contribution of +1.0. Its weight, 0.20, then goes into the top of the average multiplied by that +1.0, and into the bottom on its own.

StepWhat happensIllustrative dollar tile
1. Daily changeLatest price against the previous session's close, in percent−0.90%
2. Divide by the scaleThe scale is the daily move we treat as a full-strength signal−0.90 ÷ 0.6 = −1.5
3. Cap to −1 … +1Anything beyond a full-strength move counts as a full-strength move−1.0
4. Apply the sign+1 where rising helps Indian equities, −1 where it hurts−1 × −1.0 = +1.0
5. Weight itContribution × weight into the numerator; weight into the denominator+0.20 on top, 0.20 underneath
6. Average and scaleNumerator ÷ denominator × 100, over the inputs that reported100 × 0.20 ÷ 1.45 = +13.8 points

Step 3 is where most of the information goes. A dollar index down 0.9% and a dollar index down 3.0% produce exactly the same contribution, because both are past the point where the cap bites. The tile still shows the difference. The score does not.

One detail that catches out anyone reading the tile and the score together. The change pill on a yield or credit-spread tile is displayed in basis points, but the scoring step uses the percentage change in the quoted level, for every kind of input alike. So the same basis-point move in the US 10-year counts for more when the yield level is low than when it is high, simply because it is a larger fraction of a smaller number. The valuation mechanism this input stands for is in US yields and Indian share prices; the point here is narrower and purely arithmetic, and it means the printed pill and the score are measuring the same move on two different rulers.

The twenty-one inputs, in full

This is the whole table, published rather than summarised, because a score whose inputs you cannot see is a score you cannot argue with.

InputWeightRising is…Full-strength daily move
Dollar index (DXY)0.20a headwind0.6%
US 10-year yield0.15a headwind3% of the level
Brent crude0.12a headwind3%
Net FII cash flow0.12supportive±₹5,000 crore
USD / JPY0.10supportive1%
US VIX0.10a headwind8%
USD / INR0.06a headwind0.4%
US 2-year yield0.06a headwind4% of the level
US high-yield spread0.06a headwind10% of the level
India VIX0.06a headwind8%
S&P 500 futures0.06supportive1%
MOVE index0.05a headwind5%
USD / CNH0.04a headwind0.4%
EUR / USD0.04supportive0.5%
US investment-grade spread0.04a headwind10% of the level
Copper0.04supportive3%
Nasdaq 100 futures0.04supportive1.2%
Gold0.03a headwind2%
Nikkei 2250.03supportive1.5%
Hang Seng0.03supportive1.5%
DAX0.02supportive1%
Total1.45—the divisor when every input reports

Two rows read backwards to most people, and both are correct. A rising USD/JPY is marked supportive, because a weak yen means the borrow-cheap-yen-and-buy-risk trade is intact — the unwind, and why speed matters more than level, is in the yen carry trade explained. And rising gold is marked a headwind, which is a statement about what a gold rally usually accompanies rather than about gold itself; the real-rates reading is in gold and real rates.

The weights also fix two ceilings worth committing to memory, both computed on the all-present divisor. The flow input can move the score by at most 8.3 points, and the dollar — the heaviest input on the page — by at most 13.8. Neither reaches the ±20 that earns a regime label. It takes the two largest inputs, both pinned at full strength in the same direction, to clear it: 0.35 of 1.45 is 24.1 points. No single number on that table can label the day on its own.

The cap makes it a measure of agreement, not of severity

This is the property that decides how the score should be read, and it follows entirely from step 3.

Because every contribution saturates at ±1, an input that moves five times its scale is worth exactly what an input at its scale is worth. The score therefore measures how many channels are pointing the same way, weighted by how much we think each one matters — not how violent the day was. A high reading means broad agreement. It does not mean anything was extreme.

Two illustrative days make the point better than the formula does. Both assume every input reported.

Day A — broad, mild agreementDay B — one extreme, everything else flat
What happenedAll 21 inputs drift the helpful way, each about a third of its full-strength moveThe dollar tears higher, far past its scale; every other input closes unchanged
Contributions+0.3 on each of the 21−1.0 on the dollar, 0 on the other 20
Numerator0.3 × 1.45 = +0.4350.20 × −1.0 = −0.20
Divisor1.451.45
Score+30−14
Regime labelRisk-OnNeutral
What the day felt likeQuiet. Nothing moved much.Violent, in the one thing that matters most.

Day A is the calmer market and carries the higher score. That is not a defect being confessed to — it is the design working as intended. An average of capped inputs is built to be hard to move with one number, which is the same property that makes it hard to fool with one bad feed.

The cost of that design is the outlier, and the outlier is sometimes the whole story. Our reading — and it is a reading, not a measured frequency — is that the sessions which reprice Indian equities are often the ones where a single channel breaks before the others have moved at all; the anatomy of such a day is in what a risk-off day looks like. On that kind of day the average is not wrong. It is answering a question nobody is asking.

Which is exactly why the stress state ignores the average

A separate regime, Stress, is evaluated before the score is consulted at all. It fires on any one of three conditions: a score at or below −35, a one-day jump of 20% or more in the US VIX, or a one-day fall of 1.2% or more in USD/JPY.

Two of those three never touch the weighted average. They are single-input triggers, deliberately, because the previous section describes precisely what an average of capped inputs does with a single violent channel: it dilutes it. A VIX spike sits at a weight of 0.10 and caps at 8%, so a doubling of the fear gauge and an 8% rise contribute the same amount — and what implied volatility does and does not tell you is in the US VIX against India VIX.

Both of those triggers depend on their own tile being alive: each one is tested only when that input returned data, so a failed VIX or USD/JPY fetch removes the override at the same moment it removes the input from the average.

The ordering matters and is easy to miss: Stress is tested first, so it can display alongside a positive score. A day where the yen strengthens sharply while equity boards, credit and the dollar are all calm produces a mild, even friendly-looking number under a Stress label. That combination is not a contradiction in the page. It is the page telling you the average has not noticed yet.

The regime cut-offs themselves — Risk-On at +20, Risk-Off at −20, Stress at −35, and the two single-input triggers — are ours, on exactly the same footing as the weights. They were chosen, not estimated. A different reasonable view would put them somewhere else and would not be wrong about anything.

The divisor is not a constant

Here is the part that almost nobody accounts for when comparing one day's score with another's.

When an input's feed fails, it does not score zero. It is removed from the numerator and the denominator, so the average is taken over the inputs that survived. That is the right behaviour — a dead feed scoring zero would drag every reading toward neutral, which is a made-up signal — but it has a consequence. 1.45 is the maximum divisor, not a fixed one, and the same market can produce two different scores depending on what happened to report.

The direction of the distortion is always the same: the fewer inputs report, the larger a share of the score each survivor commands. Suppose the dollar is pinned at full strength on the risk-off side. With everything reporting, it is worth 13.8 points. If half the weight behind it has dropped out, the same dollar move is worth roughly twice that. The dollar did not do anything different; the denominator did.

The page does flag this, and the flag is coarser than the effect. A "partial feed" badge appears only when fewer than fifteen tiles fetched successfully — half of the thirty on the board, counted across all of them including the ten that carry no weight. A day on which three heavy scoring inputs failed and every unweighted tile came back clean will not raise the badge, and the score will still be visibly affected.

There is a quieter version of the same effect on the flow input. The 0.12 flow weight joins the denominator whenever either institutional leg is non-zero, foreign or domestic, so it is counted on almost every session — including one where the foreign leg itself nets to nothing. A genuinely flat foreign flow is therefore not neutral in the arithmetic — it is a zero contribution over a weight that is still counted, which pulls the whole average toward the middle. Note also that only the foreign leg is scored: the domestic institutional figure is printed beside it and carries no weight, despite frequently being the larger of the two, for reasons set out in FII and DII flows explained.

The weights are an opinion with a formula attached

Everything above is mechanical. This part is not, and the difference is the most important sentence in the article.

Not one of those twenty-one weights was estimated from data. No regression produced them, no optimiser tuned them against Nifty's subsequent returns, and nothing about the world requires the dollar to be worth 0.20 and the DAX 0.02. They encode a view — that the dollar, US rates, crude, foreign flows and the yen carry have carried the most into Indian equities — and that view is stated in the guide to reading macro signals as five transmission channels, in words, before it was ever expressed as a number.

The saturation scales are the same kind of thing. Deciding that a 0.6% daily move in the dollar index is full strength while crude needs 3% is a judgement about which markets are ordinarily quiet and which are ordinarily noisy. It is a defensible judgement and it is not a fact.

Two consequences follow, and they are practical rather than philosophical. First, a score cannot be back-tested into a validated signal by anyone, including us, without changing what it is — fit the weights to past outcomes and you have built a different object, one with all the fragility that fitting brings. Second, and more usefully: disagreeing with the score is a legitimate and specific act. You can point at a row of the table, say that credit deserves more than 0.10 across both spread tiles, and be arguing about something real. That is the reason the weights are published at all.

An honest way to hold the number, then: the score is a summary of a view, computed consistently. The consistency is worth something. Applied every day to the same inputs by the same arithmetic, it removes the drift that creeps into a human reading the same screen in two different moods. What it never becomes, by being consistent, is a measurement.

What it cannot say

Stated as plainly as what it can, because a summary number invites more weight than it can carry.

The score can only reach ±100 if every reporting input is pinned at full strength in the same direction at the same moment. In practice a reading in the eighties is not "worse" than one in the fifties in any measured sense — it means more of the channels agreed.

Three ways the number gets misused

  1. Reading a fall in the score as an escalation. A move from +5 to −25 can mean one heavy input flipped sign, or it can mean four light ones did, or it can mean two feeds dropped out and the survivors now carry more of the average. The three are different markets and produce the same arrow.
  2. Treating the regime label as a threshold that was crossed in the world. Nothing happens at −20. It is a line we drew on a continuous number: a day at −19 and a day at −21 are two points apart on a scale two hundred points wide, and one of them gets a label the other does not.
  3. Waiting for the score to confirm what a single tile already said. This is the expensive one, because it feels like discipline. An average of capped inputs is built to lag a single channel, and the stress override exists as an admission of exactly that — whether credit widens before equity notices is a sequencing question, not an averaging one.

The general shape of the error in all three is the same: treating a compression as though it were a measurement. The score is a lossy summary, and knowing exactly what it discarded — severity, vintage, the ten unweighted tiles, everything the divisor absorbed — is the whole skill of reading it.

Where this sits in the app

The model described here runs on the macro page of FNOTrader's Options Analytics app.

The page computes the score on each refresh from the twenty-one inputs above, names its largest contributors in words beneath the gauge, marks the regime, and flags a partial feed when fewer than half the tiles returned. Each live tile opens its own history chart, from one month to five years, and carries the transmission mechanism it stands for as a written explanation rather than a colour alone.

The weights, the saturation scales and the regime cut-offs are the ones printed in this article. They are published so that a reader who disagrees knows precisely which row to disagree with.

Common questions

How is a composite macro score calculated?

Each input's daily percentage change is divided by a per-input scale, capped to the range −1 to +1, and multiplied by a sign for whether rising helps or hurts Indian equities. Those contributions are averaged using our weights and multiplied by 100, giving a number between −100 and +100. Only inputs that returned data are in the average.

Why does a huge move in one indicator barely move the score?

Because every contribution is capped at one. An input that moves five times its scale counts exactly as much as one that moves at its scale, so the score measures how many channels agree rather than how severe any of them is. On the all-present divisor the heaviest input, the dollar, can move the score by at most 13.8 points on its own.

Can the same market produce two different scores?

Yes. A failed feed is dropped from the numerator and the denominator both, so the divisor is 1.45 only when all twenty-one inputs report. With fewer reporting, each survivor commands a larger share of the average and the same move produces a bigger number. Two scores computed on different divisors are not directly comparable.

Are the weights based on research or backtesting?

No. All twenty-one are our modelling judgement — a stated view of what has carried most into Indian equities, not a regression result and not fitted to subsequent returns. The saturation scales and the regime cut-offs are chosen in the same way. They are published so that a disagreement can be specific about which row it concerns.

Why does the page say Stress when the score looks fine?

Because the stress state is tested before the score is consulted and two of its three triggers bypass the average entirely — a one-day US VIX jump of 20% or more, or a one-day fall of 1.2% or more in USD/JPY. An average of capped inputs dilutes a single violent channel by construction, so the override catches the class of event the average would notice late.

What does a composite macro score not tell you?

How severe the day was, which channel is doing the work, whether one thing caused another, or anything at all about a specific position's horizon or entry. It also excludes the ten tiles on the page that carry no weight, and part of it describes an already-finished session, since the credit and 2-year inputs publish a session or two behind and the flow figure is the last completed session's.

Can one indicator on its own push the score into risk-on or risk-off?

Not when every input is reporting. The largest weight, the dollar at 0.20, is worth 13.8 points at full strength, short of the ±20 that earns a label; it takes the two heaviest inputs pinned the same way to clear it, at 24.1 points. If feeds have failed, the shrinking divisor removes that protection.

Why do the 'what's driving it' lines sometimes leave out the biggest weights?

They rank by weight multiplied by contribution, not by weight alone, and only the largest few are shown. A heavy input that barely moved contributes little and drops off the list, while a lightly weighted input pinned at full strength can appear on it. Anything worth less than roughly a third of a point is dropped from the list altogether. The list describes today's arithmetic, not the standing importance of an input.

Continue reading

More in Macro & Markets · App: Options Analytics · Definitions: glossary · Free tools: calculators · All: every article