Qtick
Sign in

Our signal & track record

How QTick calculates the 4 metrics in this group — the real method named, then translated: what it tells you, how it is computed, and where it breaks down. None of these is a trigger to act.

The Signal

How it's calculated

Nine independent factors each contribute points to a bull or bear tally: analyst upgrades/downgrades, earnings surprise streak, insider buy/sell dollar flow, institutional 13F adds/cuts, filing-forensic flags, Piotroski/Altman/Beneish/fair-value fundamentals, disproof-validated risk flags, estimate-revision drift conviction, and short-window sentiment. The points are NOT a uniform 1-6 per factor. Most factors emit small fixed hits (1 or 2 points). The analyst factor is the heaviest: it scores upgrades at 2 points each capped at 6, then adds a SEPARATE +1 price-target hit that sits outside that cap, so it can reach 7 per side. The forensic block is internally capped at 6. Within four correlated "construct families" (balance sheet, quality, valuation, manipulation) only the highest-scoring source keeps its points and the weaker is zeroed out, so the same underlying construct isn't double-counted. Net = total bull points minus total bear points. Tone is "bull" when net is +3 or higher, "bear" when net is -3 or lower, "neutral" in between. The result is upserted once per trading day into intel_net_signal_snapshots, keyed on (symbol, as_of).

How it affects judgement

A positive net adds corroborating structure to a bullish thesis: several independent data streams point the same direction, not just one. A negative net raises the evidentiary bar by quantifying how many distinct sources are pushing back, which you can weigh against your own variant view. A neutral read tells you the evidence is split or thin, which itself matters when you are gauging conviction. Because the analyst factor can supply up to 7 of the points on its own, check whether a directional tone is broad-based or carried by a single heavy factor before you lean on it.

What the current value signifies

A net of about plus or minus 3 to 5 reads as a clear lean with moderate factor coverage. A net of -1 to +2 is genuinely mixed, with no directional edge. Larger magnitudes mean more sources agree, but one factor (analyst) can push the net several points by itself, so a high reading is not automatically broad agreement. The tone label flips at plus or minus 3, so a net of +2 prints "neutral" even though it points slightly positive. Treat these bands as descriptive: the live distribution has not been queried, so the cut points are an estimate of where readings tend to land, not a measured percentile.

Range

Re-derived from the actual point scheme, the theoretical bounds are roughly -27 to +20. Bear can run deeper because the manipulation/balance-sheet/quality/valuation families survive suppression on the bear side, and the +1 price-target hit outside the analyst cap pushes both sides. The neutral band is -2 to +2, and directional tone fires at plus or minus 3. The "typical" observed band is unknown: no MIN/MAX/percentile query was run against intel_net_signal_snapshots, so any claim that readings "almost always" sit in a tight window like -10 to +10 is an estimate, not a measurement. Practically, expect tens of points possible in either direction, dominated by the analyst and forensic caps, with most names clustering near zero. Run a distribution query on the snapshot table to replace this estimate with a real range.

The catch

The tally grades direction against SPY excess return over 30 days, but the nine factors span very different horizons (1-day sentiment through 12-month forensic backtests), so the net folds short-term noise and long-term priors into one undated number. A bull tone driven by sentiment plus one analyst upgrade is structurally weaker than the same net driven by fundamentals and drift, even though both print identically. The analyst factor's outsized cap (up to 7/side, +1 of it outside the cap) means a flurry of broker actions can dominate the tally and make a name look more broadly corroborated than it is.

Hit-rate

How it's calculated

QTick logs every directional call it makes on this stock into the PredictionLog moat. Thirty days later a resolver grades each call against the S&P 500: it computes the stock's return over the window, subtracts SPY's return over the same window (excess return), and marks the call correct when the excess moved the way the call predicted. The grading is deliberately benchmark-relative, not raw up/down — because stocks drift upward over any month, an always-bullish guess would score around 57% for free, so the platform measures whether the call beat (or lagged, as predicted) the index rather than whether the price merely rose. The number you see on the stock page comes from `ticker_service.get_ticker_calibration`, which pools this symbol's resolved calls and reports `direction_hit_rate` = count(direction_correct = true) / count(direction_correct IS NOT NULL). It is withheld until at least 8 calls have resolved on this ticker (the honesty gate, MIN_RESOLVED_FOR_TICKER); below that you see a "track record builds" note instead. Frontend `adapt.ts:96` multiplies the 0–1 rate by 100 for display.

How it affects judgement

A high hit-rate tells you the directional call has beaten the index more often than not on this name historically — it raises the weight you might place on the current bull/bear read. A rate near 50% means the call has roughly matched the index here, so the current tone deserves less weight in your own thesis. Because grading is excess-vs-SPY, the rate already strips out generic market drift: it reflects stock-specific directional skill, not just "the market went up." Neither the rate alone dictates a position; pair it with your own view on the fundamentals and your conviction.

What the current value signifies

