How the Trend Score is built

The Trend Score summarises one question on a 0 to 100 scale: is this keyword rising in this segment right now. It is a rank, not an absolute score. It describes a position inside one run, so the same keyword scores differently when the candidates around it change.

30
25
15
10
10
10
Breakout 30%Affinity 25%Pre-volatility 15%Year-over-year 10%Persistence 10%Diffusion 10%

1. How a score gets made

A run has five stages. Only the last two produce the score. The first three decide what is worth scoring at all.

1Harvest
2Screen
3Components
4Rank normalise
5Weighted sum
1
HarvestIssue index, related-query expansion, AI Overview topic mining, re-expansion. Whatever bias enters here becomes bias in the score.
2
Screenkeyword_info returns each candidate's gender and age split plus 48 months of search volume. Anything without a usable split, or under 80 segment searches per month, is dropped.
3
ComponentsFive components are computed for every survivor, each in its own unit.
4
Rank normaliseEach component becomes a rank percentile from 0 to 1 within this run.
5
Weighted sumMultiply by the weights, divide by the weights that were measurable, scale to 0 to 100.

2. The five components

Each one answers a different question. No single one defines a trend, which is why there are five.

Breakout 30%

Has this demand broken past its own normal level?

breakout = (mean of the last W months) ÷ (median of the 12 months before)
W = the chosen period, denominator floored at 5

Why it is here

The strongest single signal in the back-test (AUC 0.736), and the only one that held between 0.68 and 0.78 in every testable domain. It reads where demand sits against a year of its own normal rather than comparing two blocks, so it does not jump at the window boundary.

Watch out

A median denominator makes a keyword that sat near zero for a year look enormous. The 80-per-month segment floor removes most of those and the rank percentile flattens the rest, but read breakout next to absolute demand on the card.

Affinity 25%

Popular everywhere, or specifically with this group?

share_k   = share of this keyword's searchers in the chosen segment
baseline = Σ(share_k × volume_k) ÷ Σ(volume_k)
affinity = share_k ÷ baseline

Why it is here

This is the one component not chosen for predictive power, because it answers a different question. High volume among women in their 20s usually just means high volume. Dividing by the category average is what isolates a genuine skew, and that is the reason a segment tool exists.

Watch out

The baseline comes from this run's pool, so the same keyword scores differently under a different category. Do not quote it outside the run. Markets without gender and age data drop this component entirely.

Pre-volatility 15%

Is this demand already unsteady?

volatility = standard deviation ÷ mean of the last 12 months

Why it is here

Second strongest (AUC 0.709). A keyword about to break out is already unstable; one that has never moved keeps not moving. This reads readiness to move, not direction.

Watch out

Weak where everything is volatile by nature, such as stocks (0.517). The within-run percentile absorbs the level difference, but discount this component in a stocks run.

Year-over-year 10%

Bigger than the same period last year?

yoy = (sum of the last W months) ÷ (sum of the same W months a year ago)
measured only when the prior-year sum ≥ 60

Why it is here

AUC 0.703, and it cancels seasonality for free. A summer product rises every July, so period-over-period calls it a breakout every year while year-over-year calls it ordinary.

Watch out

Not measurable without a year of prior history, which is common for new keywords. Those drop the component from their weights.

Persistence 10%

One month's spike, or several months of holding?

persistence = months of the last 6 above the 12-month median (0 to 6)

Why it is here

AUC 0.686, higher than the growth rate it partly replaces. Simple and insensitive to outliers, which is exactly what separates a one-month spike from a rise that has settled in.

Watch out

A keyword that plateaued at a high level raises its own median and scores low. The component is biased against mature demand.

Diffusion 10%

Is the name itself spreading?

variants = other queries within 22% edit distance
diffusion = ( max(variant breakout) + (1 + share of neighbours above 1.2) ) ÷ number of measured terms

Why it is here

When a name enters public vocabulary its misspellings arrive with it and rise together. In the back-test three spellings of one new car's name took off in the same month, and so did a stock index name and its common misspelling. Where variants exist the signal is AUC 0.640.

Watch out

Sparse: only about a quarter of a pool has any variant. For the rest the component is dropped from the weights rather than guessed.

3. Why rank percentiles instead of raw values

The five components have five different units. Growth can run from −1 to +50, affinity usually sits between 0.3 and 5, momentum between −0.3 and 0.3, early signal between 0 and 1. A weighted sum of the raw values lets growth swallow the other four.

Search data is long-tailed, so a mean and standard deviation normalisation is not safe either: one outlier inflates the standard deviation and flattens everything else toward zero.

So each component becomes a rank percentile within this run. Keywords that have a value are sorted ascending and spread evenly from 0 to 1. Scale-invariant and insensitive to outliers.

The cost is real: scores from different runs are not comparable. 85 in one run does not mean 85 in another. To track something over time, read the segment monthly demand and the raw growth rate, not the score.

4. What happens when a component cannot be measured

Components go missing. The previous window can fall under the floor, and journey expansion is not measured at all in the list view. A missing component is never filled with a median or a zero. For that keyword the weight is removed and the rest renormalised.

