A lot of these matches still saying under 2:5 ═══...

作成日: 2026年9月15日

使用モデル GPT-5.6 Thinking by Chat01

質問

A lot of these matches still saying under 2:5

════════════════════════════════════════
🎾 TENNISLOCKS 🔒
OFFICIAL MATCH MODEL
VERSION 3.0
GENERATED 7:32 PM | September 14, 2026
ENGINE Point • Game • Set Probability Model
════════════════════════════════════════

🎯 ATP-CH Rennes Challenger (OUTDOOR) | Best of 3 | Line: 22.5
Tour: ATP-CH | Court speed (CPI): 38
Metadata confidence: HIGH

────────────────────────────────────────
Maxime Janvier vs Sascha Gueymard Wayenburg
────────────────────────────────────────

────────────────────────────────────────
💰 MODEL PICKS:

  • TOP [PROP] Maxime Janvier win 1+ set: probability 82.3% | model odds -464 | status OFFICIAL BET
  • #2 [TOTAL GAMES] OVER 22.5: model pick | settlement 56.5% | status OFFICIAL BET

🟡 LOW CONFIDENCE:

  • Sets 2.5: UNDER 51.2% | forecast only

🚫 NO BETS:

  • Match Winner: NO BET | forecast Maxime Janvier 61.7% | forecast side retained, but betting status is below OFFICIAL BET
    ────────────────────────────────────────

Match type: Both break more, close matchup. Shorter games. (RETURN_RETURN_EVEN)
Risk: 0.15 (LOW)
Pricing data quality: WEAK | opponent-rank samples 7/7 | trust 1.00

PLAYER INTEL
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
Maxime Janvier Sascha Gueymard Wayenburg
Rank 625 332
Elo 1278 1427
Avg Opp Rank 292 253
Schedule A: MID (trust 1.00, ranks 7) | B: MID (trust 1.00, ranks 7)
Serve Style ace 6.2% ace 13.5%
Momentum RECENT_RESULTS RECENT_RESULTS
Hold % 74.7% 69.8%
Recent-row SPW (raw) 62.0% 54.2%
Dominance Ratio 0.57 0.76
Recent Hold SD 9.0% 22.5%
Break Rate 30.2% 25.3%
1st Srv Win % 70.3% 65.8%
2nd Srv Win % 49.8% 49.2%
1st Srv In % 61.5% 60.5%
Recent-row implied hold77.7% (62.0% SPW) 60.4% (54.2% SPW)

Signals: forecast side retained, but betting status is below OFFICIAL BET

════════════════════════════════════════

