{"slug":"dow-theory-and-transport-confirmation","qid":"confirmed_vs_not","label":"confirmed_vs_not","post_title":"dow-theory-and-transport-confirmation","post_url":"/blog/lang/th/dow-theory-and-transport-confirmation#q-confirmed_vs_not","columns":["label","signal_count","share_pct","median_fwd_3m_pct","median_fwd_6m_pct","up_after_3m_pct"],"rows":[{"label":"ยืนยันภายใน 20 วันทำการ","signal_count":609,"share_pct":77.9,"median_fwd_3m_pct":2.45,"median_fwd_6m_pct":4.17,"up_after_3m_pct":72.2},{"label":"ไม่ยืนยัน","signal_count":173,"share_pct":22.1,"median_fwd_3m_pct":-0.15,"median_fwd_6m_pct":3.92,"up_after_3m_pct":49.1}],"shape":"table","sql":"WITH\npx AS\n(\n    SELECT\n        ticker,\n        date,\n        toFloat64(max(close)) AS close_px\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('DIA', 'IYT')\n    GROUP BY ticker, date\n),\njoint AS\n(\n    SELECT\n        date,\n        anyIf(close_px, ticker = 'DIA') AS dia,\n        anyIf(close_px, ticker = 'IYT') AS iyt\n    FROM px\n    GROUP BY date\n    HAVING countIf(ticker = 'DIA') = 1 AND countIf(ticker = 'IYT') = 1\n),\nrolled AS\n(\n    SELECT\n        date,\n        dia,\n        iyt,\n        row_number() OVER (ORDER BY date) AS i,\n        count() OVER () AS n,\n        max(dia) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS dia_prior_high,\n        max(iyt) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS iyt_prior_high\n    FROM joint\n),\nmarked AS\n(\n    SELECT\n        date,\n        dia,\n        i,\n        n,\n        if(i > 62 AND dia > dia_prior_high, 1, 0) AS dia_signal,\n        if(i > 62 AND iyt > iyt_prior_high, 1, 0) AS iyt_signal\n    FROM rolled\n),\nscanned AS\n(\n    SELECT\n        dia,\n        i,\n        n,\n        dia_signal,\n        indexOf(groupArray(iyt_signal) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING), 1) - 1 AS confirm_lag,\n        leadInFrame(dia, 63) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)  AS dia_plus_63,\n        leadInFrame(dia, 126) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS dia_plus_126\n    FROM marked\n),\nsignals AS\n(\n    SELECT\n        i,\n        confirm_lag >= 0                     AS confirmed,\n        100 * (dia_plus_63 / dia - 1)        AS fwd_3m_pct,\n        100 * (dia_plus_126 / dia - 1)       AS fwd_6m_pct,\n        count() OVER ()                      AS n_signals\n    FROM scanned\n    WHERE dia_signal = 1 AND i + 126 <= n\n)\nSELECT\n    if(confirmed, 'ยืนยันภายใน 20 วันทำการ', 'ไม่ยืนยัน')                  AS label,\n    count()                                                                AS signal_count,\n    round(100 * count() / any(n_signals), 1)                               AS share_pct,\n    round(quantileDeterministic(0.5)(fwd_3m_pct, toUInt32(i)), 2)          AS median_fwd_3m_pct,\n    round(quantileDeterministic(0.5)(fwd_6m_pct, toUInt32(i)), 2)          AS median_fwd_6m_pct,\n    round(100 * countIf(fwd_3m_pct > 0) / count(), 1)                      AS up_after_3m_pct\nFROM signals\nGROUP BY confirmed\nORDER BY confirmed DESC","computed_at":"2026-09-28T15:33:30.730955+00:00","elapsed":0.028936366}