{"slug":"market-structure-and-break-of-structure","qid":"bos_by_name","label":"bos_by_name","post_title":"market-structure-and-break-of-structure","post_url":"/blog/lang/th/market-structure-and-break-of-structure#q-bos_by_name","columns":["ticker","bos_events","continuation_pct","base_rate_pct","edge_pp"],"rows":[{"ticker":"AAPL","bos_events":70,"continuation_pct":64.3,"base_rate_pct":56.7,"edge_pp":7.6},{"ticker":"SPY","bos_events":82,"continuation_pct":61,"base_rate_pct":62.2,"edge_pp":-1.2},{"ticker":"MSFT","bos_events":74,"continuation_pct":54.1,"base_rate_pct":55.5,"edge_pp":-1.4},{"ticker":"KO","bos_events":73,"continuation_pct":53.4,"base_rate_pct":55.6,"edge_pp":-2.2},{"ticker":"QQQ","bos_events":73,"continuation_pct":57.5,"base_rate_pct":60,"edge_pp":-2.5},{"ticker":"JPM","bos_events":80,"continuation_pct":48.8,"base_rate_pct":57.8,"edge_pp":-9}],"shape":"table","sql":"WITH\npx AS\n(\n    SELECT\n        ticker,\n        date,\n        toFloat64(high)  AS h,\n        toFloat64(close) AS c\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('AAPL', 'JPM', 'KO', 'MSFT', 'QQQ', 'SPY')\n      AND date >= '2021-01-01'\n      AND date <  '2026-09-01'\n),\nsorted AS\n(\n    SELECT\n        ticker,\n        arraySort(x -> x.1, groupArray((date, h, c))) AS bars\n    FROM px\n    GROUP BY ticker\n),\narrs AS\n(\n    SELECT\n        ticker,\n        arrayMap(x -> x.2, bars) AS highs,\n        arrayMap(x -> x.3, bars) AS closes\n    FROM sorted\n),\npivots AS\n(\n    SELECT\n        ticker,\n        highs,\n        closes,\n        arrayJoin(arrayFilter(i ->\n            (i > 3)\n            AND (i <= length(highs) - 3)\n            AND (highs[i] > arrayMax(arraySlice(highs, i - 3, 3)))\n            AND (highs[i] > arrayMax(arraySlice(highs, i + 1, 3))),\n            arrayEnumerate(highs))) AS pivot_i\n    FROM arrs\n),\nbreaks AS\n(\n    SELECT\n        ticker,\n        closes,\n        pivot_i,\n        highs[pivot_i] AS level,\n        pivot_i + 3 + arrayFirstIndex(x -> x > highs[pivot_i], arraySlice(closes, pivot_i + 4, 30)) AS break_i\n    FROM pivots\n    WHERE arrayFirstIndex(x -> x > highs[pivot_i], arraySlice(closes, pivot_i + 4, 30)) > 0\n),\nevents AS\n(\n    SELECT\n        ticker,\n        break_i,\n        argMax(level, pivot_i) AS level,\n        any(closes)            AS closes\n    FROM breaks\n    GROUP BY ticker, break_i\n),\nby_name AS\n(\n    SELECT\n        ticker,\n        count()                                                     AS bos_events,\n        round(100 * avg(closes[break_i + 10] > closes[break_i]), 1) AS continuation_pct\n    FROM events\n    WHERE break_i + 10 <= length(closes)\n    GROUP BY ticker\n),\nbase AS\n(\n    SELECT\n        ticker,\n        round(100 * avg(closes[t + 10] > closes[t]), 1) AS base_rate_pct\n    FROM\n    (\n        SELECT\n            ticker,\n            closes,\n            arrayJoin(arrayEnumerate(closes)) AS t\n        FROM arrs\n    )\n    WHERE t + 10 <= length(closes)\n    GROUP BY ticker\n)\nSELECT\n    e.ticker                                       AS ticker,\n    e.bos_events                                   AS bos_events,\n    e.continuation_pct                             AS continuation_pct,\n    b.base_rate_pct                                AS base_rate_pct,\n    round(e.continuation_pct - b.base_rate_pct, 1) AS edge_pp\nFROM by_name AS e\nINNER JOIN base AS b ON b.ticker = e.ticker\nORDER BY edge_pp DESC","computed_at":"2026-09-22T15:02:09.887705+00:00","elapsed":8.943724889}