🎲 SETS OUTLOOK
[SET RESEARCH REF] CANONICAL_POINT_ROOT | CH/HARD/MAIN/CANONICAL_POINT_STATE_SET_COUNTS_V1144 | read-only, no live blend
[SET INPUTS] SPW A/B 60.5% / 58.2% | Hold A/B 74.7% / 69.8% | route UNIFIED_CURRENT_POINT_ROOT_V1113
[SET TB CAL] not applied | tree P(7-6) 16.4% | raw 16.4% | hist not measured | n null | CANONICAL_POINT_ROOT_NO_HISTORICAL_SET_TB_MUTATOR_V1144 | set-winner margin preserved by construction
[SET AUTHORITY] ACTIVE | BO3_SET_COVERAGE_LENGTHEN_ONLY_IPF_EXACT_SCORE_AUTHORITY_V1160 | Sets Won coverage owns P2/P3; IPF reconciles exact scores with Match Winner
[BO3 COVERAGE MODEL] Sets Won semantics own length margin | Winner x Set Count reconciled by IPF | no direct four-cell subtraction | no corpus P3 target
[BO3 COVERAGE EFFECT] canonical P3 48.8% | final P3 48.8% | delta +0.0pp | coverage cannot shorten canonical root
[BO3 UNDER AUTHORITY] canonical point/game/set root only | recent coverage may soften or overturn Under, never strengthen sweep mass
[BO3 COVERAGE EVIDENCE] A 1+ set 67.1% | B 1+ set 58.5% | requested P3 48.8%
[BO3 FINAL COVERAGE] A 1+ set 82.3% | B 1+ set 66.5% | identity 48.8%
[BO3 WINNER-LANE SPLIT] if A wins, 3-set 45.7% (canonical 45.7%) | if B wins, 3-set 53.7% (canonical 53.7%)
[BO3 EXACT-SCORE RECONCILIATION] IPF preserves Winner + P2/P3 + canonical cell association | minimum exact cell 17.7% | zeroed 2-1 lanes forbidden
[BO3 RECENT SET EVIDENCE] A matches 7 | straight losses 2 | sets 7-12 || B matches 7 | straight losses 3 | sets 6-10
[SET LENGTH ROOT] final Sets Won / Both Win a Set / Over 2.5 identity P3 48.8% | one exact-score PMF
[SET WINNER ALIGN] final winner error 0.0e+0 | final set-count margin error 0.0e+0
[SET EXACT PMF] 2-0 33.5% | 2-1 28.2% | 0-2 17.7% | 1-2 20.5% | final P3 48.8%
[SET ACTION] LOW FORECAST UNDER 2.5 | probability 51.2% | model fair odds -105 | forecast only
[SET BETTING GATE] final exact-score PMF direction always visible | HIGH >= 60.0% = official PICK | MID 55.0%-<60.0% = LEAN | LOW >50.0%-<55.0% = forecast only | no BO3 data-quality confidence cap
[SET FAIR PRICE] Over 2.5 +105 | Under 2.5 -105
[SET TREE DIAGNOSTIC] canonical P(2) 51.2% | canonical P(3) 48.8% | canonical point/game/set tree

📊 Player Stats (Current Live-Source Audit):

  • Serve/return diagnostic: ret2 A/B 50.6% / 56.8% | BP save A/B 58.4% / 37.9%
  • Visible target-surface row coverage: Maxime Janvier through 2026-09-07 [EXACT_POINT_DATE_BOUNDED] | Sascha Gueymard Wayenburg through 2026-09-07 [EXACT_POINT_DATE_BOUNDED] | CURRENT POINT INPUTS ELIGIBLE
  • Live row sources: Maxime Janvier [CURRENT_EXACT_TML_V939 x7] | Sascha Gueymard Wayenburg [CURRENT_EXACT_TML_V939 x7] | date precision A/B TOURNEY_START_DATE x7 / TOURNEY_START_DATE x7
  • Winner point-source reconciliation: MATCH-LEVEL COMPARABLE EB | A MATCH_RATE_ONLY / B MATCH_RATE_ONLY | pricing SPW 62.1% / 55.2% | pricing RPW 34.7% / 39.2%
  • Surface SPW reference (HARD): Maxime Janvier (No verified same-tour surface SPW rate) | Sascha Gueymard Wayenburg (No verified same-tour surface SPW rate) [TA_SURFACE_SPW_RATE_UNAVAILABLE]
  • Surface serve priors: Maxime Janvier Ace 6.7% / DF 6.5% / 1stIn 61.3% | Sascha Gueymard Wayenburg Ace 14.8% / DF 3.9% / 1stIn 61.3% [AUTOFILL_CURRENT_EXACT_THIS_TOUR_364D_PERSISTED_V1076]
  • Maxime Janvier: Hold 74.7% (raw: 77.9%, serve vs this returner) [hold seed]
  • Sascha Gueymard Wayenburg: Hold 69.8% (raw: 58.1%, serve vs this returner) [hold seed]
  • Style: Maxime Janvier [ace 6.2% / ace 6.2%] | Sascha Gueymard Wayenburg [ace 13.5% / ace 13.5%]
  • Recent current-source results (audit): Maxime Janvier W-L 2-5, SS 0-2, Sets 7-12 ; Sascha Gueymard Wayenburg W-L 2-5, SS 2-3, Sets 6-10
  • 1st Srv Win: Maxime Janvier 70.3% | Sascha Gueymard Wayenburg 65.8%
  • 2nd Srv Win: Maxime Janvier 49.8% | Sascha Gueymard Wayenburg 49.2%
  • 1st Srv In: Maxime Janvier 61.5% | Sascha Gueymard Wayenburg 60.5%
  • Raw recent-row SPW: Maxime Janvier 62.0% | Sascha Gueymard Wayenburg 54.2% [diagnostic row aggregate; official pricing uses the exact-point posterior root]
  • Break Rate (from hold): Maxime Janvier 30.2% | Sascha Gueymard Wayenburg 25.3%
  • Dominance Ratio: Maxime Janvier 0.57 | Sascha Gueymard Wayenburg 0.76 [MISMATCH]
  • Recent Hold SD: Maxime Janvier 9.0% | Sascha Gueymard Wayenburg 22.5% | Match: 15.8%
  • Elo (diagnostic only; not official serve authority): Maxime Janvier 29.8%
    Source: Elo_Lookup sheet (Maxime Janvier=1278, Sascha Gueymard Wayenburg=1427)
  • Serve vs this returner (Maxime Janvier): 61.7% | Elo 29.8% (calibrates official serve when induce fires)
  • Recent-row implied hold (diagnostic): Maxime Janvier 77.7% (SPW 62.0%) | Sascha Gueymard Wayenburg 60.4% (SPW 54.2%) (small sample)

