26 สิงหาคม 2026 · ข้อมูลตลาด

กายวิภาคของแท่งเทียน 1 นาทีหนึ่งแท่ง: ทุกสิ่งที่ OHLCV ไม่ได้บอกแบ็คเทสต์ของคุณ

กายวิภาคของแท่งเทียน 1 นาทีหนึ่งแท่ง: ทุกสิ่งที่ OHLCV ไม่ได้บอกแบ็คเทสต์ของคุณ

นี่คือแท่งเทียนหนึ่งแท่ง จาก Binance USDⓈ-M perpetual คู่ BTCUSDT ของนาทีที่เริ่มต้นเวลา 13:46:00 UTC มันออกมาจาก endpoint ของ klines ในรูปอาร์เรย์เปล่าๆ ที่มีสิบสองค่า และนี่คือหน่วยข้อมูลนำเข้าที่พบบ่อยที่สุดหน่วยเดียวในงานวิจัยเชิงปริมาณระดับรีเทลและใกล้เคียง แทบทุกกลยุทธ์ที่เราสร้างขึ้นล้วนแตะต้องสิ่งที่มีรูปร่างแบบนี้

ดังนั้นเรามาแกะมันออกทีละ index กัน แล้วดูว่าแบ็คเทสต์เข้าใจผิดไปกี่จุด

ดัชนีค่าชื่อ
01773495960000เวลาเปิด (ms)
1"84120.50"เปิด
2"84177.90"สูงสุด
3"84098.10"ต่ำสุด
4"84163.40"ปิด
5"38.417"ปริมาณฐาน (BTC)
61773496019999เวลาปิด (ms)
7"3232108.94"ปริมาณอ้างอิง (USDT)
81204จำนวนการซื้อขาย
9"21.883"ปริมาณฐานที่ taker ซื้อ
10"1841203.55"ปริมาณอ้างอิงที่ taker ซื้อ
11"0"ละเว้น

[0] และ [6]: นาทีนี้คือนาทีไหน และนาฬิกาของใครที่บอก

เวลาเปิด 1773495960000 เวลาปิด 1773496019999 สังเกตค่าที่สอง: มันลงท้ายด้วย 19999 ซึ่งน้อยกว่าเวลาเปิดของแท่งถัดไปอยู่หนึ่งมิลลิวินาทีพอดี ช่วงเวลานี้เป็นแบบ half-open (เปิดครึ่งหนึ่ง) และตัวเอ็กซ์เชนจ์ก็บอกเราแบบนี้อย่างชัดเจน บั๊กเกี่ยวกับข้อมูลที่เราเคยตามล่าครึ่งหนึ่งเริ่มต้นจากการที่มีคนถือว่าทั้งสองปลายเป็น inclusive แล้วนับการซื้อขายที่ขอบซ้ำสอง หรือจัดแนว resample จนแท่ง 5 นาทีแต่ละแท่งยืมมิลลิวินาทีมาจากแท่งข้างเคียง

timestamp เหล่านี้คือเวลาของ matching engine ของเอ็กซ์เชนจ์ ไม่ใช่นาฬิกาของคุณ ไม่ใช่นาฬิกาตอนนำเข้าข้อมูลของผู้ให้บริการ และไม่ใช่นาฬิกาเดียวกับที่ funding snapshot ใช้ เมื่อคุณ join ชุดข้อมูล kline เข้ากับชุดข้อมูล funding rate หรือ open interest ที่ดึงมาจาก endpoint อื่น คุณกำลัง join ข้ามแหล่งข้อมูลที่ตรงกันในระดับประมาณหนึ่งวินาที ส่วนใหญ่แล้ว สำหรับกลยุทธ์ 1 นาที นั่นคือความคลาดเคลื่อนด้านเวลา 1.7% ในทุกแถวที่ join กัน และสำหรับอะไรก็ตามที่สั้นกว่าหนึ่งนาที นี่คือจุดจบ

และแท่งนี้ถูกประทับเวลาที่เวลาเปิดของมัน ข้อมูลในนั้นไม่สามารถรู้ได้จนกว่าจะถึง 13:46:59.999 คำถามเรื่อง indexing convention ทุกข้อ — ฉันควรเลื่อนไปหนึ่งหน่วยไหม ฉันควรใช้ timestamp ของ bar-close หรือ bar-open เป็นเวลาเหตุการณ์ของฉัน — แท้จริงแล้วคือคำถามเรื่อง lookahead แบบเดียวกันที่สวมหน้ากากไว้เท่านั้น