Score = 100 × Σ(wᵢ × pᵢ) ÷ Σ(measured wᵢ)

journey expansion (15) missing → denominator 0.85
journey and growth (30) missing → denominator 0.55

Each card records which components were missing and the list says so at the top. Filling a gap with zero would make 'not measured' indistinguishable from 'measured and bad'.

5. A worked example

Open a finished run and return to this page to see the top keyword of that run decomposed with real numbers.

6. What this score does not tell you

7. Where the weights come from - the back-test

These weights are a measurement, not a hypothesis. In September 2026, 3,099 keywords were collected across seven domains - beauty, automotive, pharmaceuticals, supplements, fashion, stocks and celebrities - and their 48-month curves pulled. 432 of them actually took off and 2,765 did not, decided from the data: a three-month mean crossing 3x the trailing twelve-month median, still 2x three months later, reaching at least 1,000 searches a month.

The prediction point is fixed at three months before the take-off. Every signal is computed from data up to that month only, so nothing leaks backwards.

The previous composition (growth 30, momentum 20, acceleration, small base) scored AUC 0.528. Indistinguishable from a coin flip. Of its top 24, 8.3% actually took off, below the 14.8% you get by picking at random.

This composition scores 0.726. 70.8% of its top 24 actually took off, 4.8x the base rate, and 80% of its top 10.

Single-signal AUC: breakout 0.736, volatility 0.709, year-over-year 0.703, persistence 0.686, 12-month momentum 0.662, 6-month growth 0.660, latest-month z 0.655, spelling variants 0.640, 3-month growth 0.618, 6-month momentum 0.613, acceleration 0.512, journey expansion 0.493.

Two components were removed. Acceleration was noise at 0.512. Journey expansion was tested properly: search paths for 18 take-offs and 18 controls, read at both the current month and twelve months earlier, at a cost of 113,000 credits. It scored 0.493. Two reasons: path_finder's limit saturates the node count around 20 to 30 so it never reflects the real network size, and even allowing for that, the expansion of the two groups was not distinguishable. Journey moved out of the score and stayed in the drill-down as explanation.

SERP signals were checked too. AI Overview present 0.543, People Also Ask 0.468, knowledge panel 0.467, related-search block 0.423, ad competition 0.468. Going into the content rather than the flags, related-query count reached 0.631 and vocabulary novelty 0.590, still short of the volume-shape signals. The deeper limit is that the API serves the SERP as a current snapshot only, so no past-date test is possible. The SERP bonus was removed from the early signal, and the next task is to start logging SERP snapshots monthly so the question can be answered properly in twelve months.

What remains open: 132 of the 432 take-offs are stocks, and most of those come from one event, the 2025-2026 KOSPI rise. Split by domain, breakout held everywhere it could be tested, but pharmaceuticals had only five cases and is not validated.

How the 6-month outlook is made

It does not predict a search count. Testing 3,340 Korean search curves from many past months, neither stretching the trend nor using the same month last year beat "last month carries on". Instead it counts what actually happened over the next six months to past rises with the same direction over their last three months and the same seasonal status.

Stage · seasonCasesRose furtherHeld 80%+Fell over 40%6-month avg / today (10-90%)Check: inside range
Climbing · not seasonal4,96869%84%7%0.68~5.09 (1.32)78%
Climbing · seasonal3,37758%74%13%0.53~2.96 (1.11)71%
Steady · not seasonal3,15057%82%6%0.69~2.30 (1.06)75%
Steady · seasonal2,34448%73%11%0.57~1.94 (0.98)71%
Cooling · not seasonal6,35144%62%19%0.45~2.51 (0.93)78%
Cooling · seasonal5,22134%49%34%0.23~1.87 (0.79)75%

The ranges were set on the earlier months (origins 24 to 33) and checked on the later ones (34 to 42). The last column is how often the outcome fell inside the 80% range.

Track record

Every run's outlook is written down. When the six months after it are in the data, the same searches are measured again and scored. The same thing forecast from the same data month in several runs counts once.

2,146 forecasts recorded, none scored yet. The first can be scored once data for 2027-02 is in.

Limits

8. How to read it in practice

The three tabs exist because one combined score cannot separate these three questions. A weighted sum always pulls toward the middle: a keyword with 5× affinity but ordinary growth disappears into the middle of the combined ranking.

Source labels

Every formula on this page matches the implementation: scoring.py, segments.py, explain.py.

Pulse Finder at a glance

ListeningMind Audience Pulse. It harvests candidate keywords from seed keywords or categories, measures gender and age share, 48-month search volume and SERP / AI Overview presence, and ranks the things that are surging, new or over-indexing in the chosen segment. Marketers, merchandisers and content planners use it to find next-quarter openings and risks. Data comes from the ListeningMind Data API (trend_finder, intent_finder, keyword_info, SERP, path_finder, cluster_finder). Markets: Korea, Japan, US; the gender and age split exists only for Korea.

Key ideasGender and age segmentSearch volume and 48-month trendKeyword clusterAI Overview

Works well withBrand FinderBrand Naming AgentCEP Finder

MoreAbout the appAll 16 appsGlossaryFor agents

ContactContact usTalk to our API team