Totals Fair Line (canonical structural threshold ref): 24.5 (CDF 50/50) | Full-dist median ref: 24.0
Full-dist range (pricing ref): P10=17 | P50=24 | P90=32
Totals EV (tree mean): 24.6 | Median: 24.0
Projected match duration: ~115 min | 2 sets ~90 min / 3 sets ~142 min | research projection only
Settlement full-dist mode: 19g | settlement density zone: 18-20g 20.7%
All-match median ref: 24.0g | Conditional totals (not picks): E[T|2 sets] 19.8 | E[T|3 sets] 29.7 | alternative 3-set probability 49%
Settlement PMF top exacts: 19g 7.3% | 22g 7.0% | 20g 6.9% | 18g 6.6% | 29g 5.4% | 17g 5.4% | 30g 5.4% | 31g 5.3% [canonical full-match mixture]

========================================

🎯 TOTAL GAMES
[OFFICIAL TOTAL GAMES DECISION] PICK OVER 22.5 | 56.5% | OFFICIAL BET
Final pricing direction: OVER 56.5% from the official cumulative full-match Total Games threshold probability.
Pricing method: all legal full-match score paths are summed against your Total Games line. No single exact score controls the pick.
At 22.5: Over 56.5% | Under 43.5%
Total Games probability authority: ONE canonical joint score+games PMF | no second threshold recalibration is applied after the current length root.
Set-count decomposition at 22.5:
2-set lane: 51.2% match mass | P(Over | 2 sets) 15.9% | contributes 8.1pp raw Over mass
3-set lane: 48.8% match mass | P(Over | 3 sets) 99.3% | contributes 48.4pp raw Over mass
Combined no-push P(Over 22.5) = 56.5% from all lanes.
First-server sensitivity (diagnostic only): A serves first -> Over 56.6% | B serves first -> Over 56.5% | mean-total gap 0.04g
Projected total-games distribution: fair line 24.5 | mean 24.6 | median 24 | largest single exact bucket 19g (7.3%, not a majority and not the O/U authority)
Exact-total concentration: dominant 3-game cluster 18-20g = 20.7% | cluster side UNDER at 22.5
OVER threshold mass is spread across 17 exact totals | strongest OVER exact 29g = 5.4% unconditional / 9.6% of the OVER side | effective support 21.4 totals.
Shape note: the Over mass is spread across longer matches; the densest exact totals sit under the line. Official totals still use your sheet line and the cumulative tree, not a local-cluster veto.
Unconditional pricing distribution: 80% range 17-31 | SD 5.8 | mode 19g (7.3%) | leaders 19g 7.3% | 22g 7.0% | 20g 6.9% | 18g 6.6% | 29g 5.4%
########################################
🎯 PROP PROJECTIONS 🎯
########################################