[1] "84120.50": ราคาเปิดที่คุณเทรดไม่ได้

ราคาเปิดคือราคาของการซื้อขายครั้งแรกที่เกิดขึ้นภายในช่วงเวลานั้น มันคือธุรกรรมที่เสร็จสมบูรณ์ระหว่างคนอื่นอีกสองคน กว่าที่แท่งนี้จะกลายเป็นแถวหนึ่งใน dataframe ของคุณ ราคานั้นก็มีอายุหกสิบวินาทีไปแล้ว

แท่งก่อนหน้าปิดที่ 84109.80 ดังนั้นจึงมีการเคลื่อนไหวของราคา $10.70 อยู่ในช่องว่างระหว่างแท่ง 1 นาทีสองแท่งที่อยู่ติดกัน นั่นคือ 1.3 basis points มองไม่เห็นบนกราฟ และคิดเป็นประมาณหนึ่งในสี่ของค่าธรรมเนียม taker ก็โอเค แต่ลองไปดูชุดข้อมูลเดียวกันบน alt perp ช่วงที่ตัวเลข US CPI ประกาศออกมา ช่องว่างระหว่างแท่งเหล่านั้นวิ่งอยู่ที่ 15 ถึง 40 bps กลยุทธ์แบ็คเทสต์ที่ส่งสัญญาณตอนแท่งปิดแล้วฟิลที่ราคาเปิดของแท่งถัดไป กำลังสมมติอย่างเงียบๆ ว่าช่องว่างนี้เป็นศูนย์ และมันเป็นศูนย์จริงๆ ก็ตอนที่มันไม่สำคัญเท่านั้นแหละ

[2] และ [3]: "84177.90" ราคาสูงสุด, "84098.10" ราคาต่ำสุด

สองค่านี้คือจุดที่ fill engine ส่วนใหญ่ไปตายกัน ดังนั้นส่วนนี้จะยาวหน่อย

ราคาสูงสุดและต่ำสุดคือราคาสุดขั้วที่ถูกแตะถึง มันไม่มีขนาดและไม่มีระยะเวลาติดมาด้วย จาก raw trade tape ของนาทีเดียวกันนี้ ทุกอย่างที่ราคาเท่ากับหรือต่ำกว่า 84100.00 มีปริมาณรวม 0.62 BTC จากเก้าครั้งภายในกรอบเวลา 1.4 วินาที ดังนั้น stop ในแบ็คเทสต์ที่ 84100 "ฟิล" — และถ้าโพซิชันของคุณคือ 3 BTC คุณก็กินออร์เดอร์บุ๊กที่มองเห็นได้ทั้งหมดระหว่างทางลง แล้วปริมาณที่เหลือก็ถูกฟิลไปที่ไหนสักแห่งในช่วง 84105–84130 ขาขึ้นกลับ แท่งเทียนบอกว่าราคาต่ำสุดคือ 84098.10 แต่แท่งเทียนไม่ได้บอกว่ามีมูลค่าเพียง $52,000 เท่านั้นที่เทรดกันที่ราคานั้น

1204การซื้อขายในนาทีนี้
0.032 BTCขนาดเฉลี่ยต่อการซื้อขาย (~$2.7k)
0.62 BTCปริมาณรวมที่เทรดที่ราคาเท่ากับหรือต่ำกว่าราคาต่ำสุด
57%ของปริมาณเกิดจากฝั่งผู้ซื้อเป็นผู้เริ่ม

ทิศทางตรงข้ามยิ่งแย่กว่า เพราะมันเอาใจคุณ สมมติว่าคุณมีออร์เดอร์ limit sell ที่รออยู่ที่ 84175 ราคาสูงสุดของแท่งคือ 84177.90 ดังนั้น engine ที่ไม่ระวังก็จะฟิลให้คุณที่ 84175 แล้วบันทึกเป็น maker rebate แทนที่จะเป็นต้นทุน taker การฟิลนั้นเกิดขึ้นจริงหรือไม่ขึ้นอยู่กับตำแหน่งในคิวที่ระดับราคานั้น ซึ่งแท่งเทียนไม่มีทางรู้ได้ และคุณก็คงไม่เคยบันทึกไว้ด้วย การถูกแตะไม่ใช่การถูกฟิล

