NORMSTrading Platform
← สารบัญหนังสือ

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 จุด
Closeforex ไม่มีเวลาปิดจริง "Close" คือ convention ที่แต่ละ feed ตัดสินใจเองแท่ง Daily ของโบรก GMT+2 vs GMT+3 มีหน้าตาต่างกัน → indicator ต่างกัน
Volumefutures/หุ้น = 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 ต้องเช็คมือ
CryptoBinance public APIดีที่สุดในโลกเทียบราคา (ฟรี) · ได้ OHLCV + aggTrades + funding + OIข้อมูล Binance เดียว (อาจต่างจาก exchange อื่น) · crypto เทรด 24/7 ต้องจัดการวันหยุดต่างจาก forex
Forexyfinance (EURUSD=X ฯลฯ)พอใช้สำหรับ Daily/H4 · ฟรี · ไม่ต้องตั้ง keyไม่มี volume จริง (ใช้ tick volume เท่านั้น) · feed เดียว · ไม่มีตลาดกลาง
หุ้น USyfinance / 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 มือใหม่ทุนหนา
สรุปบทนี้: Time-series = ข้อมูลที่มีเวลาเป็นแกน ลำดับสำคัญ ห้ามสับ · OHLCV คือ 5 ตัวเลขที่สรุปทุก transaction ในช่วงเวลา — แต่ hidden ความต่างระหว่าง feed และ timezone เยอะกว่าที่เห็น · แหล่งที่ดีไม่ต้องแพง (GC futures / Binance / FRED / COT) · กับดัก 7 ตัว: survivorship · point-in-time · adjusted price · contract roll · tick volume · timezone/DST · API ตาย — รู้แล้ว รอด ไม่รู้แล้วทำ backtest เทพปลอม

บทถัดไป → 2.1 · Python เบื้องต้น — ภาษาที่แปล "ไอเดีย" เป็น "โค้ดที่คอมพิวเตอร์เข้าใจ" (ภาค 2 · เครื่องมือ)
← สารบัญหนังสือ