STRASMORE/EXPLORE 3,127 QUERIES

recent_wedges

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-10-06, from falling-wedge-pattern.

as of series 12×5read in context →
recent_wedges — 12 rows by 5 columns, computed from US exchange, SIP and OPRA data.
signal_datesignal_labeltickerfive_day_fall_pctfwd_20_pct
2026-01-05Jan 5, 2026PG3.0210.65
2026-01-05Jan 5, 2026MCD3.486.54
2026-01-06Jan 6, 2026PEP3.6619.59
2026-03-09Mar 9, 2026NKE7.34-24.48
2026-04-28Apr 28, 2026HD4.32-3.41
2026-04-29Apr 29, 2026HD4.92-0.5
2026-05-11May 11, 2026T4.71-8.69
2026-07-24Jul 24, 2026AMZN6.1211.43
2026-08-12Aug 12, 2026NKE4.57-9.6
2026-08-20Aug 20, 2026INTC11.8917.88
2026-08-31Aug 31, 2026GS1-10.69
2026-09-01Sep 1, 2026HD5.36-11.03
Rows × columns
12 × 5
Period covered
to
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 recent_wedges, derived from the stored result.
ColumnTypeRangeNotes
signal_date date 2026-01-05 to 2026-09-01
signal_label text 11 distinct values (Apr 28, 2026, Apr 29, 2026, Aug 12, 2026…)
ticker text 9 distinct values (AMZN, GS, HD…)
five_day_fall_pct number 1 to 11.89 percent
fwd_20_pct number -24.48 to 19.59 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
bars AS (
    SELECT
        ticker,
        date,
        toFloat64(high)  AS hi,
        toFloat64(low)   AS lo,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','AVGO','JPM','BAC','WFC','GS','KO','PEP','PG','JNJ','PFE','MRK','XOM','CVX','WMT','HD','MCD','NKE','CSCO','INTC','IBM','T','VZ','DIS')
      AND date >= '2010-01-04'
      AND date <= '2026-09-30'
),
split_dates AS (
    SELECT
        ticker,
        groupArray(execution_date) AS split_days
    FROM
    (
        SELECT ticker, execution_date
        FROM global_markets.stocks_splits
        WHERE execution_date >= '2009-10-01'
        GROUP BY ticker, execution_date
    )
    GROUP BY ticker
),
stepped AS (
    SELECT
        ticker,
        date,
        px,
        hi - lo AS rng,
        if(hi < lagInFrame(hi, 1) OVER w AND lo < lagInFrame(lo, 1) OVER w, 1, 0) AS lower_both
    FROM bars
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
feat AS (
    SELECT
        ticker,
        date,
        px,
        sum(lower_both) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)  AS wedge_streak,
        avg(rng)        OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)  AS rng5,
        groupArray(rng) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 64 PRECEDING AND 5 PRECEDING) AS prior_rng,
        lagInFrame(px, 5)   OVER wf AS px_back5,
        leadInFrame(px, 5)  OVER wf AS px_fwd5,
        leadInFrame(px, 10) OVER wf AS px_fwd10,
        leadInFrame(px, 20) OVER wf AS px_fwd20
    FROM stepped
    WINDOW wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
scored AS (
    SELECT
        f.ticker   AS ticker,
        f.date     AS date,
        f.px       AS px,
        f.px_back5 AS px_back5,
        f.px_fwd20 AS px_fwd20,
        if(f.wedge_streak = 4 AND f.rng5 < arraySort(f.prior_rng)[15], 1, 0) AS is_wedge
    FROM feat AS f
    LEFT JOIN split_dates AS s ON s.ticker = f.ticker
    WHERE length(f.prior_rng) = 60
      AND f.px_back5 > 0
      AND f.px_fwd5  > 0
      AND f.px_fwd10 > 0
      AND f.px_fwd20 > 0
      AND NOT arrayExists(d -> (d >= f.date - 10) AND (d <= f.date + 32), s.split_days)
)
SELECT
    signal_date,
    signal_label,
    ticker,
    five_day_fall_pct,
    fwd_20_pct
FROM
(
    SELECT
        toString(date)                           AS signal_date,
        formatDateTime(date, '%b %e, %Y')        AS signal_label,
        ticker,
        round(abs(100 * (px / px_back5 - 1)), 2) AS five_day_fall_pct,
        round(100 * (px_fwd20 / px - 1), 2)      AS fwd_20_pct
    FROM scored
    WHERE is_wedge = 1
    ORDER BY date DESC
    LIMIT 12
)
ORDER BY signal_date ASC
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.