📊 Maxime Janvier - Player Props:
Games Won: mean 12.9 | median 13 | mode 12 | full-match distribution
1st Set Games Won: 5.20 projected
Sets Won: BET 1+ SET | 82.3% | HIGH
Serve Games: not requested | enter a service prop line to price
Serve Points Played: not requested | enter a service prop line to price
Serve Points Won: not requested | enter a Serve Points Won line to price
Aces: not requested | enter a Aces line to price
Double Faults: not requested | enter a Double Faults line to price
Breaks Won: not requested | enter a Breaks Won line to price
Break Points Created: not requested | enter a Break Points line to price
BP Conversion: not requested | enter a Break Points line to price
Opp BP Save: not requested | enter a Break Points line to price
Opponent Matchup: opp return 35% | context only; official pricing uses the final match tree
Historical sample: 14.1 service games | projected Games Won CV: 26%

📊 Sascha Gueymard Wayenburg - Player Props:
Games Won: mean 11.7 | median 12 | mode 12 | full-match distribution
1st Set Games Won: 4.71 projected
Sets Won: LEAN UNDER 1.5 SETS | 61.7% | MEDIUM
Serve Games: not requested | enter a service prop line to price
Serve Points Played: not requested | enter a service prop line to price
Serve Points Won: not requested | enter a Serve Points Won line to price
Aces: not requested | enter a Aces line to price
Double Faults: not requested | enter a Double Faults line to price
Breaks Won: not requested | enter a Breaks Won line to price
Break Points Created: not requested | enter a Break Points line to price
BP Conversion: not requested | enter a Break Points line to price
Opp BP Save: not requested | enter a Break Points line to price
Opponent Matchup: opp return 22% | context only; official pricing uses the final match tree
Historical sample: 10.7 service games | projected Games Won CV: 34%

🎲 Match-Level Context:
Sets Played: LOW FORECAST UNDER 2.5 | P(2 sets) 51.2% / P(3 sets) 48.8% | projected 2 sets
3-set match / both players win a set: YES 48.8% | NO 51.2% | no betting action
Exact match-score paths: Maxime Janvier 2-0 33.5% | Maxime Janvier 2-1 28.2% | Sascha Gueymard Wayenburg 2-0 17.7% | Sascha Gueymard Wayenburg 2-1 20.5%
If forecast winner Maxime Janvier wins: straight sets 54.3% | Sascha Gueymard Wayenburg steals one set 45.7% conditional (28.2% of all match paths)
Individual win 1+ set: Maxime Janvier 82.3% | Sascha Gueymard Wayenburg 66.5% | identity input for 3-set probability
Straight-set loss chance: Maxime Janvier 17.7% | Sascha Gueymard Wayenburg 33.5%
Games/aces/breaks use the full match tree, not a single 2-0 or 2-1 scoreline.
Surface: HARD | Tour ace reference 7.1% | double-fault reference 4.1%

			Yeah. This output exposes the real problem. The Sets 2.5 display itself is not what is forcing the UNDER.

For this Janvier/Gueymard match, the chain is:

canonical point/game/set tree → P(3 sets) = 48.8% → final PMF P(2) = 51.2% → UNDER 2.5.

And the important line is:

canonical P3 48.8% | final P3 48.8% | delta +0.0pp

So the recent Sets Won evidence didn’t change it at all. The final self-pricer simply sees 51.2% P(2 sets) and correctly calls the forecast UNDER.

The self-pricing function itself is symmetric. It directly takes the final exact-score PMF, calculates P3 and P2, and has no 50% ceiling or favorite-winner shortcut. TennisLocks_FINAL_v1152_BO3_SET2_STATE_RESIDUAL_FINAL_20260913(1).txt