กฎที่เราตัดสินใจใช้ใน fill engine ของเราคือ: ออร์เดอร์ limit ที่รออยู่จะฟิลได้ก็ต่อเมื่อแท่งเทียนเทรดทะลุผ่านระดับราคานั้นไปจริงๆ ไม่ใช่แค่แตะถึงเท่านั้น การฟิลที่ราคาสุดขั้วพอดีเป๊ะต้องมีหลักฐาน volume-at-price จาก trade tape มายืนยัน ไม่งั้นจะถูกปฏิเสธ กฎนี้ตัดการเทรดออกไปประมาณ 6% จากพอร์ต mean-reversion ทั่วไป และทำให้ Sharpe ที่แบ็คเทสต์ได้ของผู้สมัครตัวหนึ่งลดลงจาก 1.9 เหลือ 1.1 ผู้สมัครตัวนั้นไม่เคยมีอยู่จริงตั้งแต่แรก กฎการฟิลเป็นเพียงสิ่งแรกที่ซื่อสัตย์พอจะบอกเราแบบนั้น

กับดักที่เกี่ยวข้อง: เส้นทางภายในแท่ง (intrabar path) ถ้าช่วงราคาของแท่งครอบคลุมทั้ง stop และ take-profit ของคุณ OHLCV ไม่สามารถบอกได้ว่าอันไหนเกิดก่อน ทุก engine ต้องเลือกข้อตกลงบางอย่าง ของเราสมมติว่า stop เกิดก่อนเสมอ ซึ่งเป็นแนวคิดแบบ pessimistic และบางครั้งก็ผิด แต่ไม่เคยสร้างชัยชนะปลอมขึ้นมา ถ้า engine ของคุณสมมติว่า take-profit เกิดก่อน แท่งที่มีช่วงราคากว้างจะสร้างกำไรขึ้นมาจากความคลุมเครือ และแท่งที่มีช่วงราคากว้างก็คือแท่งที่ครอบงำการกระจายตัวของ PnL ของคุณพอดี

[4] "84163.40": ตัวเลขที่เปราะบางที่สุดในแท่ง

ราคาปิดคือการซื้อขายครั้งสุดท้ายในช่วงเวลานั้น แค่นั้นเอง มันอาจเป็น odd-lot ขนาด 0.002 BTC จากบอทที่กำลังปิดโพซิชันให้ลงตัวที่เวลา 13:46:59.8 ก็ได้ ราคาแค่จุดเดียวที่เกิดขึ้นแบบสุ่มโดยโครงสร้างนี้แหละ คือสิ่งที่ research pipeline ส่วนใหญ่ใช้คำนวณทุกสัญญาณ มาร์คทุกโพซิชัน และประเมินทุกการออกจากตลาด

บน BTC perp แทบไม่มีผลอะไร แต่บน altcoin perp ที่สภาพคล่องบางเบาในเวลา 04:00 UTC มันมีผลมหาศาล และส่วนต่างระหว่างราคาปิดของสองเอ็กซ์เชนจ์ในนาทีเดียวกันอาจมากกว่า edge ต่อการเทรดทั้งหมดของคุณเสียอีก เมื่อ PnL ของกลยุทธ์ขึ้นอยู่กับราคาปิดโดยเฉพาะ เราจะรันใหม่โดยมาร์คที่ mark price ของเอ็กซ์เชนจ์แทน ซึ่งได้มาจาก index และยากกว่ามากที่จะจิ้มให้เบี้ยว ถ้าผลลัพธ์แตกต่างกัน แสดงว่ากลยุทธ์นั้นกำลังเทรด artifact อยู่

[5] และ [7]: "38.417" และ "3232108.94" ปริมาณในหน่วยอะไรกันแน่

ปริมาณฐานคือ BTC ส่วนปริมาณอ้างอิงคือ USDT ทั้งสองแบบมีให้ในที่นี้ ซึ่งเป็นความใจดีที่ไม่ใช่ทุกเอ็กซ์เชนจ์จะให้มา เหตุผลที่ควรใส่ใจคือเรื่องการรวมข้อมูลข้ามเอ็กซ์เชนจ์ สัญญาแบบ coin-margined ถูกอ้างอิงเป็นสัญญาขนาด $100 มูลค่า ฟีดหุ้นบางตัวรายงานเป็น round lot เอ็กซ์เชนจ์ prediction market รายงานเป็นจำนวนหุ้น ซึ่งหนึ่งหุ้นคือสัญญาแบบไบนารีที่กำหนดมูลค่าเป็นดอลลาร์ การรวม "ปริมาณ" ข้ามจักรวาลข้อมูลที่ผสมกันโดยไม่แปลงให้เป็นหน่วยมูลค่าเดียวกัน จะทำให้ได้อันดับสภาพคล่องที่ไร้สาระล้วนๆ และมันจะไร้สาระแบบดูนิ่งเสถียรจนรอดพ้นการตรวจสอบไปได้

