← สารบัญหนังสือ
1.2 — แหล่งข้อมูล + Time-Series Data
ภาค 1 · ข้อมูล · อ่าน ~8 นาที · OHLCV คืออะไร · แหล่งไหนใช้กับตลาดไหน · กับดัก 7 ตัวที่ทำให้ backtest โกหก
ข้อมูลราคาที่หลิวดูในจอเทรดทุกวัน — มันมาจากไหน? ทำมาจากอะไร? และที่สำคัญ — ทุก source ให้ข้อมูล "เหมือนกัน" จริงไหม?
คำตอบคือไม่ · และความต่างตรงนั้น ถ้าไม่รู้ จะทำให้ backtest เทพแต่ live พัง — เป็นกับดักที่เจ็บที่สุดในสายนี้
1. Time-Series Data คืออะไร — ภาษาหลักของ quant
ข้อมูลที่ quant ใช้เกือบ 100% อยู่ในรูป time series — ข้อมูลที่มีมิติเวลาเป็นแกนหลัก ทุก observation มี timestamp บอกว่า "เกิดตอนไหน" · ตรงข้ามกับ cross-sectional (ถ่ายรูป ณ เวลาเดียว เปรียบเทียบหลายสิ่ง) หรือข้อมูลทั่วไปที่ไม่มีมิติเวลา
ทำไม time series ถึงพิเศษ:
• ลำดับสำคัญ — วันที่ 100 ขึ้นอยู่กับวันที่ 1-99 · สับลำดับแถวแบบ random แล้วข้อมูลเสีย ความหมายหมดทันที
• ไม่ independent กัน — ราคาวันนี้สัมพันธ์กับราคาเมื่อวาน (autocorrelation) · สูตรสถิติทั่วไปที่ "assume independence" ใช้ตรงๆ ไม่ได้
• มี "มิติเวลา" — ตลาดมีรูปแบบรายวัน รายสัปดาห์ รายเดือน ฤดูกาล · การเข้าใจ time series = การเข้าใจว่า "เวลาสร้าง pattern" ยังไง
ภาค 6 ของหนังสือเล่มนี้จะเจาะลึก time series analysis (ARIMA, GARCH) แต่ตอนนี้รู้ไว้แค่นี้พอ: ทุกครั้งที่เราดูกราฟ เราดู time series อยู่เสมอ
2. OHLCV — หัวใจของทุก timeframe ที่หลิวเห็นในจอ
แท่งเทียนทุกแท่งที่หลิวเห็น ไม่ว่าจะ Daily H4 H1 M15 — ทั้งหมดมาจาก 5 ตัวเลขนี้:
O — Open ราคาเปิด (แท่งเริ่มที่ไหน)
H — High ราคาสูงสุดในช่วงนั้น
L — Low ราคาต่ำสุดในช่วงนั้น
C — Close ราคาปิด (แท่งจบที่ไหน — สำคัญที่สุดในทางสถิติ)
V — Volume ปริมาณการซื้อขาย (หน่วยต่างกันตามตลาด)
ดูเรียบง่าย แต่อยู่เบื้องหลังข้อมูลทุกชิ้นมีเรื่องที่ต้องรู้:
| ฟิลด์ | ดูเหมือนง่าย แต่มีซ่อน... | ผลกระทบถ้าไม่รู้ |
| Open | ราคาเปิดของ forex คือ "ราคาแรกหลังแท่งใหม่เริ่ม" — ซึ่งขึ้นกับว่าโบรกตัดแท่งกี่โมง | Open ต่างกันระหว่าง feed ที่ตัดคนละ timezone → สัญญาณไม่ตรงกัน |
| High / Low | ของ futures = ราคา actual · ของ forex spot = ราคาจากโบรกเดียว ไม่ใช่ตลาดรวม | ไส้เทียน high/low อาจต่างกันระหว่างโบรกถึง 5-10 จุด |
| Close | forex ไม่มีเวลาปิดจริง "Close" คือ convention ที่แต่ละ feed ตัดสินใจเอง | แท่ง Daily ของโบรก GMT+2 vs GMT+3 มีหน้าตาต่างกัน → indicator ต่างกัน |
| Volume | futures/หุ้น = contracts traded (ของจริง) · forex spot = tick volume (จำนวนครั้งที่ราคาขยับ) | Forex volume ไม่ใช่ volume จริง — ใช้ได้ระดับหยาบบน H1+ เท่านั้น |
💡 ข้อสรุปที่ต้องจำ: OHLCV ที่เห็นในจอไม่ใช่ "ความจริงสากล" — มันคือ "มุมมองของ feed นั้น ณ timezone นั้น" · ฟอเร็กซ์ไม่มีราคาปิดจริง ไม่มี volume กลางจริง ไม่มีตลาดกลางด้วยซ้ำ · แท่งเทียนที่เห็นคือ "มุมมองของโบรกคุณ" ไม่ใช่ความจริงสากล
3. จาก OHLCV ไป Tick — และความต่างของสองโลก
OHLCV คือ "สรุปรายช่วงเวลา" — เราตัดสินใจว่าจะสรุปทุก 1 วัน ทุก 4 ชั่วโมง ทุก 15 นาที แล้ว compress ทุก transaction ในช่วงนั้นให้เหลือ 5 ตัวเลข · ข้อมูล Tick คือสิ่งที่อยู่ก่อน compress นั้น — ทุก transaction จริงๆ ที่เกิดขึ้นในตลาด
Tick data คืออะไรในทางปฏิบัติ:
• ทุกครั้งที่ราคาขยับ (หรือทุก trade ที่เกิด) = 1 tick
• ข้อมูล 1 วันของ gold futures อาจมีหลายแสน tick
• ใน tick มีข้อมูลที่ OHLCV ทิ้งไป: ฝั่งที่เริ่ม (aggressor) — ใครยื่น market order? buyer หรือ seller?
• จาก tick เราสร้าง CVD (Cumulative Volume Delta) ได้ — วัดว่า "สุทธิแล้ว buying pressure หรือ selling pressure มากกว่า" · ซึ่งแม่นกว่า OBV มาก แต่ต้องการ tick data
Crypto คือตลาดที่ดีที่สุดสำหรับ tick: Binance ปล่อย aggTrades ฟรีแบบ real-time + historical — ระดับข้อมูลที่ตลาดอื่นต้องจ่ายหลักล้านต่อปี · นี่คือเหตุผลหนึ่งที่ quant รุ่นใหม่หลายคนเริ่มจาก crypto
4. แหล่งข้อมูลจริงต่อตลาด — ตู้กับข้าวของระบบเรา
| ตลาด | แหล่งที่ใช้อยู่ | ดีแค่ไหน | จุดอ่อนที่รู้ |
| ทองคำ | GC=F ผ่าน yfinance (CME futures) | ได้ volume จริงของตลาดกลางมาฟรี · ดีกว่า XAU spot ของโบรกใดๆ | ไม่มี open interest · เย็บ contract ต่อดิบๆ (ไม่ back-adjust) · gap ใกล้วัน roll ต้องเช็คมือ |
| Crypto | Binance public API | ดีที่สุดในโลกเทียบราคา (ฟรี) · ได้ OHLCV + aggTrades + funding + OI | ข้อมูล Binance เดียว (อาจต่างจาก exchange อื่น) · crypto เทรด 24/7 ต้องจัดการวันหยุดต่างจาก forex |
| Forex | yfinance (EURUSD=X ฯลฯ) | พอใช้สำหรับ Daily/H4 · ฟรี · ไม่ต้องตั้ง key | ไม่มี volume จริง (ใช้ tick volume เท่านั้น) · feed เดียว · ไม่มีตลาดกลาง |
| หุ้น US | yfinance / 13F (SEC EDGAR) | yfinance ราคาฟรีพอใช้ · 13F ตามสถาบันใหญ่ได้ฟรี | yfinance คือ scrape — ท่อแตกได้ทุกเมื่อ · adjusted price = ระวังกับดักข้อ 3 |
| หุ้นไทย | yfinance (.BK) / SETSMART | ฟรีมีอยู่แต่คุณภาพต่ำสุดใน 4 ตลาดเรา | มีรู มี delay · ของจริงต้องจ่าย SETSMART หรือผ่านโบรกไทย |
| Macro / บริบท | FRED · CFTC COT · ForexFactory | ขุมทรัพย์ฟรีระดับที่กองทุนยังใช้ | COT ออกทุกศุกร์ (lag 3 วัน) · macro ตัวเลขฉบับแรกมักถูกแก้ทีหลัง |
Dukascopy — ของดีที่หลายคนไม่รู้: tick data forex ย้อนหลังยาว คุณภาพดีเกินราคา (ฟรี) · เก็บไว้ในแผน — เมื่อระบบเราพิสูจน์ edge แล้วและ "ติดเพดานเรื่องความละเอียด" จึงปลดล็อก intraday จริงจัง · ลำดับนี้สำคัญ: ซื้อ/หาข้อมูลดีขึ้น หลังจาก พิสูจน์ edge ไม่ใช่ก่อน
5. กับดัก 7 ตัวที่เจ็บจริง — กฎเหล็กจากประสบการณ์คนอื่น
รายการนี้ไม่ใช่ทฤษฎี — ทุกข้อเกิดกับคนที่สร้างระบบจริงๆ และนอมเลือกมาเพราะระบบเราเจอ (หรือเสี่ยงเจอ) ทั้งหมด:
กับดัก 1 — Survivorship Bias (อคติผู้รอด)
universe ของเราคือ 41 ตัวที่ยังอยู่รอดจนวันนี้ · หุ้น/crypto ที่เคยมีแล้วหายไปไม่อยู่ในข้อมูล → baseline ฝั่ง buy&hold ของ R2 (research ของเรา) สวยเกินจริง · วิธีรับมือ: ระบุ assumption นี้ทุกครั้งที่รายงานผล — "ผลนี้อิง universe ที่ผ่านการ survival ไปแล้ว" ไม่ใช่ปิดปาก
กับดัก 2 — Point-in-Time (แอบดูเฉลย)
ใช้ตัวเลข GDP / งบบริษัท "ฉบับแก้ไข" ทดสอบอดีต — ข้อมูลนั้นไม่ได้มีอยู่ ณ เวลานั้น · ตัวเลขเดือน ม.ค. ถูก revise ใน มี.ค. → ถ้าใช้ฉบับ มี.ค. ทดสอบ ม.ค. = เวลาถอยหลัง = โกหก · วิธีรับมือ: macro ของเรา ตอนนี้ใช้ "สิ่งที่รู้ก่อนข่าว" เท่านั้น เช่น COT ของสัปดาห์ก่อน ปฏิทินข่าวที่ออกก่อนแล้ว
กับดัก 3 — Adjusted vs Unadjusted Price
ราคาหุ้น "adjusted" สำหรับปันผล/แตกพาร์ ปรับย้อนหลังทุกแท่ง → แนวรับ $97 ที่คนตอนนั้นเห็นจริงๆ กลายเป็น $92 ใน dataset ที่แก้แล้ว · breakout ผ่านแนวนั้นใน backtest = breakout ที่ไม่เคยเกิดในโลกจริง · วิธีรับมือ: adjusted ดีสำหรับผลตอบแทน · unadjusted ดีสำหรับ level จริง · เลือกให้ตรงกับสิ่งที่ทำ · ของเรา (ทอง crypto forex) ไม่มีปัญหานี้
กับดัก 4 — Contract Roll (futures)
GC futures หมดอายุทุก 2 เดือน — ราคา "ต่อเนื่อง" ที่เห็นคือหลายสัญญาเย็บต่อกัน รอยต่อมี gap เทียม (จาก basis ไม่ใช่ตลาดขยับ) · ระบบที่ไม่รู้จะเห็น "ราคากระโดด" ปลอมทุกเดือน → สัญญาณปลอม · วิธีรับมือ: yfinance GC=F เย็บมาให้แล้วแบบหนึ่ง (พอใช้ระดับเรา) แค่รู้ว่า gap แถววันหมดอายุ อย่าตีความเป็นสัญญาณ
กับดัก 5 — Tick Volume ≠ Volume จริง (Forex)
"ปริมาณ" ที่เห็นใน forex spot คือจำนวนครั้งที่ราคาขยับ ไม่ใช่จำนวนเงินที่ซื้อขาย · ใช้แทนกันได้หยาบๆ บน H1+ (สหสัมพันธ์สูงพอ) แต่อย่าเชื่อ 100% · วิธีรับมือ: เมื่อผลวิเคราะห์ sensitive กับ volume มากๆ ย้ายไปดู futures ยืนยัน · ทองของเรา ใช้ GC futures จึงมี volume จริง
กับดัก 6 — Timezone & Daylight Saving (บั๊กอันดับ 1 ข้ามตลาด)
ข้อมูล 2 ชุด timestamp คนละโซน → "วันเดียวกัน" เหลื่อมกัน 1 วัน → ระบบเห็นราคาทองของ "พรุ่งนี้" เทียบกับ DXY ของ "วันนี้" = look-ahead เงียบๆ ที่ทำให้ backtest เทพปลอม · สหรัฐกับยุโรปสลับ DST คนละสัปดาห์ ปีละ 2 ครั้ง — ช่วงนั้น intraday เหลื่อมชั่วโมง · วิธีรับมือ: normalize ทุกอย่างเป็น UTC ตั้งแต่ขาเข้า (ระบบเราทำแล้ว) + test สุ่มเปรียบชาร์ต feed กับจอโบรกจริงปีละ 4 ครั้ง
กับดัก 7 — API เปลี่ยน/ตาย (ท่อแตกกลางทะเล)
yfinance คือการ scrape Yahoo — โครงเว็บเปลี่ยน = ท่อแตก ข้อมูลหยุดไหลโดยไม่มีแจ้ง เกิดมาแล้วหลายรอบในประวัติศาสตร์ · วิธีรับมือ: เก็บ raw data ลงเครื่องทุกครั้งที่ดึง (ระบบเราทำแล้ว — data/ อยู่ในเครื่อง) + มีแผนสำรอง (Stooq / Dukascopy / Binance ตรง) — ให้ประวัติศาสตร์ของเราไม่ขึ้นอยู่กับ API ใดที่เดียว
กับดักที่อันตรายที่สุดคือกับดักที่ไม่ส่งเสียงเตือน: ระบบไม่พัง ไม่ error ไม่มีกราฟเอียงหรือตัวเลขประหลาด — มันแค่เงียบๆ ทำงานต่อ และผลิต backtest ที่ดูดีมาก · กว่าจะรู้ว่ามีบั๊กคือตอนไปเทรดจริง แล้วระบบทำผิดที่ผิดเวลา
6. API และ Database เบื้องต้น — รู้ไว้เพื่อสั่งให้ถูก
หลิวไม่ต้องเขียนโค้ดดึงข้อมูลเองทุกชิ้น แต่ต้องรู้ภาพรวมว่ามันทำงานยังไง เพื่อ "สั่งให้ถูกและตรวจงานเป็น":
API คืออะไรในภาษาบ้านๆ:
API = ประตูที่เราใช้ขอข้อมูลจากแหล่งข้อมูล · เหมือนโทรสั่งอาหาร — เราบอกว่าต้องการอะไร (ทอง Daily ย้อนหลัง 10 ปี) เขาส่งมาให้ เราไม่ต้องรู้ว่าข้างในเก็บยังไง
Database ต่างจาก API ยังไง:
API = "ร้องขอทุกครั้ง" ตลอดเวลา อาจช้า อาจมีขีดจำกัด อาจตายได้ · Database = "เก็บลงเครื่องตัวเอง" ดึงครั้งเดียวแล้วใช้ได้ไวตลอด · ระบบเราทำทั้งสอง: ดึงผ่าน API แล้ว save ลง local (CSV หรือ SQLite) ไว้ใช้ภายหลัง
สั่ง AI ดึงข้อมูลทอง (template):
"ดึงข้อมูล GC=F ผ่าน yfinance ตั้งแต่ 2015-01-01 จนถึงวันนี้
ใช้ interval='1d' (Daily)
save เป็น CSV ใส่โฟลเดอร์ data/raw/ ชื่อ gold_daily_raw.csv
normalize timestamp เป็น UTC ตั้งแต่ขาเข้า
หลังดึงเสร็จ print: จำนวน row / วันแรก / วันล่าสุด / จำนวน NaN ต่อ column"
สั่ง AI ดึงข้อมูล Binance (template):
"ดึง BTCUSDT OHLCV จาก Binance API
interval: '1d' (Daily)
ตั้งแต่ 2019-01-01
save เป็น CSV ใส่ data/raw/btc_daily_raw.csv
timestamp เป็น UTC · print summary เหมือนกัน"
7. เชื่อมกลับระบบเรา — feed ที่เลือกมามีเหตุผล
ทุกการตัดสินใจเรื่อง data ในระบบเราไม่ใช่เพราะนิสัย — มีเหตุผลที่มาจากกับดักข้างบน:
ทำไมทองใช้ GC (futures) ไม่ใช่ XAUUSD (spot):
Spot ไม่มีตลาดกลาง ไม่มี volume จริง ราคาจากโบรกเดียว · GC futures มีตลาดกลาง (CME) มี volume จริง มี open interest · ข้อมูลที่ดีกว่ามาก และยังฟรีผ่าน yfinance · ทุกครั้งที่ RVOL ของระบบเราบอก "มีของจริง" มันมาจาก volume ของ GC ไม่ใช่ tick poke ของ spot feed ใดก็ตาม
ทำไม Crypto เป็นตลาดที่ข้อมูลฟรีดีที่สุด:
Binance ปล่อย aggTrades — บอกว่าทุก trade เริ่มจากฝั่งไหน (buyer หรือ seller เป็น aggressor) · ข้อมูลแบบนี้ในตลาด futures ต้องจ่ายหลักล้านบาทต่อปี · ด้วย aggTrades เราสร้าง CVD ได้โดยไม่จ่ายเงิน — เป็น information edge สำหรับคนที่รู้จักใช้
💡 สรุปหลักการเลือก data ของคนตัวเล็ก: ใช้ข้อมูลที่ (1) ฟรีหรือถูก (2) คุณภาพตรวจสอบได้ (3) ตรงกับ timeframe ของ edge ที่มี · อย่าซื้อข้อมูลแพงเพื่อ "หา" edge — ซื้อเพื่อ "ขยาย" edge ที่พิสูจน์แล้วเท่านั้น · กลับด้านลำดับนี้คือสูตรเผาเงินมาตรฐานของ quant มือใหม่ทุนหนา