Revenue Forecasts

Revenue Forecasts: method notes

Walk of Grit · Kareem Powell · built 2026-10-30. Paper trading only. This is not investment advice.

All numbers on the Revenue Forecasts page come from one published data file, revenue_forecasting.json. Each company is a sub-tab under that page, for example ServiceNow (NOW), and reads the same data.

In plain terms: Revenue Whisperer missed actual revenue by 0.79% on average in back-tests

Revenue Whisperer forecasts next-quarter revenue for ten software companies and estimates what each company's shares could be worth in 12 months.

Terms used below, in one line each:

The technical detail follows.

1. Universe and data (every number has a source)

ItemSource
TickersCRM, NOW, ADBE, SNOW, DDOG, CRWD, HUBS, WDAY, MDB, ZS. All are tradable and fractionable on Alpaca /v2/assets.
Daily pricesAlpaca Market Data v2 /v2/stocks/bars (SIP, adjustment=all)
Quarterly revenue (actual)SEC EDGAR companyfacts XBRL: RevenueFromContractWithCustomerExcludingAssessedTax, then …IncludingAssessedTax (CRWD), then Revenues. Only 80–100-day durations are used. Q4 = FY − (Q1+Q2+Q3).
Management guidanceNext-quarter revenue range in each 8-K Item 2.02 earnings press release (Ex. 99.1) on EDGAR. The URL and the quoted sentence are stored per release. Segment guidance (NOW subscription, SNOW product, WDAY subscription) is converted to total using the total/segment ratio reported in the same release.
Diluted sharesXBRL WeightedAverageNumberOfDilutedSharesOutstanding, latest quarter
NRR (comps feature)Only used where the 10-Q discloses it: SNOW 126%, DDOG 120%, MDB 122% (net ARR expansion). The source quotes are in the JSON.
Street consensusstockanalysis.com forecast pages. This is a reference only and is not used in the model or the back-test.
NewsAlpaca News API (Benzinga) and Google News RSS headlines

No figures were typed in by hand. If a source is missing, the field is null.

2. Revenue models

Let R_t be quarterly revenue and h the forecast horizon.

(a) Management guidance. G_t = midpoint of the next-quarter range.

(b) Guidance + usual amount above guidance. SaaS management guides conservatively, so the guidance midpoint is scaled by the company's own average amount above guidance over its prior four quarters. Only amounts known at the forecast date are used.

G*_t = G_t · (1 + b̄),   b̄ = mean_{last 4}(R_actual / G − 1)

(c) Weighted market comps. Each peer j gets a similarity weight to the target i. The weight uses log TTM revenue (scale), YoY growth, and NRR when both companies disclose it. Each dimension is z-scaled by its cross-sectional standard deviation, and NRR uses a 5-point bandwidth:

w_j = exp(−½·[(Δsize/σ_size)² + (Δgrowth/σ_g)² + (ΔNRR/5)²]),   ĝ = Σ w_j·g_j / Σ w_j,   C_t = R_{t−3}·(1 + ĝ)

The forecast applies the weighted peer YoY growth to the target's same quarter last year. Only peer data released before the forecast date is used.

(d) Holt damped trend. SaaS revenue is seasonal, so Holt is run on YoY log growth g_t = ln(R_t / R_{t−4}) over the last 12 observations:

ℓ_t = α·g_t + (1−α)(ℓ_{t−1} + φ·b_{t−1})
b_t = β·(ℓ_t − ℓ_{t−1}) + (1−β)·φ·b_{t−1}
ĝ_{t+h} = ℓ_t + (φ + φ² + … + φ^h)·b_t,   R̂_{t+h} = R_{t+h−4}·exp(ĝ_{t+h})

The parameters (α ∈ 0.1…0.9, β ∈ {.05, .1, .2, .3}, φ ∈ {.8, …, .98}) are grid-searched on one-step SSE. Damping (φ < 1) flattens the growth trend over time. This fits mature SaaS, where growth decelerates as companies scale.

(e) Blend and the smoothed prediction line.

B_t = 0.50·G*_t + 0.25·C_t + 0.25·H_t      (if comps are unavailable, G*_t takes the comps weight)

The forward line takes B for the next quarter. For quarters +2 to +4, it uses the Holt path rescaled so it passes through B: R̂_{t+k} = H_{t+k}·(B_{t+1}/H_{t+1}). This produces the smoothed dashed line on the page.

(f) Prediction intervals. σ is the sample standard deviation of the back-test log errors ln(R/B) for each company. The interval at horizon k is

R̂·exp(±z·σ·√k),   z = 1.2816 (80%), 1.96 (95%).

3. "Positive Override" sentiment and SEO framing

"Positive override" comes from Kareem's post Navigating Tough Times (Tarantino via Billy Oppenheimer). It means overriding the first negative reaction to a setback and reframing it as an opportunity, "not by being overly optimistic". The score encodes that idea directly. It also draws on two lines from Kareem's other writing: "valuation reflected economic reality — not our hopes or dreams", and the warning against false confidence.

LexiconWeightExamples
POS+1.0came in above, raise, accelerating, record, momentum
NEG−1.0miss, cut, plunge, slowdown, headwinds, worst
OVERRIDE (reframing a setback)+1.5rebound, turnaround, recover, overdone, buying opportunity, lessons, despite, back on track
GRIT (durable execution)+1.25durable, discipline, consistent, execution, free cash flow, long-term
HYPE (false confidence)−0.5soar, skyrocket, no-brainer, bubble, must-buy, "next Nvidia"