Above ~60% on a healthy resolved count: the directional call has had a real edge over the index on this name. Near 50%: it has roughly tracked SPY — treat the current tone as context only. Below ~45%: the call has been on the wrong side of the index here; factor that in before leaning on the read. Always check the resolved count shown alongside — the platform only publishes once 8 calls have resolved, and a rate on 8–12 calls is far noisier than one on 100+, so weight it by how many calls back it.

Range

0% to 100%, where ~50% means the calls have matched the S&P 500 (the true no-skill line here, since grading is excess return vs SPY rather than raw price direction). Above that line is index-beating directional skill; below it the calls have lagged the index. The stock page withholds the number entirely until 8 calls have resolved on the ticker, and the rate stays jumpy until the resolved count climbs well past that floor. A meaningful read needs both a rate clearly off 50% and a resolved count large enough that it is not a handful of calls.

The catch

Two things to keep in mind. First, the per-symbol rate pools every kind of directional call logged for this ticker, not only the 30-day net-signal direction call — so it blends prediction kinds rather than being a single methodology's track record. Second, directional logging is young, so most names have thin resolved counts; the rate will swing widely near the 8-call publish floor and low-coverage tickers the signal rarely touches will sit in the "building" state longest.

Brier score

How it's calculated

For every resolved probability call, we square the gap between the stated probability and the binary outcome (hit = 1, miss = 0), then average those squared errors across all resolved calls: mean((p − y)²). Defined at backend/app/qtick/services/directional_odds.py:305-311 as float(np.mean((arr_p - arr_y) ** 2)), with outcomes read as booleans (hit=1/miss=0); it returns None if the input is empty or the prediction and outcome lists differ in length.

How it affects judgement

The Brier score tells you whether the platform's stated confidence levels are trustworthy — not just whether calls landed, but whether a stated 70% chance actually happened about 70% of the time. A low score lets you weight the Signal's probability more directly; a high score means you should read stated odds as directional only, not literal.

Current value

This metric’s live data pipeline is under review — the method above describes how it is intended to be calculated, but the current displayed value may not yet reflect that formula. Treat it as in progress, not a finished number.

Range

0 (perfect — every stated probability matched the outcome exactly) to 1 (maximally wrong on every call). A random 50/50 guesser scores 0.25. Well-calibrated forecasters typically land 0.10–0.18. Scores above 0.25 are worse than guessing.

The catch

This metric is not yet live. brier_score() is defined (directional_odds.py:305) but has no caller — it is not aggregated by calibration_service (which contains zero references to brier), it is absent from the TickerCalibration schema (backend/app/qtick/schemas/stocks.py:767), and get_ticker_calibration does not surface it. The 30-resolved honesty gate (calibration_service.py:32) protects other metrics (direction hit rate, in-band, vs-consensus, mean hold) but does NOT cover brier. The displayed 0.182 comes solely from synthetic mock data (qt.ts:241). Treat it as an unaudited placeholder, not a measured calibration result.

Beats consensus by X%

How it's calculated

At the moment we make a call, we record the Wall Street consensus next to our point estimate. When the actual number lands, the call scores True if we and the actual ended up on the same side of that consensus — sign(our_estimate − consensus) == sign(actual − consensus), with a zero difference counting as the non-negative side. The rate is count(True) / count(resolved calls on this ticker where a consensus was recorded). It is shown only after at least 8 resolved calls on the ticker. Read the X% as a FREQUENCY of right-sided calls, not the average size of the beat: a hairline beat and a blowout both score True the same.

How it affects judgement

A high rate means our calls have pointed the right way more often when they diverged from the Street on this name — consistent with our model carrying information beyond consensus. A low rate weakens that read. Either way it is a historical frequency of a method, not a forward prediction for this ticker; treat it as a credibility signal about past direction-calling, not a conviction multiplier.

What the current value signifies

Above 60% means our calls have landed on the correct side of the Street more often than not on this ticker. Near 50% is noise — no edge over a coin flip. Below 40% means our estimates have historically pointed the wrong way relative to consensus on this name. Note this says nothing about how far off either side was.

Range

0% (every call wrong-sided vs consensus) to 100% (every call right-sided). Chance sits at 50%. In practice 55–70% reads as a real directional edge; above 70% is rare and should prompt a look at how many calls it rests on.

The catch

The label "Beats consensus by X%" implies a margin, but the number is a directional hit rate — the share of calls on the right side, not the size of any beat. The gate is only 8 resolved calls per ticker, a small sample: a 65% rate over 8 calls has a wide confidence interval and shouldn't read as settled skill. Always check the call count N alongside the rate. The same-side test also puts an exact tie (our estimate == consensus, or actual == consensus) on the non-negative side rather than excluding it; on continuous EPS data that is negligible.

See these metrics live on a stock dossier

QTick shows cited data and code-computed models for self-directed research. Nothing here is a recommendation, solicitation, or investment advice. Where a metric’s live data pipeline is under review, its method is described but its current value is withheld rather than shown as reliable.