From 2bbb040370adbdc7b735c7ab2e395df6c2141c09 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Sat, 4 Jul 2026 00:33:51 +0800 Subject: [PATCH] Clarify ops market opportunity side probability --- .../__tests__/opsMarketOpportunities.test.ts | 8 ++++- .../MarketOpportunitiesPageClient.tsx | 30 ++++++++++++++++--- tests/test_ops_market_opportunities.py | 4 +++ web/services/ops/market_opportunities.py | 2 ++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts b/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts index 49a76c49..becba70c 100644 --- a/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts +++ b/frontend/components/ops/__tests__/opsMarketOpportunities.test.ts @@ -47,7 +47,7 @@ export function runTests() { "选项", "方向", "买入价", - "模型概率", + "方向概率", "Edge", "市场链接", ]) { @@ -63,4 +63,10 @@ export function runTests() { client.includes('showAllLowPrice ? "-1" : minEdge'), "market opportunities filters must label price versus edge and not edge-filter the show-all-low-price view", ); + assert( + client.includes("side_probability") && + client.includes("yes_probability") && + client.includes("YES"), + "NO opportunities must show side probability while keeping the underlying YES probability visible", + ); } diff --git a/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx b/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx index 04456182..a6ebb10c 100644 --- a/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx +++ b/frontend/components/ops/market-opportunities/MarketOpportunitiesPageClient.tsx @@ -15,6 +15,8 @@ type MarketOpportunityRow = { side?: string; ask_price?: number; model_probability?: number; + yes_probability?: number; + side_probability?: number; edge?: number; liquidity?: number | null; volume?: number | null; @@ -74,6 +76,19 @@ function sideTone(side?: string) { : "border-emerald-200 bg-emerald-50 text-emerald-700"; } +function yesProbability(row: MarketOpportunityRow) { + return typeof row.yes_probability === "number" ? row.yes_probability : row.model_probability; +} + +function sideProbability(row: MarketOpportunityRow) { + if (typeof row.side_probability === "number") return row.side_probability; + const yes = yesProbability(row); + if (String(row.side).toLowerCase() === "no" && typeof yes === "number") { + return 1 - yes; + } + return yes; +} + function Stat({ label, value, @@ -152,9 +167,9 @@ export function MarketOpportunitiesPageClient() {