แปลงทุกอย่างให้เป็นมูลค่าอ้างอิงตั้งแต่ตอนนำเข้าข้อมูล เก็บฟิลด์ดิบไว้ด้วย แต่อย่าให้กลยุทธ์เห็นมันเด็ดขาด

[8] 1204: ฟิลด์ที่ควรกำหนดโมเดล impact ของคุณ

เมื่อเอาปริมาณฐานหารด้วยจำนวนการซื้อขาย จะได้ขนาดเฉลี่ยต่อครั้งที่ 0.032 BTC หรือประมาณ $2,700 ถ้ากลยุทธ์ที่คุณกำลังทดสอบต้องการเข้าออร์เดอร์ $250,000 ในครั้งเดียว นั่นเท่ากับขอให้มีขนาดใหญ่กว่าธุรกรรมทั่วไปในนาทีนั้นประมาณ 92 เท่า ตัวเลขนี้ต่างหาก ไม่ใช่ค่าคงที่ slippage 5-bps ทั่วไป ที่ควรเป็นตัวขับเคลื่อนเทอม impact แบบ square-root ของคุณ เราคำนวณ participation rate ต่อแท่งเป็นคอลัมน์หลักคอลัมน์หนึ่ง และปฏิเสธกลยุทธ์ที่มีขนาดการเข้าออร์เดอร์มัธยฐานเกินกว่าไม่กี่เปอร์เซ็นต์ของมูลค่าแท่ง เพราะทุกอย่างที่ตามมาหลังจากนั้นล้วนเป็นเรื่องแต่ง

จำนวนการซื้อขายยังช่วยตรวจจับนาทีแปลกๆ ได้ง่ายและถูก ปริมาณปกติ แต่จำนวนการซื้อขายลดฮวบเหลือ 11? มีคนทำ block trade ปริมาณปกติ แต่จำนวนการซื้อขายพุ่งไป 9,000? นั่นคือ liquidation cascade ที่กำลังถูกกัดกินทีละชิ้นเล็กๆ

[9] และ [10]: "21.883" ฟิลด์ที่ทุกคนทิ้งไป

ปริมาณฐานที่ taker ซื้อ ใน 38.417 BTC ของแท่งนี้ 21.883 BTC เกิดจากฝั่งผู้ซื้อเป็นผู้เริ่ม ดังนั้น signed volume delta คือ +5.349 BTC และสัดส่วนของผู้เป็นฝ่ายรุกคือ 57/43 เอียงไปทางฝั่งผู้ซื้อ เอ็กซ์เชนจ์กำลังมอบ order flow imbalance ให้คุณฟรีๆ ในฟิลด์ที่คนส่วนใหญ่ไม่เคยอ่านเลย เพราะ pandas ไม่ได้ตั้งชื่อคอลัมน์ให้พวกเขา

ผมไม่ได้อ้างว่ามันทำนายผลตอบแทนได้ด้วยตัวเอง กลยุทธ์ delta แบบไร้เดียงสาเป็นหนึ่งในวิธีที่เชื่อถือได้มากที่สุดในการบริจาคเงินให้ค่าธรรมเนียม แต่มันคือการวัดที่แตกต่างจากราคาอย่างแท้จริง มันมีให้ใช้ในคำขอเดียวกันกับที่คุณส่งไปอยู่แล้ว และมันช่วยให้คุณแยกแยะได้ว่าการปรับตัวขึ้นครั้งนั้นเกิดจากการถูกซื้อ หรือเกิดขึ้นเพราะฝั่งผู้ขายถอยออกไป สองสิ่งนี้ดูเหมือนกันเป๊ะใน OHLC แต่พฤติกรรมต่างกันในอีกสิบนาทีถัดมา research agent ของเราถือว่าสมมติฐานใดก็ตามที่เพิกเฉยต่อสัดส่วน taker บนเอ็กซ์เชนจ์ที่เผยแพร่ข้อมูลนี้ เท่ากับทิ้งหลักฐานไว้บนโต๊ะโดยเปล่าประโยชน์

[11] "0": ignore — และทุกสิ่งที่ไม่ได้อยู่ตรงนี้