What I think is actually happening

The deeper issue is upstream:

SPW

hold probability

game/set Markov tree

canonical exact-score PMF

P(2 sets) / P(3 sets)

The set tree is converting the service-point matchup into a set-length probability that is often landing just below 50%.

For your example, the official set inputs are:

  • A SPW: 60.5%
  • B SPW: 58.2%
  • Hold: 74.7% / 69.8%
  • Match winner A: 61.7%

That produces a perfectly coherent 48.8% three-set probability, but if we’re seeing this pattern repeatedly, the thing to investigate is the calibration of the point → game → set transformation, not another display patch.

And there is an especially important clue in the script: the set engine derives hold directly from SPW through pHoldFromPoint(), then constructs the set distribution from those hold probabilities. TennisLocks_FINAL_v1157_BO3_COVERAGE_IPF_GEOMETRY_REPAIR_20260914.txt

So I would not patch the output to turn 48.8% into OVER. That would just paint the dashboard.

The next repair should be deeper

I would audit and repair the BO3 structural P3 calibration layer against the corpus, while keeping these rules:

  1. No population P3 table.
  2. No individual-match backfitting.
  3. No arbitrary +5%, +10% P3 boost.
  4. No 50% cap.
  5. P3 must remain capable of anything from near 0% to near 100%.
  6. Match Winner remains independent.
  7. Sets Won remains an exact consequence of the final PMF.
  8. Recent Sets Won data can provide evidence, but cannot fabricate sweep mass.
  9. 2026 remains untouched validation.
  10. The resulting correction must be a continuous structural calibration, not a hardcoded tour/surface lookup table.

There is already a major warning in the script’s research notes: an earlier high-P3 candidate was deliberately rejected because its apparent improvement in 2024/25 weakened on untouched 2026 data. TennisLocks_FINAL_v1152_BO3_SET2_STATE_RESIDUAL_FINAL_20260913(1).txt

So we shouldn’t resurrect that old candidate.

The next thing I’d do is recalibrate the actual point→set P3 relationship from the 585k corpus using chronology, then test whether the current tree systematically compresses P3 downward. If it does, we fix that upstream once, and every BO3 market that consumes the final PMF benefits automatically.

That’s the piece we haven’t attacked deeply enough yet.

We just fixed the sets played but there’s still loud of issues within there that still need fixed and removed

Don’t invent a dumb fix needs to be working not some that makes it worse

Python

python
def hold(p): q=1-p # win before deuce: 4-0,4-1,4-2 pre = p**4*(1 + 4*q + 10*q*q) deuce = 20*p**3*q**3 win_from_deuce = p*p/(1-2*p*q) return pre + deuce*win_from_deuce for p in [0.605,0.582,0.62,0.542,0.621,0.552]: print(p, hold(p))

思考

There are already several real faults visible in this single output, and they’re not all “sets played” faults. The biggest one is that multiple markets are being branded/gated independently even when they are mathematically the same event, while several diagnostics say the underlying pricing data are weak or mismatched.

Worked for 1m 26s

回答

Yes. I would leave the newly fixed Sets Played/P3 logic alone for now. This match does not show evidence that 48.8% itself needs another adjustment. There are more fundamental problems elsewhere in the output that can create bad picks even when the PMF is correct.

The important distinction is: some things here are ugly diagnostics, while others are actual pricing/action correctness bugs.

