Start with the lane that carries our name
ZEME runs a forward lock lane. It names stocks in advance and the call is later resolved against what the market actually did. Here is its record on its own resolved calls, with nothing removed:
| lane | resolved calls | hits | hit rate |
|---|---|---|---|
| the upper-lock lane | 8,661 | 288 | 3.325% |
| the weekly forecast ledger | 147 | 38 | 25.850% |
The upper-lock lane got 8,373 of its resolved calls wrong.
Both of the honest readings, at the same time
A number this shape is usually presented in one of two dishonest ways. We will give you both honest ones instead.
Reading one - it is weak. A hit rate of 3.325% means that if you treated every name on that lane as an event that was going to happen, you would be wrong the overwhelming majority of the time. Anyone selling that lane as a list of things about to circuit is misrepresenting it.
Reading two - it is not nothing. A rate only means something beside the base rate, measured on the same definition. A liquid PSX stock closes at its upper cap about 0.981% of the time (684,042 stock-sessions). So the lane is running at several times the base rate. It has found something. It has not found a schedule.
Both sentences are true at once. A hit rate without its base rate is not a number, it is a sentence - and a base rate quoted without the hit rate is just as misleading in the other direction.
The weekly ledger is a different, smaller, better-behaved thing
The weekly forecast ledger scores 25.850% - but on only 147 resolved calls. That sample is small enough that it deserves far less confidence than the number itself suggests. A better-looking rate on a much smaller n is the most common way a track record flatters itself. We are showing you ours doing exactly that.
What to take from this
Not "ZEME is bad". Not "ZEME is good". The takeaway is a habit: whenever anyone - including us - quotes you a hit rate, ask for three things before you believe it. The definition, the base rate on that same definition, and the n. Two of the three are missing from almost every claim you will ever be shown in this market.
Evidence - where every number came from
Every figure in this lesson is listed below with its definition, its sample size, its window and the exact query that produced it, so you can re-run it rather than take our word for it.
ul_lane_hit_rate = 3.325% (n = 8,661)
- what it is: of the calls the ul_predictor lane made IN ADVANCE and that have since resolved, the share recorded as a hit
- window: 2026-07-04T10:30:00Z..2026-07-30T10:30:00Z
- source: psx_data.db:predictions
- the exact query:
``sql SELECT source, COUNT(*), SUM(resolved), SUM(CASE WHEN resolved=1 AND hit=1 THEN 1 ELSE 0 END) FROM predictions GROUP BY source ``
ul_lane_hits = 288 (n = 8,661)
- what it is: resolved calls by ul_predictor recorded as a hit
- window: 2026-07-04T10:30:00Z..2026-07-30T10:30:00Z
- source: psx_data.db:predictions
- the exact query:
``sql SELECT source, COUNT(*), SUM(resolved), SUM(CASE WHEN resolved=1 AND hit=1 THEN 1 ELSE 0 END) FROM predictions GROUP BY source ``
wfl_lane_hit_rate = 25.850% (n = 147)
- what it is: of the calls the week_forecast_ledger lane made IN ADVANCE and that have since resolved, the share recorded as a hit
- window: 2026-07-04T10:30:00Z..2026-07-30T10:30:00Z
- source: psx_data.db:predictions
- the exact query:
``sql SELECT source, COUNT(*), SUM(resolved), SUM(CASE WHEN resolved=1 AND hit=1 THEN 1 ELSE 0 END) FROM predictions GROUP BY source ``
wfl_lane_hits = 38 (n = 147)
- what it is: resolved calls by week_forecast_ledger recorded as a hit
- window: 2026-07-04T10:30:00Z..2026-07-30T10:30:00Z
- source: psx_data.db:predictions
- the exact query:
``sql SELECT source, COUNT(*), SUM(resolved), SUM(CASE WHEN resolved=1 AND hit=1 THEN 1 ELSE 0 END) FROM predictions GROUP BY source ``
ul_lane_misses = 8,373 (n = 8,661)
- what it is: resolved calls by ul_predictor recorded as a miss
- window: 2026-07-04T10:30:00Z..2026-07-30T10:30:00Z
- source: psx_data.db:predictions
- the exact query:
``sql SELECT source, COUNT(*), SUM(resolved), SUM(CASE WHEN resolved=1 AND hit=1 THEN 1 ELSE 0 END) FROM predictions GROUP BY source ``
lock_base_rate = 0.981% (n = 684,042)
- what it is: P(a liquid stock closes at its upper cap on the NEXT session). cap = prev_close + max(0.10 * prev_close, Rs 1.00); locked = close >= cap - 0.005
- window: 2016-01-01..2026-07-31
- source: psx_data.db:prices
- the exact query:
``sql WITH b AS ( SELECT sym, date, close, volume, LAG(close) OVER (PARTITION BY sym ORDER BY date) AS prev_close, AVG(volume) OVER (PARTITION BY sym ORDER BY date ROWS BETWEEN 60 PRECEDING AND 1 PRECEDING) AS avg_vol_60 FROM prices ), l AS ( SELECT sym, date, close, prev_close, avg_vol_60, CASE WHEN prev_close IS NULL OR prev_close <= 0 THEN NULL WHEN close >= prev_close + MAX(0.10prev_close, 1.0) - 0.005 THEN 1 ELSE 0 END AS lock FROM b ), p AS ( SELECT sym, date, avg_vol_60, lock, LEAD(lock) OVER (PARTITION BY sym ORDER BY date) AS lock_next, SUM(lock) OVER (PARTITION BY sym ORDER BY date ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS locks_5, SUM(lock) OVER (PARTITION BY sym ORDER BY date ROWS BETWEEN 90 PRECEDING AND 1 PRECEDING) AS locks_90, COUNT(lock) OVER (PARTITION BY sym ORDER BY date ROWS BETWEEN 90 PRECEDING AND 1 PRECEDING) AS n90 FROM l ), u AS (SELECT FROM p WHERE avg_vol_60 >= 10000 AND lock_next IS NOT NULL) SELECT COUNT(), 100.0AVG(lock_next) FROM u ``
ZEME Academy is educational analysis of Pakistan Stock Exchange data. It is not investment advice, not a recommendation, and not a solicitation to trade. Every number here is measured history, and history is not a forecast. ZEME is not SECP-registered.