{"slug":"stochastic-oscillator-explained","qid":"base_rates","label":"base_rates","post_title":"stochastic-oscillator-explained","post_url":"/blog/lang/th/stochastic-oscillator-explained#q-base_rates","columns":["signal_group","median_fwd_5d_pct","median_fwd_10d_pct","median_fwd_20d_pct"],"rows":[{"signal_group":"%K ตัดลงต่ำกว่า 80","median_fwd_5d_pct":0.37,"median_fwd_10d_pct":0.73,"median_fwd_20d_pct":1.39},{"signal_group":"%K ตัดขึ้นเหนือ 20","median_fwd_5d_pct":0.52,"median_fwd_10d_pct":0.95,"median_fwd_20d_pct":1.55},{"signal_group":"ค่าฐาน: ทุกวันทำการ","median_fwd_5d_pct":0.39,"median_fwd_10d_pct":0.82,"median_fwd_20d_pct":1.48}],"shape":"ranking","sql":"WITH\n    bars AS (\n        SELECT\n            ticker,\n            date,\n            argMax(toFloat64(close), _ingest_time) AS close,\n            argMax(toFloat64(high),  _ingest_time) AS high,\n            argMax(toFloat64(low),   _ingest_time) AS low\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','JPM','JNJ','XOM','PG','KO','WMT','HD','UNH','CVX','PEP','MRK','CSCO','ORCL','MCD')\n          AND date >= '2015-01-01'\n          AND date <  '2026-09-01'\n        GROUP BY ticker, date\n    ),\n    ranges AS (\n        SELECT\n            ticker, date, close,\n            count()   OVER w14 AS n14,\n            max(high) OVER w14 AS hh14,\n            min(low)  OVER w14 AS ll14\n        FROM bars\n        WINDOW w14 AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW)\n    ),\n    fast AS (\n        SELECT\n            ticker, date, close,\n            if(hh14 > ll14, 100 * (close - ll14) / (hh14 - ll14), 50) AS k_fast\n        FROM ranges\n        WHERE n14 = 14\n    ),\n    slow AS (\n        SELECT\n            ticker, date, close,\n            avg(k_fast) OVER w3 AS k_slow,\n            count()     OVER w3 AS n3\n        FROM fast\n        WINDOW w3 AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)\n    ),\n    fwd AS (\n        SELECT\n            ticker, date, close, k_slow,\n            lagInFrame(k_slow, 1)  OVER wl AS k_prev,\n            leadInFrame(close, 5)  OVER wf AS c5,\n            leadInFrame(close, 10) OVER wf AS c10,\n            leadInFrame(close, 20) OVER wf AS c20\n        FROM slow\n        WHERE n3 = 3\n        WINDOW\n            wl AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW),\n            wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)\n    ),\n    tagged AS (\n        SELECT\n            100 * (c5  / close - 1)             AS fwd5_pct,\n            100 * (c10 / close - 1)             AS fwd10_pct,\n            100 * (c20 / close - 1)             AS fwd20_pct,\n            cityHash64(ticker, toString(date))  AS h,\n            arrayJoin(arrayConcat(\n                if((k_prev >= 80) AND (k_slow < 80), ['%K ตัดลงต่ำกว่า 80'], emptyArrayString()),\n                if((k_prev <= 20) AND (k_slow > 20), ['%K ตัดขึ้นเหนือ 20'], emptyArrayString()),\n                ['ค่าฐาน: ทุกวันทำการ']\n            ))                                  AS signal_group\n        FROM fwd\n        WHERE date >= '2016-01-01'\n          AND c5 > 0 AND c10 > 0 AND c20 > 0\n    )\nSELECT\n    signal_group,\n    round(quantileDeterministic(0.5)(fwd5_pct,  h), 2) AS median_fwd_5d_pct,\n    round(quantileDeterministic(0.5)(fwd10_pct, h), 2) AS median_fwd_10d_pct,\n    round(quantileDeterministic(0.5)(fwd20_pct, h), 2) AS median_fwd_20d_pct\nFROM tagged\nGROUP BY signal_group\nORDER BY indexOf(['%K ตัดลงต่ำกว่า 80', '%K ตัดขึ้นเหนือ 20', 'ค่าฐาน: ทุกวันทำการ'], signal_group)","computed_at":"2026-09-28T15:45:25.681937+00:00","elapsed":52.081538769}