Skip to content

harvester-daily admission distribution — data report ​

Generated: 2026-05-19
Methodology: 14 654 markets sampled from Polymarket Gamma /events?active=true&closed=false across 16 offsets (0..7500, step 500, limit 500). Single-shot snapshot — does not capture intraday volatility.
Purpose: facts for operator decision on harvester-daily admission knobs. No trading recommendation included.


1. Distribution facts ​

1.1 outcomePrices quality (Gamma-supplied probability) ​

BucketCount%Meaning
missing3 11121.2 %Gamma omitted the field. Triggers LowProb reject silently (current bug — fixed by fix-directional-admission-pipeline openspec change).
["0","1"] (resolved)2 76718.9 %Resolved or pre-listing. Winning side has probability = 1.0 — passes any DIRECTIONAL_MIN_PROBABILITY.
mid_range (max 0.05–0.95)6 87546.9 %Active markets, real signal. The tradeable cohort.
high (max > 0.95)1 90113.0 %Hot-resolved or near-certain markets — winning probability very high.
low (max < 0.05)00 %Mathematically impossible on binary (max of two probabilities ≥ 0.5).
malformed00 %Parser handles all current shapes.

1.2 Market type ​

TypeCount%
neg-risk8 28156.5 %
binary6 37343.5 %

BOT_MARKET_TYPE_FILTER=neg-risk cuts ~43.5 % of universe.

1.3 Hours-to-expiry distribution ​

WindowCount%
≤24h (Daily candidates)4 03127.5 %
24–168h (1 week)2 85819.5 %
168–720h (1 month)3 33122.7 %
>720h4 30029.4 %
unknown / no endDate1341.0 %

BOT_MAX_HOURS_TO_EXPIRY=24 (original .env.shared value) cuts ~72.5 % of universe to leave only the ≤24h cohort.
BOT_MAX_HOURS_TO_EXPIRY=720 (currently-relaxed value) cuts ~29.4 % to leave the ≤30-day cohort.

1.4 best_ask distribution ​

Ask rangeCount%What DIRECTIONAL_MAX_ENTRY_PRICE admits
<0.053 27622.4 %✓ at MAX_ENTRY≥0.05
0.05–0.502 83119.3 %✓ at MAX_ENTRY≥0.50
0.50–0.953 16521.6 %✓ at MAX_ENTRY≥0.95 (but invariant EXIT > MAX_ENTRY, max usable MAX_ENTRY = EXIT − 0.01)
>0.955 38236.7 %typically resolved, low value

2. Cross-product: what admits at each knob combination ​

Admission stages are conjunctive: a market admits iff it passes every filter. The cross-product against the 14 654-market sample gives the theoretical maximum admitted count, before downstream gates (EV, entry-window, DCA admission — currently invisible per the «hidden filter» investigation).