PriorityProblemEvidence in this outputCorrect repair
P0Equivalent markets are getting different betting decisionsJanvier ML = 61.7% NO BET, but Sascha Under 1.5 Sets = 61.7% LEANCanonicalize equivalent events so they share the same underlying event probability/action logic
P0“OFFICIAL BET” is being declared without a market priceOver 22.5 = 56.5% → OFFICIAL BET; Janvier 1+ set = 82.3% → OFFICIAL BETWithout sportsbook odds, output model side/fair price, not “bet”
P0Probability is being mistaken for confidenceHIGH >= 60% = official PICK, 55-60 = LEANProbability magnitude is not confidence or edge. Action must depend on fair probability vs offered price plus uncertainty
P1Multiple SPW roots are present without clean authority lineage60.5/58.2 set inputs; 62.1/55.2 pricing SPW; 62.0/54.2 raw SPWTrace RAW → adjusted/posterior → final pricing root explicitly and test disagreements
P1Data-quality/risk signals contradict the action layerPricing data quality: WEAK, [MISMATCH], B Hold SD 22.5%, yet Risk 0.15 LOW and OFFICIAL BETSSeparate structural volatility from input/model uncertainty; propagate uncertainty instead of arbitrarily altering probabilities
P1trust 1.00 is misleading beside WEAK qualityopponent-rank samples 7/7, trust 1.00Rename it specifically, e.g. schedule-sample trust; never present it as overall pricing trust
P1Discrete total quantiles disagreeP10=17 / P90=32, later 80% range 17-31One quantile implementation and one discrete boundary convention everywhere
P2Production output contains stale/duplicative diagnosticsalternative 3-set probability 49%; duplicate ace 6.2% / ace 6.2%; many not requested rowsMove these to audit/debug mode or remove
P2Diagnostics scream problems but have no defined consequenceDominance Ratio ... [MISMATCH], Elo 29.8% vs model 61.7%, unavailable surface SPWEither formally use them as model-disagreement/uncertainty flags or don't show them in production

The clearest actual bug

This pair cannot be allowed:

Match Winner: Janvier 61.7% — NO BET

versus

Sascha Sets Won Under 1.5: 61.7% — MEDIUM LEAN

In a best-of-three match:

Sascha Under 1.5 sets = Sascha wins 0 or 1 sets = Janvier wins the match.

They're literally the same event probability.

From your PMF:

Janvier 2-0 33.5% + Janvier 2-1 28.2% = 61.7%

So the probability engine is correct. The market/action layer is wrong.

Do not solve that by changing either probability. Solve it by making both markets reference one canonical event:

EVENT_A_MATCH_WIN

Then:

A moneyline → EVENT_A_MATCH_WIN

B under 1.5 sets → EVENT_A_MATCH_WIN

They can have different bets only when they have different offered prices. Without prices, they cannot logically have different model-confidence/action statuses.


The bigger betting problem

This:

HIGH >= 60.0% = official PICK

is not a valid betting rule.

An 82.3% event is not automatically a good bet.

Your Janvier 1+ set probability of 82.3% implies roughly -465 fair odds.

At +100, fantastic.

At -300, still positive expected value.

At -500, approximately negative value.

At -700, terrible.

The underlying probability does not tell you whether to bet until you know what you have to pay.

Same problem with:

OVER 22.5 | 56.5% | OFFICIAL BET

56.5% corresponds to roughly -130 fair odds.

If the book gives -110, there is an edge.

If the book gives -140, there isn't.

So I would make a hard architectural distinction:

Probability engine → fair probability/fair price.

Action engine → sportsbook price → edge → uncertainty robustness → BET/LEAN/PASS.

No sportsbook price should mean:

MODEL PICK OVER 22.5 — 56.5% — Fair -130 — PRICE REQUIRED FOR BET STATUS

That fixes something real without corrupting a single probability.


Another thing I would investigate before touching calibration

You have three different SPW representations in one match.

Set tree:

SPW A/B 60.5 / 58.2

Winner pricing:

pricing SPW 62.1 / 55.2

Raw recent:

62.0 / 54.2

The hold values confirm the set engine is actually using the 60.5/58.2 root. For example, 60.5% point-win probability produces approximately the displayed 74.7% hold, and 58.2% produces approximately 69.8%.

So that part isn't random.

But Sascha goes:

54.2 raw → 55.2 pricing → 58.2 set root.

A three-to-four percentage-point change in SPW is substantial in tennis because the point→game transform is nonlinear.