index 11 เป็นฟิลด์ที่เลิกใช้แล้ว มีค่าเป็นศูนย์ตลอด ที่น่าสนใจกว่าคือรายการสิ่งที่แท่งนี้ไม่มี: ไม่มี bid ไม่มี ask ไม่มี spread ไม่มีความลึกของออร์เดอร์บุ๊ก ไม่มี funding rate ไม่มี open interest ไม่มี liquidation ไม่มี mark price ไม่มี index price และที่สำคัญที่สุด ไม่มีทางรู้ได้เลยว่าออร์เดอร์ของคุณจะเป็น maker หรือ taker ซึ่งเป็นความแตกต่างระหว่างการจ่าย 0.045% กับการได้รับ 0.01% บนเอ็กซ์เชนจ์นี้

ดังนั้นโมเดลค่าธรรมเนียมใดๆ ที่สร้างจาก klines เพียงอย่างเดียว ก็คือข้อสมมติที่สวมเสื้อผ้าของตัวเลขไว้เท่านั้น เราแก้ปัญหานี้โดยบังคับให้ทุกกลยุทธ์ประกาศรูปแบบการ execution ของตัวเองไว้ล่วงหน้า แล้วคิดค่าธรรมเนียมแบบ taker กับสิ่งใดก็ตามที่พิสูจน์ไม่ได้ว่าเป็นอย่างอื่น

แท่งเทียนที่ไม่เคยปรากฏตัว

ชิ้นสุดท้าย และเป็นชิ้นที่กัดแรงที่สุดนอกเหนือจากคู่เทรดหลัก นาทีที่ไม่มีการซื้อขายเลยจะไม่มี kline เกิดขึ้นเลย ผู้ให้บริการและไลบรารีมักจะทำ forward-fill ให้: เปิด = สูงสุด = ต่ำสุด = ปิด = ราคาปิดก่อนหน้า ปริมาณเป็น 0 อินดิเคเตอร์ของคุณก็คำนวณไปอย่างสบายใจ กลยุทธ์ของคุณเห็นแถวที่ดูถูกต้องและสามารถสร้างสัญญาณในนาทีที่ไม่มีใครในโลกนี้เทรดสินทรัพย์ตัวนั้นเลยได้

บน mid-cap perp ตัวหนึ่งที่เรานำเข้าข้อมูล 4.1% ของแท่ง 1 นาทีในช่วงสิบสองเดือนไม่มีการซื้อขายเลย ผู้สมัครกลยุทธ์ mean-reversion บนสัญลักษณ์นั้นวางการเข้าออร์เดอร์ถึง 38% บนแท่งสังเคราะห์ เพราะราคาสังเคราะห์ที่แบนราบคือของโปรดของอะไรก็ตามที่วัดค่าเบี่ยงเบนจากค่าเฉลี่ยเคลื่อนที่ มันแบ็คเทสต์ออกมาสวยงามมาก แต่มันกำลังเทรดช่องว่างในข้อมูลอยู่ต่างหาก

นี่จึงเป็นเหตุผลที่ชั้นการนำเข้าข้อมูลตอนนี้มีค่าบูลีน synthetic ติดอยู่กับทุกแท่ง ส่งต่อไปตลอดทุกการ resample และกระบวนการตรวจสอบจะทำให้กลยุทธ์ใดก็ตามที่มีการเทรดกระจุกตัวอยู่บนแท่งนั้นไม่ผ่าน คอลัมน์ราคาถูกๆ คอลัมน์เดียว แต่มันคัดกลยุทธ์ที่ไม่รอดออกไปมากกว่าอินดิเคเตอร์ใดๆ ที่เราเคยเขียนมาทั้งหมด

สิบสองค่า สี่ค่าในนั้นถูกตีความผิดเป็นประจำ สองค่าถูกทิ้งไปเป็นประจำ และทั้งหมวดหมู่หนึ่งไม่มีอยู่ในแถวเลยแต่ถูก engine จินตนาการขึ้นมาเอง ก่อนแบ็คเทสต์ครั้งถัดไปของคุณ ลองไปดึงแท่งดิบสักแท่งหนึ่งจากคลังข้อมูลของคุณเอง แล้วอ่านทุกฟิลด์ออกเสียงเทียบกับสิ่งที่ logic การฟิลของคุณสมมติไว้เกี่ยวกับมัน มันเป็นแบบฝึกหัดยี่สิบนาที และผมไม่เคยเห็นใครทำแล้วไม่เจออะไรเลย

ohlcvโครงสร้างจุลภาคของตลาดวิศวกรรมข้อมูลการแบ็คเทสต์ฟิวเจอร์สคริปโต
แชร์XLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← บทความทั้งหมด