2.1 Current production-canonical (harvester definition, before today's relaxation) ​

DIRECTIONAL_MIN_PROBABILITY = 0.9   (cuts: requires winning prob ≥ 0.9)
DIRECTIONAL_MAX_ENTRY_PRICE = 0.98
DIRECTIONAL_MIN_ENTRY_PRICE = 0.91
BOT_MAX_HOURS_TO_EXPIRY     = 24
BOT_MARKET_TYPE_FILTER      = neg-risk
MARKET_TAG_FILTER           = 102892 (Crypto/5-min on harvester; 102281 Daily on harvester-daily)

Expected reachable from sample (rough): markets ≤ 24h × neg-risk × winning-prob ≥ 0.9 × ask in [0.91, 0.98]. The 0.9 floor selects from mid_range + high buckets where the winning side is ≥ 0.9. Visually correlates with ask in [0.91, 0.98] (because ask ≈ probability on the winning side). Result: a thin slice, typically dozens not thousands of markets per snapshot.

The 2026-05-18 reject distribution observed on harvester-daily (with default tag filter active) showed admitted = 0 from ~30 K scanned. Consistent with: tag filter ≈ thousand-fold reduction, then probability+ask gates cut everything left.

2.2 Currently-relaxed harvester-daily definition (post-2026-05-18 debug) ​

DIRECTIONAL_MIN_PROBABILITY = 0.01
DIRECTIONAL_MAX_ENTRY_PRICE = 0.50
DIRECTIONAL_MIN_ENTRY_PRICE = 0.01
BOT_MAX_HOURS_TO_EXPIRY     = 720
BOT_MARKET_TYPE_FILTER      = neg-risk
MARKET_TAG_FILTER           = ""  (no tag)

From the sample, theoretical reachable = (neg-risk) × (hours ≤ 720) × (ask in [0.01, 0.50]) × (probability ≥ 0.01).

FilterSurvivors / pre-filter
neg-risk8 281 / 14 654 = 56.5 %
AND hours ≤ 720h≈ 70.6 % of remaining → ~5 846
AND ask ∈ [0.01, 0.50]≈ 41.7 % of remaining → ~2 437
AND probability ≥ 0.01 (only kills missing cohort under current bug)minus 21.2 % missing → ~1 920 theoretically admittable

Observed: admitted = 0. Gap of ~1 920 markets that should pass evaluate_periodic filters but don't. This is the «hidden filter» investigation tracked in fix-directional-admission-pipeline task 8.3 (Seoul reproducer trace).


3. Operator decision space (facts only — no recommendation from me) ​

The knobs that meaningfully change the admission window for harvester-daily, ranked by survivor sensitivity per the 14 654-market sample:

  1. BOT_MAX_HOURS_TO_EXPIRY is the single largest filter. Step from 24 → 168 nearly doubles the reachable cohort (4 031 → 6 889). Step 168 → 720 brings in another 3 331 (now 10 220).
  2. MARKET_TAG_FILTER (when set to a specific tag like 102281 Daily) cuts ~98 % of universe. Removing it widens reach hugely but also pulls in markets with possibly different statistical properties (longer expiry, lower volume).
  3. DIRECTIONAL_MAX_ENTRY_PRICE controls which side of the probability axis you can enter. With winning side mode and EXIT_PRICE=0.99, the invariant EXIT > MAX_ENTRY caps MAX_ENTRY at 0.98. Default 0.91–0.98 window selects the «winning-side near-certain» cohort — a thin band by design.
  4. DIRECTIONAL_MIN_PROBABILITY filters by Gamma-reported outcomePrices. With the current bug, 21.2 % of markets fail this gate silently regardless of value. After the openspec fix lands, the threshold reflects real probability filtering only.
  5. BOT_MARKET_TYPE_FILTER=neg-risk is a near-binary 56.5/43.5 split. Setting to empty broadens to all markets.

Reality vs intent ​

The harvester profile (production-canonical, NOT relaxed) targets the «winning side, ≥0.9 confident, ≤24h» cohort — by design a small market count. The reject distribution observed on 2026-05-18 (admitted=0) was consistent with that small target but ALSO with the silent LowProb bug at 21.2 % of markets. Without the openspec fix landed and a clean reject breakdown, it's impossible to tell whether harvester-daily is correctly empty (Daily tag had no qualifying markets during this debug window) or buggy.

After the openspec fix lands:

  • strategy_no_price_data counter separates Gamma-data-missing from operator-tuned LowProb cuts.
  • Operator can compare expected admitted count (per cross-product table above) against observed admitted count.
  • If observed << expected, the hidden filter behind the ~22 % gap is still active and needs the Seoul-CID trace.
  • If observed ≈ expected, the strategy is healthy and the operator can tune MIN_PROBABILITY / MAX_ENTRY_PRICE for the desired return profile.

4. Reproducibility ​

Sample size: 14 654 markets, 16 paginated /events calls.
Generator: shell script + Python stdlib, no third-party deps.
Source data: live Gamma snapshot at 2026-05-19; intraday distribution drifts (resolution events, new listings) — re-run on demand.

Raw bucket breakdown lives at .tmp/admission-distribution-sample.json (gitignored).


5. Status of this report ​

This closes the data-collection half of TaskList item #21 «Trading: исследовать harvester-daily admission distribution». The remaining torговое decision (which knob values to set) sits with the operator after the fix-directional-admission-pipeline openspec change lands and the strategy_no_price_data counter cleans the signal.

No knob is changed by this report. The currently-relaxed harvester-daily definition on the VPS remains as-is per the «не откатывать» instruction from the 2026-05-18 session.