STRASMORE/EXPLORE 2,749 QUERIES

outcome_mix

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-28, from double-top-pattern-follow-through.

as of ranking 3×3read in context →
outcome_mix — 3 rows by 3 columns, computed from US exchange, SIP and OPRA data.
outcome_labelsignal_countshare_pct
ถึงเป้า measured move ก่อน2124.1
ปิดกลับเหนือเนคไลน์ก่อน6574.7
ไม่เกิดทั้งสองอย่าง11.1
Rows × columns
3 × 3
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for outcome_mix, derived from the stored result.
ColumnTypeRangeNotes
outcome_label text 3 distinct values
signal_count number 1 to 65 count
share_pct number 1.1 to 74.7 percent

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

WITH
px AS (
    SELECT ticker, date,
           toFloat64(argMax(high, _ingest_time))  AS h,
           toFloat64(argMax(low, _ingest_time))   AS l,
           toFloat64(argMax(close, _ingest_time)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','JPM','JNJ','KO','XOM')
      AND date >= '2015-01-01' AND date < today()
    GROUP BY ticker, date),
splits AS (
    SELECT ticker, groupArray(execution_date) AS split_dates
    FROM global_markets.stocks_splits
    WHERE execution_date >= '2014-01-01'
    GROUP BY ticker),
pivots AS (
    SELECT ticker, date, h, l, c,
           toUInt8(h = max(h) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 10 PRECEDING AND 10 FOLLOWING)) AS is_peak
    FROM px),
framed AS (
    SELECT ticker, date, h, is_peak,
           groupArray(h)       OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 60 PRECEDING AND CURRENT ROW) AS h_back,
           groupArray(l)       OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 60 PRECEDING AND CURRENT ROW) AS l_back,
           groupArray(is_peak) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 60 PRECEDING AND CURRENT ROW) AS p_back,
           groupArray(c)       OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN CURRENT ROW AND 90 FOLLOWING) AS c_fwd,
           groupArray(l)       OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN CURRENT ROW AND 90 FOLLOWING) AS l_fwd,
           groupArray(date)    OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN CURRENT ROW AND 90 FOLLOWING) AS d_fwd
    FROM pivots),
paired AS (
    SELECT ticker, date AS peak2_date, h AS peak2_high, h_back, l_back, c_fwd, l_fwd, d_fwd,
           arrayFirst(g -> (p_back[61 - g] = 1)
                       AND (abs((h_back[61 - g] / h) - 1) <= 0.03)
                       AND (arrayMin(arraySlice(l_back, 61 - g, g + 1)) <= (0.95 * least(h_back[61 - g], h))),
                      range(15, 61)) AS gap
    FROM framed
    WHERE is_peak = 1 AND length(l_back) = 61 AND length(c_fwd) = 91),
necked AS (
    SELECT ticker, peak2_date, gap,
           greatest(h_back[61 - gap], peak2_high)          AS peak_high,
           arrayMin(arraySlice(l_back, 61 - gap, gap + 1)) AS neckline,
           c_fwd, l_fwd, d_fwd
    FROM (
        SELECT p.ticker AS ticker, p.peak2_date AS peak2_date, p.peak2_high AS peak2_high,
               p.h_back AS h_back, p.l_back AS l_back, p.c_fwd AS c_fwd, p.l_fwd AS l_fwd,
               p.d_fwd AS d_fwd, p.gap AS gap, s.split_dates AS split_dates
        FROM paired AS p
        LEFT JOIN splits AS s ON p.ticker = s.ticker)
    WHERE gap > 0
      AND arrayCount(d -> (d >= (peak2_date - 150)) AND (d <= (peak2_date + 180)), split_dates) = 0),
confirmed AS (
    SELECT ticker,
           d_fwd[k_rel + 11] AS confirm_date,
           arrayFirstIndex(x -> x <= ((2 * neckline) - peak_high), arraySlice(l_fwd, k_rel + 12, 60)) AS target_idx,
           arrayFirstIndex(x -> x > neckline, arraySlice(c_fwd, k_rel + 12, 60))                      AS recover_idx
    FROM (SELECT *, arrayFirstIndex(x -> x < neckline, arraySlice(c_fwd, 12, 20)) AS k_rel FROM necked)
    WHERE k_rel > 0
    ORDER BY ticker, confirm_date
    LIMIT 1 BY ticker, confirm_date)
SELECT
    tup.1                                   AS outcome_label,
    tup.2                                   AS signal_count,
    round(100 * (tup.2 / total_signals), 1) AS share_pct
FROM (
    SELECT count() AS total_signals,
           countIf((target_idx > 0) AND ((recover_idx = 0) OR (target_idx <= recover_idx))) AS n_target,
           countIf((NOT ((target_idx > 0) AND ((recover_idx = 0) OR (target_idx <= recover_idx)))) AND (recover_idx > 0)) AS n_recover,
           countIf((target_idx = 0) AND (recover_idx = 0)) AS n_stall
    FROM confirmed)
ARRAY JOIN [('ถึงเป้า measured move ก่อน', n_target), ('ปิดกลับเหนือเนคไลน์ก่อน', n_recover), ('ไม่เกิดทั้งสองอย่าง', n_stall)] AS tup
⌘/Ctrl + Enter

ใช้ข้อมูลนี้ในผู้ช่วย AI ของคุณ

เปิดพร้อมคิวรีได้ทันที พร้อมข้อมูลของหน้านี้ ฟรี ไม่ต้องมีบัญชี