ทฤษฎีดาว: สัญญาณยืนยันจากหุ้นขนส่งยังใช้ได้ไหม
ทฤษฎีดาวคืออะไร และหลักการยืนยันข้ามดัชนีใช้ได้จริงแค่ไหน บทความนี้อธิบายหกข้อของทฤษฎีดาวเป็นภาษาไทย แล้วทดสอบด้วยข้อมูลรายวันของ DIA และ IYT ตลอดประวัติที่มี
ทฤษฎีดาว (Dow Theory) คือกรอบการอ่านแนวโน้มตลาดหุ้นที่เรียบเรียงขึ้นจากบทบรรณาธิการของ Charles Dow ในช่วงปลายศตวรรษที่ 19 และถูกจัดเป็นหลัก 6 ข้อโดยนักเขียนรุ่นถัดมา แกนกลางของทฤษฎีดาวคือข้อเสนอว่าแนวโน้มหลักของตลาดจะน่าเชื่อถือขึ้นเมื่อดัชนีกลุ่มอุตสาหกรรมและดัชนีกลุ่มขนส่งทำจุดสูงสุดใหม่ไปในทางเดียวกัน หน้านี้อธิบายหลักทั้งหกข้อเป็นภาษาไทย แล้วทำสิ่งที่หน้าพจนานุกรมศัพท์ไม่ทำ นั่นคือเอาหลักข้อ "ดัชนีต้องยืนยันกันเอง" ไปวัดกับราคาปิดรายวันจริงตลอดประวัติที่มี
ทฤษฎีดาวคืออะไร และหลัก 6 ข้อว่าอะไรไว้
หลักทั้งหกข้อไม่ใช่สูตรคำนวณ มันคือข้อสังเกตเชิงโครงสร้างที่เขียนไว้ก่อนยุคคอมพิวเตอร์ อ่านครั้งเดียวจบ แต่ข้อที่สี่เป็นข้อเดียวที่แปลงเป็นตัวเลขได้ตรงไปตรงมา
- ราคาของดัชนีรวมข้อมูลที่เปิดเผยแล้วทั้งหมดเข้าไปอยู่แล้ว ทฤษฎีดาวถือว่าสิ่งที่นักลงทุนทุกคนรู้ ปรากฏอยู่ในราคาปิดวันนี้แล้ว
- ตลาดมีสามแนวโน้มซ้อนกัน คือแนวโน้มหลัก (primary trend) แนวโน้มรอง (secondary trend) และแนวโน้มย่อย (minor trend)
- แนวโน้มหลักเดินผ่านสามระยะ ระยะสะสมของผู้เล่นที่มีข้อมูล ระยะที่คนทั่วไปเข้าร่วม และระยะระบายของ
- ดัชนีต้องยืนยันกันเอง ขาขึ้นของดัชนีอุตสาหกรรมจะถือว่าสมบูรณ์เมื่อดัชนีขนส่งทำจุดสูงสุดใหม่ในช่วงเวลาใกล้กัน
- ปริมาณการซื้อขายเดินไปกับแนวโน้ม ในขาขึ้น วันที่ราคาขึ้นมักมีวอลุ่มหนากว่าวันที่ราคาย่อ
- แนวโน้มยังมีผลอยู่จนกว่าจะมีสัญญาณกลับตัวที่ชัดเจน ภาระการพิสูจน์อยู่ที่ฝ่ายที่บอกว่าแนวโน้มจบแล้ว
เหตุผลที่ข้อสี่ถูกวางไว้กลางทฤษฎี มาจากตรรกะของเศรษฐกิจยุคนั้น ถ้าโรงงานผลิตของได้มากขึ้นจริง ของเหล่านั้นต้องถูกขนออกไปด้วยราง ด้วยเรือ ด้วยรถบรรทุก ดัชนีขนส่งจึงทำหน้าที่เป็นใบเสร็จของกิจกรรมที่ดัชนีอุตสาหกรรมบอกไว้ เมื่อดัชนีอุตสาหกรรมทำจุดสูงสุดใหม่แต่ดัชนีขนส่งไม่ตามมา ทฤษฎีดาวเรียกสภาพนั้นว่าการไม่ยืนยัน (non confirmation)
แนวโน้มหลัก แนวโน้มรอง และแนวโน้มย่อย ต่างกันอย่างไร
แนวโน้มหลักกินเวลาเป็นเดือนถึงหลายปี เป็นทิศทางที่ทฤษฎีดาวสนใจจริง แนวโน้มรองคือการย้อนทางภายในแนวโน้มหลัก กินเวลาราวสามสัปดาห์ถึงสามเดือน และมักไล่คืนราคาไปได้ราวหนึ่งในสามถึงสองในสามของขาก่อนหน้า แนวโน้มย่อยคือความเคลื่อนไหวรายวันถึงรายสองสัปดาห์ ซึ่งทฤษฎีดาวถือว่าเป็นเสียงรบกวน
การแยกสามชั้นนี้อธิบายว่าทำไมคนสองคนดูกราฟเดียวกันแล้วเห็นไม่เหมือนกัน คนหนึ่งกำลังพูดถึงแนวโน้มหลัก อีกคนกำลังพูดถึงแนวโน้มย่อยที่กินเวลาสี่วัน เครื่องมือวัดความกว้างของตลาดช่วยแยกสองชั้นนี้ออกจากกันได้ ลองอ่านต่อที่ ดัชนี High Low กับการวัดความกว้างของตลาด และ จุดสูงสุดและจุดต่ำสุด 52 สัปดาห์ ซึ่งนับสิ่งเดียวกันในสเกลที่ยาวกว่า
ทำไมต้องใช้ DIA กับ IYT แทนดัชนีดาวสองตัว
ต้องพูดตรงนี้ให้ชัดก่อนดูตัวเลข ดัชนี Dow Jones Industrial Average และ Dow Jones Transportation Average ไม่ใช่หลักทรัพย์ที่ซื้อขายได้ จึงไม่มีราคาปิดรายวันของตัวเองในชุดข้อมูลราคาหุ้น การทดสอบทั้งหน้านี้ใช้ ETF สองตัวเป็นตัวแทน
DIA คือ SPDR Dow Jones Industrial Average ETF ใช้แทนฝั่งอุตสาหกรรม IYT คือ iShares U.S. Transportation ETF ใช้แทนฝั่งขนส่ง IYT อ้างอิงดัชนีขนส่งของสหรัฐที่มีรายชื่อหุ้นและน้ำหนักใกล้เคียงกับดัชนีขนส่งของดาว แต่ไม่ใช่ดัชนีเดียวกัน ตัวเลขที่ได้จึงเป็นการวัดพฤติกรรมของตัวแทน ไม่ใช่การวัดดัชนีดั้งเดิม นอกจากนี้ตัวเลขทั้งหมดคำนวณจากราคาปิดรายวันเท่านั้น เงินปันผลและการจ่ายคืนของกองทุนไม่ถูกรวมเข้าไปในผลตอบแทนที่แสดง
ทดสอบหลักการยืนยัน เมื่อ DIA ทำจุดสูงสุด 3 เดือน แล้ว IYT ตามไหม
นิยามที่ใช้ตลอดหน้านี้มีสามบรรทัด หนึ่ง วันที่ DIA ปิดสูงกว่าราคาปิดสูงสุดของ 62 วันทำการก่อนหน้า นับเป็นสัญญาณจุดสูงสุด 3 เดือนใหม่ (63 วันทำการเท่ากับราวสามเดือนปฏิทิน) สอง สัญญาณนั้นถือว่าได้รับการยืนยันเมื่อ IYT ทำจุดสูงสุด 3 เดือนใหม่ของตัวเองภายใน 20 วันทำการถัดมา นับรวมวันเดียวกัน สาม กรณีที่ไม่มีการยืนยันภายในหน้าต่าง 20 วันทำการ นับเป็นการไม่ยืนยัน
| year | signal_count | confirmed_count | confirmed_pct |
|---|---|---|---|
| 2004 | 22 | 19 | 86.4 |
| 2005 | 15 | 15 | 100 |
| 2006 | 53 | 38 | 71.7 |
| 2007 | 38 | 32 | 84.2 |
| 2008 | 6 | 6 | 100 |
| 2009 | 43 | 40 | 93 |
| 2010 | 44 | 41 | 93.2 |
| 2011 | 34 | 31 | 91.2 |
| 2012 | 39 | 10 | 25.6 |
| 2013 | 64 | 59 | 92.2 |
| 2014 | 39 | 39 | 100 |
| 2015 | 12 | 4 | 33.3 |
| 2016 | 33 | 21 | 63.6 |
| 2017 | 70 | 53 | 75.7 |
| 2018 | 30 | 19 | 63.3 |
| 2019 | 37 | 17 | 45.9 |
| 2020 | 30 | 27 | 90 |
| 2021 | 47 | 35 | 74.5 |
| 2022 | 11 | 7 | 63.6 |
| 2023 | 29 | 27 | 93.1 |
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
px AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('DIA', 'IYT')
GROUP BY ticker, date
),
joint AS
(
SELECT
date,
anyIf(close_px, ticker = 'DIA') AS dia,
anyIf(close_px, ticker = 'IYT') AS iyt
FROM px
GROUP BY date
HAVING countIf(ticker = 'DIA') = 1 AND countIf(ticker = 'IYT') = 1
),
rolled AS
(
SELECT
date,
dia,
iyt,
row_number() OVER (ORDER BY date) AS i,
count() OVER () AS n,
max(dia) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS dia_prior_high,
max(iyt) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS iyt_prior_high
FROM joint
),
marked AS
(
SELECT
date,
i,
n,
if(i > 62 AND dia > dia_prior_high, 1, 0) AS dia_signal,
if(i > 62 AND iyt > iyt_prior_high, 1, 0) AS iyt_signal
FROM rolled
),
scanned AS
(
SELECT
date,
i,
n,
dia_signal,
indexOf(groupArray(iyt_signal) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING), 1) - 1 AS confirm_lag
FROM marked
)
SELECT
toYear(date) AS year,
count() AS signal_count,
countIf(confirm_lag >= 0) AS confirmed_count,
round(100 * countIf(confirm_lag >= 0) / count(), 1) AS confirmed_pct
FROM scanned
WHERE dia_signal = 1 AND i + 20 <= n
GROUP BY year
ORDER BY yearแผงนี้ครอบคลุม 23 ปี ตั้งแต่ปี 2004 ซึ่งเป็นปีแรกที่ทั้ง DIA และ IYT มีราคาปิดยาวพอจะคิดหน้าต่างย้อนหลัง 63 วันทำการได้ ไปจนถึงปี 2026 เส้น confirmed_pct คือสัดส่วนของสัญญาณในปีนั้นที่ IYT ตามมาทำจุดสูงสุดใหม่ทันหน้าต่าง 20 วันทำการ สิ่งที่กราฟบอกไม่ใช่ค่าเฉลี่ยค่าเดียว แต่เป็นความไม่นิ่งของมัน สัดส่วนการยืนยันขยับขึ้นลงเป็นปี ไม่ใช่ค่าคงที่ที่ยกไปใช้ข้ามยุคได้
จำนวนสัญญาณต่อปีก็อ่านได้เหมือนกัน ปีที่ตลาดไต่ขึ้นต่อเนื่องจะมีวันทำจุดสูงสุด 3 เดือนใหม่หลายสิบวัน ส่วนปีที่ราคาย่อลึกอาจมีเพียงไม่กี่วันหรือไม่มีเลย นี่คือเหตุที่การนับสัญญาณแบบนี้ให้กลุ่มตัวอย่างที่กระจุกตัว ไม่ใช่ตัวอย่างอิสระที่กระจายเท่ากันทุกปี
ยืนยันแล้วกับไม่ยืนยัน ผลต่างกันแค่ไหน
คำถามที่หน้าพจนานุกรมศัพท์ไม่ตอบคือ การยืนยันแยกอะไรได้จริงหรือไม่ วิธีวัดที่ตรงที่สุดคือดูราคา DIA ข้างหน้าจากวันที่เกิดสัญญาณ แผงถัดไปแบ่งสัญญาณทั้งหมดเป็นสองแถว แล้ววัดค่ากลางของผลตอบแทนราคา 63 วันทำการ (ราว 3 เดือน) และ 126 วันทำการ (ราว 6 เดือน) ข้างหน้า นับเฉพาะสัญญาณที่มีข้อมูลข้างหน้าครบ 126 วันทำการ
| label | signal_count | share_pct | median_fwd_3m_pct | median_fwd_6m_pct | up_after_3m_pct |
|---|---|---|---|---|---|
| ยืนยันภายใน 20 วันทำการ | 609 | 77.9 | 2.45 | 4.17 | 72.2 |
| ไม่ยืนยัน | 173 | 22.1 | -0.15 | 3.92 | 49.1 |
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
px AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('DIA', 'IYT')
GROUP BY ticker, date
),
joint AS
(
SELECT
date,
anyIf(close_px, ticker = 'DIA') AS dia,
anyIf(close_px, ticker = 'IYT') AS iyt
FROM px
GROUP BY date
HAVING countIf(ticker = 'DIA') = 1 AND countIf(ticker = 'IYT') = 1
),
rolled AS
(
SELECT
date,
dia,
iyt,
row_number() OVER (ORDER BY date) AS i,
count() OVER () AS n,
max(dia) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS dia_prior_high,
max(iyt) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS iyt_prior_high
FROM joint
),
marked AS
(
SELECT
date,
dia,
i,
n,
if(i > 62 AND dia > dia_prior_high, 1, 0) AS dia_signal,
if(i > 62 AND iyt > iyt_prior_high, 1, 0) AS iyt_signal
FROM rolled
),
scanned AS
(
SELECT
dia,
i,
n,
dia_signal,
indexOf(groupArray(iyt_signal) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING), 1) - 1 AS confirm_lag,
leadInFrame(dia, 63) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS dia_plus_63,
leadInFrame(dia, 126) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS dia_plus_126
FROM marked
),
signals AS
(
SELECT
i,
confirm_lag >= 0 AS confirmed,
100 * (dia_plus_63 / dia - 1) AS fwd_3m_pct,
100 * (dia_plus_126 / dia - 1) AS fwd_6m_pct,
count() OVER () AS n_signals
FROM scanned
WHERE dia_signal = 1 AND i + 126 <= n
)
SELECT
if(confirmed, 'ยืนยันภายใน 20 วันทำการ', 'ไม่ยืนยัน') AS label,
count() AS signal_count,
round(100 * count() / any(n_signals), 1) AS share_pct,
round(quantileDeterministic(0.5)(fwd_3m_pct, toUInt32(i)), 2) AS median_fwd_3m_pct,
round(quantileDeterministic(0.5)(fwd_6m_pct, toUInt32(i)), 2) AS median_fwd_6m_pct,
round(100 * countIf(fwd_3m_pct > 0) / count(), 1) AS up_after_3m_pct
FROM signals
GROUP BY confirmed
ORDER BY confirmed DESCอ่านสองแถวนี้ทีละคอลัมน์ สัญญาณที่ IYT ยืนยันมี 609 ครั้ง คิดเป็น 77.9% ของสัญญาณทั้งหมด ส่วนที่เหลืออีก 173 ครั้งคือกรณีที่ IYT ไม่ทำจุดสูงสุด 3 เดือนใหม่ทันหน้าต่าง ค่ากลางของผลตอบแทนราคา DIA 63 วันทำการข้างหน้าอยู่ที่ 2.45% ในแถวที่ยืนยัน และ -0.15% ในแถวที่ไม่ยืนยัน เมื่อขยายไปที่ 126 วันทำการ ค่ากลางอยู่ที่ 4.17% และ 3.92% ตามลำดับ
คอลัมน์สุดท้ายนับความถี่แทนขนาด สัดส่วนของสัญญาณที่ราคา DIA หลัง 63 วันทำการอยู่สูงกว่าวันสัญญาณ เท่ากับ 72.2% ในแถวที่ยืนยัน และ 49.1% ในแถวที่ไม่ยืนยัน ส่วนต่างระหว่างสองแถวคือสิ่งที่หลักการยืนยันอ้างว่ามีอยู่ ขนาดของมันวัดได้จากตัวเลขในตาราง ไม่ใช่จากความรู้สึก และตัวเลขเหล่านี้เป็นสถิติของอดีตที่เกิดขึ้นแล้ว ไม่ใช่การคาดการณ์ราคาข้างหน้า และไม่ใช่คำแนะนำการลงทุน
ถ้าจะยืนยัน การยืนยันมักมาเร็วแค่ไหน
หน้าต่าง 20 วันทำการเป็นตัวเลขที่เลือกเอง ถ้าการยืนยันส่วนใหญ่เกิดขึ้นในไม่กี่วันแรก หน้าต่างที่ยาวกว่านี้ก็แทบไม่เปลี่ยนผล แผงถัดไปนับเฉพาะสัญญาณที่ได้รับการยืนยัน แล้วดูว่าใช้เวลากี่วันทำการจนถึงจุดสูงสุด 3 เดือนใหม่ครั้งแรกของ IYT
| lag_bucket | signal_count | share_pct |
|---|---|---|
| 0 ถึง 2 วัน | 405 | 64.8 |
| 3 ถึง 5 วัน | 74 | 11.8 |
| 6 ถึง 10 วัน | 57 | 9.1 |
| 11 ถึง 15 วัน | 47 | 7.5 |
| 16 ถึง 20 วัน | 42 | 6.7 |
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
px AS
(
SELECT
ticker,
date,
toFloat64(max(close)) AS close_px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('DIA', 'IYT')
GROUP BY ticker, date
),
joint AS
(
SELECT
date,
anyIf(close_px, ticker = 'DIA') AS dia,
anyIf(close_px, ticker = 'IYT') AS iyt
FROM px
GROUP BY date
HAVING countIf(ticker = 'DIA') = 1 AND countIf(ticker = 'IYT') = 1
),
rolled AS
(
SELECT
date,
dia,
iyt,
row_number() OVER (ORDER BY date) AS i,
count() OVER () AS n,
max(dia) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS dia_prior_high,
max(iyt) OVER (ORDER BY date ROWS BETWEEN 62 PRECEDING AND 1 PRECEDING) AS iyt_prior_high
FROM joint
),
marked AS
(
SELECT
date,
i,
n,
if(i > 62 AND dia > dia_prior_high, 1, 0) AS dia_signal,
if(i > 62 AND iyt > iyt_prior_high, 1, 0) AS iyt_signal
FROM rolled
),
scanned AS
(
SELECT
i,
n,
dia_signal,
indexOf(groupArray(iyt_signal) OVER (ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING), 1) - 1 AS confirm_lag
FROM marked
),
confirmed_signals AS
(
SELECT
confirm_lag,
count() OVER () AS n_confirmed
FROM scanned
WHERE dia_signal = 1 AND i + 20 <= n AND confirm_lag >= 0
)
SELECT
multiIf(confirm_lag <= 2, '0 ถึง 2 วัน',
confirm_lag <= 5, '3 ถึง 5 วัน',
confirm_lag <= 10, '6 ถึง 10 วัน',
confirm_lag <= 15, '11 ถึง 15 วัน',
'16 ถึง 20 วัน') AS lag_bucket,
count() AS signal_count,
round(100 * count() / any(n_confirmed), 1) AS share_pct
FROM confirmed_signals
GROUP BY lag_bucket
ORDER BY min(confirm_lag)กลุ่มแรกของกราฟคือช่วง 0 ถึง 2 วัน ซึ่งกินสัดส่วน 64.8% ของการยืนยันทั้งหมด รูปร่างของแท่งที่ไล่ลงจากซ้ายไปขวาบอกว่าการยืนยันเป็นเรื่องของช่วงต้นหน้าต่าง ไม่ใช่เรื่องที่ค่อยทยอยเกิดเท่ากันทุกวัน ในทางปฏิบัติความหมายคือ ถ้าดัชนีขนส่งไม่ตามมาในสองสามวันแรก โอกาสที่จะตามมาในวันที่ 18 หรือ 19 ก็บางลงตามลำดับ นี่เป็นเหตุผลเชิงข้อมูลว่าทำไมหน้าต่างวัดยาวขึ้นจึงไม่ช่วยมากอย่างที่คิด และเป็นตัวอย่างของการทดสอบความไวต่อพารามิเตอร์ที่อธิบายไว้ใน วิธีทดสอบย้อนหลังกลยุทธ์อย่างเป็นระบบ
หน้าต่างตัวอย่างแบบตรึงวันที่ ปี 2024 ถึงกลางปี 2026
ค่ากลางปิดบังรายละเอียด การดูสองเส้นคู่กันในช่วงเวลาที่ตรึงไว้จึงช่วยให้เห็นว่าการไม่ยืนยันมีหน้าตาอย่างไรบนกราฟ แผงถัดไปตรึงช่วงเวลาไว้คงที่ ปรับทั้ง DIA และ IYT ให้เริ่มที่ 100 ในเดือนแรกของช่วง แล้วดูราคาปิดสิ้นเดือน ตัวเลขในแผงนี้จะไม่เปลี่ยนตามวันที่ผู้อ่านเปิดหน้า
| month | dia_index | iyt_index | spread |
|---|---|---|---|
| 2024-01 | 100 | 100 | 0 |
| 2024-02 | 102.2 | 108.9 | -6.7 |
| 2024-03 | 104.3 | 109.1 | -4.8 |
| 2024-04 | 99.2 | 99.6 | -0.4 |
| 2024-05 | 101.6 | 99.4 | 2.2 |
| 2024-06 | 102.6 | 101.4 | 1.2 |
| 2024-07 | 107.1 | 102.2 | 4.9 |
| 2024-08 | 109.1 | 104.2 | 4.9 |
| 2024-09 | 110.9 | 106.7 | 4.2 |
| 2024-10 | 109.5 | 107.3 | 2.2 |
| 2024-11 | 118 | 115.7 | 2.3 |
| 2024-12 | 111.6 | 104.7 | 6.9 |
| 2025-01 | 116.8 | 108.7 | 8.1 |
| 2025-02 | 114.9 | 108.2 | 6.7 |
| 2025-03 | 110.1 | 99.2 | 10.9 |
| 2025-04 | 106.5 | 94.2 | 12.3 |
| 2025-05 | 110.9 | 101.3 | 9.6 |
| 2025-06 | 115.5 | 106.2 | 9.3 |
| 2025-07 | 115.7 | 105.3 | 10.4 |
| 2025-08 | 119.6 | 110.5 | 9.1 |
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
monthly AS
(
SELECT
ticker,
toStartOfMonth(date) AS month_start,
argMax(toFloat64(close), date) AS month_close
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('DIA', 'IYT')
AND date >= '2024-01-01'
AND date < '2026-07-01'
GROUP BY ticker, month_start
),
base AS
(
SELECT
ticker,
argMin(month_close, month_start) AS base_close
FROM monthly
GROUP BY ticker
),
rebased AS
(
SELECT
formatDateTime(m.month_start, '%Y-%m') AS month,
round(100 * anyIf(m.month_close / b.base_close, m.ticker = 'DIA'), 1) AS dia_index,
round(100 * anyIf(m.month_close / b.base_close, m.ticker = 'IYT'), 1) AS iyt_index
FROM monthly AS m
INNER JOIN base AS b ON b.ticker = m.ticker
GROUP BY m.month_start
)
SELECT
month,
dia_index,
iyt_index,
round(dia_index - iyt_index, 1) AS spread
FROM rebased
ORDER BY monthช่วงที่ตรึงไว้มี 30 เดือน เริ่มที่ 2024-01 และจบที่ 2026-06 เดือนสุดท้ายของช่วง DIA อยู่ที่ดัชนี 137 และ IYT อยู่ที่ 134.4 คอลัมน์ spread คือระยะห่างของสองเส้นในหน่วยจุดดัชนี เดือนสุดท้ายอยู่ที่ 2.6 จุด โดยค่าบวกหมายถึง DIA อยู่เหนือ IYT และค่าลบหมายถึงตรงกันข้าม
สิ่งที่ผู้อ่านควรฝึกตาคือช่วงที่เส้นบนยกตัวขึ้นแต่เส้นล่างเดินราบ นั่นคือภาพของการไม่ยืนยันในสายตาของทฤษฎีดาว ข้อควรระวังคือกราฟแบบนี้ชวนให้เล่าเรื่องเกินข้อมูล การไม่ยืนยันเป็นการบรรยายสิ่งที่เกิดพร้อมกัน ไม่ใช่การบอกว่าอะไรทำให้อะไรเกิด สำหรับสัญญาณเชิงกลไกอีกตัวที่ชื่อเสียงกับสถิติไม่ตรงกันนัก อ่านต่อได้ที่ สัญญาณ Death Cross ที่ผลย้อนหลังไม่เป็นไปตามชื่อ
ข้อจำกัดของการทดสอบนี้
- ตัวแทนไม่ใช่ของจริง DIA และ IYT ไม่ใช่ดัชนีอุตสาหกรรมและดัชนีขนส่งของดาว ผลที่ได้จึงผูกกับรายชื่อหุ้นและน้ำหนักของ ETF สองตัวนั้น
- พารามิเตอร์ 63 วันทำการและ 20 วันทำการเป็นการเลือกของเรา นิยามอื่นให้ตัวเลขอื่น ตัวเลขที่เปลี่ยนตามพารามิเตอร์ไม่ใช่กฎธรรมชาติ
- สัญญาณซ้อนกัน วันที่ทำจุดสูงสุดใหม่มักเกาะกลุ่มกันเป็นช่วง ผลตอบแทนข้างหน้าของสัญญาณใกล้กันจึงทับกัน ค่ากลางที่ได้ไม่ใช่ค่ากลางของตัวอย่างอิสระ
- ช่วงเวลาที่มีข้อมูลครอบคลุมตลาดขาขึ้นเป็นสัดส่วนใหญ่ ค่ากลางของผลตอบแทนข้างหน้าในทุกกลุ่มจึงถูกยกขึ้นด้วยแนวโน้มระยะยาวของตลาดเอง ไม่ใช่ด้วยการยืนยันเพียงอย่างเดียว
- ทฤษฎีดาวฉบับดั้งเดิมใช้ดุลพินิจของคนอ่านกราฟ ส่วนการทดสอบนี้บังคับให้ทุกอย่างเป็นกฎเครื่องจักร สองอย่างไม่ใช่สิ่งเดียวกัน
ขอบเขตข้อมูลที่ใช้คำนวณ
ทุกตัวเลขในหน้านี้มาจากราคาปิดรายวันของ DIA และ IYT เท่านั้น แผงด้านล่างแสดงจำนวนวันทำการและวันแรกกับวันสุดท้ายที่มีข้อมูลของแต่ละสัญลักษณ์ การทดสอบใช้เฉพาะวันที่ทั้งสองสัญลักษณ์มีราคาปิดพร้อมกัน จำนวนวันที่ใช้จริงจึงเท่ากับส่วนที่ทับกันของสองแถวนี้ ไม่ใช่ผลรวม
| ticker | session_count | first_session | last_session |
|---|---|---|---|
| DIA | 5799 | 2003-09-10 | 2026-09-28 |
| IYT | 5777 | 2003-10-10 | 2026-09-28 |
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
ticker,
countDistinct(date) AS session_count,
toString(min(date)) AS first_session,
toString(max(date)) AS last_session
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('DIA', 'IYT')
GROUP BY ticker
ORDER BY tickerแถวแรกมี 5799 วันทำการ และแถวที่สองมี 5777 วันทำการ ส่วนต่างของสองตัวเลขมาจากวันเริ่มต้นที่ไม่เท่ากันของสองกองทุน ซึ่งเป็นเหตุที่ปีแรกในแผงรายปีข้างบนไม่ใช่ปีแรกของตารางนี้
กรอบรายวันกับคนที่ดูตลาดสหรัฐจากกรุงเทพ
ข้อดีที่เป็นรูปธรรมของทฤษฎีดาวสำหรับผู้อ่านในไทยคือมันทำงานบนแท่งรายวัน ไม่ใช่บนการเคลื่อนไหวรายนาที ตลาดหุ้นสหรัฐเปิดภาคปกติเวลา 9:30 ถึง 16:00 ตามเวลา ET ซึ่งตรงกับ 20:30 ถึง 03:00 ตามเวลาไทยในช่วงที่สหรัฐใช้เวลาออมแสง และ 21:30 ถึง 04:00 ตามเวลาไทยในช่วงที่เหลือของปี คนที่ต้องตื่นไปทำงานเช้าไม่จำเป็นต้องนั่งเฝ้าช่วงนั้นทั้งหมด เพราะสัญญาณตามนิยามข้างบนใช้ราคาปิดเพียงค่าเดียวต่อวัน ตรวจครั้งเดียวหลังตลาดปิดก็ครบข้อมูลแล้ว
อีกประเด็นที่ควรรู้ไว้คือปฏิทิน ตลาดสหรัฐมีวันหยุดและวันปิดเร็วของตัวเอง ซึ่งไม่ตรงกับวันหยุดไทย การนับวันทำการในหน้านี้ใช้วันที่มีการซื้อขายจริงในข้อมูล ไม่ใช่วันตามปฏิทิน ดังนั้น 63 วันทำการจึงหมายถึง 63 วันที่ตลาดเปิดจริง ซึ่งยาวกว่าสามเดือนปฏิทินเล็กน้อยในปีที่มีวันหยุดหนาแน่น
FAQ
ทฤษฎีดาวคืออะไร
ทฤษฎีดาวคือชุดหลักการ 6 ข้อสำหรับอ่านแนวโน้มตลาดหุ้น เรียบเรียงจากงานเขียนของ Charles Dow ในช่วงปลายศตวรรษที่ 19 หลักการเหล่านี้พูดถึงสามชั้นของแนวโน้ม สามระยะของแนวโน้มหลัก บทบาทของปริมาณการซื้อขาย และเงื่อนไขที่ดัชนีสองกลุ่มต้องยืนยันกันเองก่อนจะถือว่าแนวโน้มสมบูรณ์
หลักการที่ว่าดัชนีต้องยืนยันกันเองยังใช้ได้อยู่ไหม
วัดตามนิยามในหน้านี้ สัญญาณจุดสูงสุด 3 เดือนของ DIA ได้รับการยืนยันจาก IYT ภายใน 20 วันทำการอยู่ที่ 77.9% ของกรณีทั้งหมด และค่ากลางของผลตอบแทนราคา 63 วันทำการข้างหน้าอยู่ที่ 2.45% ในกลุ่มที่ยืนยัน เทียบกับ -0.15% ในกลุ่มที่ไม่ยืนยัน ตัวเลขทั้งสองมาจากอดีตที่วัดได้ ไม่ใช่การพยากรณ์
ใช้ ETF ตัวไหนแทนดัชนีอุตสาหกรรมและดัชนีขนส่งของดาว
ดัชนีดาวทั้งสองตัวไม่ใช่หลักทรัพย์ที่ซื้อขายได้ หน้านี้ใช้ DIA เป็นตัวแทนฝั่งอุตสาหกรรม และ IYT เป็นตัวแทนฝั่งขนส่ง IYT อ้างอิงดัชนีขนส่งของสหรัฐที่ใกล้เคียงกับดัชนีขนส่งของดาว แต่ไม่ใช่ดัชนีเดียวกัน จึงต้องอ่านผลในฐานะการวัดตัวแทน
ทฤษฎีดาวใช้กับตลาดหุ้นไทยได้ไหม
หลักเรื่องสามชั้นของแนวโน้มและเรื่องปริมาณการซื้อขายเป็นข้อสังเกตทั่วไปที่อ่านกับตลาดไหนก็ได้ แต่หลักการยืนยันข้ามดัชนีต้องมีดัชนีสองชุดที่แยกฝั่งการผลิตออกจากฝั่งการขนส่งอย่างชัดเจน ผู้อ่านที่อยากทดสอบกับตลาดอื่นต้องเลือกตัวแทนของตัวเองก่อน แล้ววัดด้วยวิธีเดียวกับตารางข้างบน
ทุกแผงในหน้านี้เปิดดู SQL ที่อยู่ข้างใต้ได้ ตัวเลขจึงตรวจซ้ำได้ทีละบรรทัด ถ้าอยากเปลี่ยนหน้าต่างจาก 63 วันเป็น 126 วัน หรือเปลี่ยนตัวแทนเป็นสัญลักษณ์อื่น ลองถามเป็นภาษาธรรมดาบน Strasmore terminal แล้วดูว่าตัวเลขขยับไปทางไหน