I would not automatically unify those numbers. They may intentionally represent different posterior/matchup transformations.

Instead the program needs explicit lineage such as:

RAW_SPW

→ opponent adjustment

→ schedule adjustment

→ shrinkage/prior

MATCHUP_POSTERIOR_SPW

SET_TREE_SPW

and independently, if appropriate:

WINNER_PRICING_SPW

Then automatically log every delta.

If those are intentionally separate models, fine.

If they are accidentally separate remnants from different engine generations, that is a real bug and could affect far more than Sets Played.


Your risk output also needs attention

Right now the model says:

Risk: 0.15 LOW

while simultaneously saying:

Pricing data quality: WEAK

Recent Hold SD B: 22.5%

Dominance Ratio: [MISMATCH]

No verified same-tour surface SPW rate

Those don't necessarily mean the probability is wrong. But they do mean that calling the entire situation simply LOW risk is misleading.

I would not “fix” that with something stupid like:

if WEAK then risk += .25

Instead split the concept.

You effectively have at least three different quantities:

Structural match volatility — what the match model predicts about variability.

Input uncertainty — how uncertain your SPW/hold/posterior estimates are.

Model disagreement — Elo, dominance, recent point data, matchup posterior, etc. pulling in different directions.

Then the action layer can use uncertainty around the estimated edge.

That is much safer than contaminating the central probability.


There is also a definite totals-output inconsistency

Earlier:

P10 = 17 | P90 = 32

Later:

80% range 17-31

Those should come out of the same PMF and the same discrete quantile utility.

That looks like two quantile implementations using slightly different >=/> or index rules.

Fix one canonical function, for example conceptually:

quantile(p) = smallest integer total t where CDF(t) >= p

Then every output section calls that function.

Don't patch the displayed number.


Things I would not change

The following look odd but are mathematically legitimate.

Under 2.5 sets 51.2% and Over 22.5 games 56.5% are not contradictory.

Your decomposition explains it correctly: almost every 3-set path clears 22.5, so 48.8% three-set mass plus some long two-set matches can produce 56.5% Over while two sets remain slightly more likely than three.

Likewise:

mode = 19 games

while

Over 22.5 = 56.5%

is possible because a distribution can have its single highest bucket below the line while cumulative probability above the line exceeds 50%.

Do not introduce a “mode veto” or “density-cluster veto.” That would be exactly the type of fix that makes the model worse.

Your PMF identities here also look healthy:

33.5 + 28.2 ≈ 61.7% Janvier win

28.2 + 20.5 ≈ 48.8% three sets

1 − 17.7 = 82.3% Janvier wins a set

1 − 33.5 = 66.5% Sascha wins a set

Those should remain regression invariants.


What I would change next

I would freeze the Sets Played math and repair the architecture around it in this order:

First: market-event equivalence and action-gate consistency.

Second: remove OFFICIAL BET status when no offered odds exist.

Third: separate probability, confidence/uncertainty, and betting edge.

Fourth: audit the three SPW roots and establish an explicit source-of-truth lineage.

Fifth: make risk actually represent its stated concept, rather than mixing or ignoring quality diagnostics.

Sixth: consolidate quantiles and other PMF-derived statistics into shared functions.

Seventh: strip audit noise from the production card: duplicate ace output, stale alternative P3, unexplained [MISMATCH], dozens of not requested rows, redundant diagnostics.

And I would add automated BO3 invariant tests so this stuff cannot silently come back: PMF sums to 1, winner marginals reconcile, P2+P3=1, set-coverage identities reconcile, equivalent markets share probabilities/actions, totals decomposition equals the full CDF, and every displayed quantile comes from one function.

I checked for the referenced TennisLocks .txt scripts in the files available to me here, but none of those files are actually attached in the current conversation, so I won't pretend I can safely tell you which exact function/line to rewrite. From this output alone, though, the problems above are concrete enough that I would tackle them before making another change to P3 calibration.

このQ&Aを共有