These rules adjust the raw score:

SEO framing features (from the headline):

Aggregate:

S = Σ w·s / Σ w,   w = 0.5^(age/7 days) · prominence · question factor

Duplicate titles are removed.

Centering. News tone is structurally positive, so the model only reacts to unusual tone: S_c = S − (mean of all earlier back-test windows). The back-test windows run from release −21 days to release +1 day, and the mean is only applied once there are 5 or more windows. The live model score uses the same recipe (Alpaca news, 21 days). The broader 30-day score on the page, which includes Google News, is for display only.

Revenue tilt: B = B_nosent·(1 + κ·S_c) with κ = 0.02, a maximum tilt of ±2%.

Caveat: the historical windows all sit around earnings releases, so the baseline (≈0.137) is earnings-heavy. Today's off-cycle news therefore centers slightly negative, though the effect on revenue is at most a few tenths of a percent. In the back-test, raw sentiment correlated with revenue surprise at only about 0.16. Sentiment is a framing signal for the stock, not a revenue driver, which is why κ is small.

3b. X post sentiment (added Oct 31, 2026)

Revenue Whisperer also reads public X posts about each company. It never reads private or account data.

Back-test: Ran point in time on 80 company-quarters, 74 of them with an X baseline. Chose the parameters on the first 4 of 8 quarters for each company and checked them on the last 4.

Average miss (MAPE)No sentimentNews toneNews tone + X
Earlier 40 quarters (used to choose parameters)1.106%1.134%1.133%
Later 40 quarters (held out)1.055%1.029%1.032%
All 80 quarters1.081%1.082%1.082%

Result: The earlier quarters favored a 50% X weight, but that weight raised the held-out miss to 1.048%. X sentiment pointed the right way in only 37 of the 74 quarters with an X reading (50%), meaning its sign matched whether actual revenue came in above the news-only forecast, so it did not improve accuracy. Revenue Whisperer keeps X sentiment at a 10% weight, where it changes forecasts by a few hundredths of a percent.

Live X readings (Oct 24 to Oct 30 or 31, 2026; positive and negative shares are weighted by likes and reposts):

TickerWindowPostsPositiveNegativeρ (pos vs neg)Tilt, news onlyTilt, news + X
CRMOct 24–Oct 307371%16%-0.16-0.17%-0.14%
NOWOct 24–Oct 315544%24%-0.41-0.14%-0.14%
ADBEOct 24–Oct 316539%24%+0.02-0.22%-0.23%
SNOWOct 24–Oct 317342%28%-0.35-0.15%-0.16%
DDOGOct 24–Oct 305565%20%-0.48+0.26%+0.25%
CRWDOct 24–Oct 305747%20%-0.68-0.24%-0.23%
HUBSOct 24–Oct 316955%29%+0.29-0.31%-0.30%
WDAYOct 24–Oct 304045%11%-0.47-0.31%-0.28%
MDBOct 24–Oct 307060%20%-0.17-0.09%-0.08%
ZSOct 24–Oct 303670%8%+0.31-0.23%-0.21%

Limits: The X API returns at most 25 posts per search call (three calls per company live, one per back-test window), so each window is a relevance-ranked sample, not every post. Bots and promotional accounts remain after filtering, and VADER misreads some sarcasm and finance slang.

4. Price model ("predicted price line")

5. Back-test (one-step-ahead, last 8 quarters per company, point-in-time)

Pooled MAPE, 10 companies × 8 quarters:

MethodMAPE
Management guidance (raw midpoint)2.37%
Guidance + usual amount above guidance0.79%
Weighted comps2.48%
Holt damped trend1.75%
Blend (no sentiment)1.08%
Blend + news tone1.08%
Blend + news tone + X posts (current)1.08%

MAPE by company (%):

TickerGuideGuide adj.CompsHoltBlend no-sentBlend
CRM0.550.432.611.480.880.89
NOW0.970.851.691.571.051.16
ADBE1.520.471.810.570.450.50
SNOW4.011.194.181.691.531.59
DDOG4.080.563.581.001.341.20
CRWD1.680.900.921.770.810.84
HUBS2.690.672.922.091.151.14
WDAY0.690.763.900.911.040.93
MDB5.301.272.204.651.741.66
ZS2.220.790.971.810.800.89

6. Recommendation: internal forecasts vs weighted market comps

Revenue Whisperer anchors next-quarter SaaS revenue on the company's own guidance, adjusted for how far results usually came in above it. That approach had a 0.79% MAPE, against 2.48% for weighted comps and 2.37% for raw guidance, because management sees backlog, RPO and billings that outsiders can't. Use weighted comps (scale, growth and NRR similarity) and damped-trend Holt as an independent check, and as the main tool beyond the guided horizon or for private companies, where guidance doesn't exist. A 50/25/25 blend gives up a little accuracy (1.08%) in exchange for robustness when a company changes its guidance style. Keep sentiment and SEO framing as a small tilt and a trading signal, not a revenue input, because it added no accuracy (1.08% → 1.08%).

7. Limitations

Keep exploring