01ภาพรวมของกราฟนี้
Candlestick chart อัดข้อมูลสี่ค่าต่อหนึ่งคาบเวลาไว้ในสัญลักษณ์เดียว ตัวเทียนบอกช่วงระหว่างราคาเปิดกับปิด ไส้เทียนบอกช่วงสูงสุดถึงต่ำสุด และสีบอกทิศทาง ทำให้เห็นทั้งความผันผวนภายในคาบและผลลัพธ์ของคาบพร้อมกัน
เปรียบเทียบให้เห็นภาพ
เหมือนสรุปสภาพอากาศของแต่ละวันด้วยสัญลักษณ์เดียวที่บอกทั้งอุณหภูมิเช้า เย็น สูงสุด และต่ำสุด แทนที่จะต้องดูสี่กราฟ
ใช้ที่ไหนบ้าง — ราคาหุ้นหรือสินทรัพย์รายวัน อัตราแลกเปลี่ยน หรือข้อมูลใดก็ตามที่มีค่าเปิด ปิด สูงสุด ต่ำสุดในแต่ละคาบ
สร้างอย่างไร
- ขั้นที่ 1เตรียมข้อมูลสี่ค่าต่อคาบ
- ขั้นที่ 2วาดไส้เทียนจากต่ำสุดถึงสูงสุด
- ขั้นที่ 3วาดตัวเทียนระหว่างเปิดกับปิด
- ขั้นที่ 4ระบายสีตามทิศทาง
ตัวอย่างคลาสสิก · แท่งเทียนจากตลาดข้าวญี่ปุ่นในศตวรรษที่ 18
พ่อค้าข้าวชาวญี่ปุ่นชื่อ Munehisa Homma พัฒนาวิธีบันทึกราคาแบบแท่งเทียนขึ้นที่ตลาดโดจิมะ เพื่อจับทั้งช่วงแกว่งและทิศทางของแต่ละวันในสัญลักษณ์เดียว รูปแบบนี้เข้าสู่โลกตะวันตกในทศวรรษ 1990 และกลายเป็นมาตรฐานของกราฟราคาจนถึงวันนี้
02อธิบายภาษาคนเข้าใจง่าย ๆ
ราคาในหนึ่งวันไม่ใช่ตัวเลขเดียว มันมีราคาตอนเปิด ตอนปิด จุดสูงสุด และจุดต่ำสุด กราฟเส้นที่ใช้แค่ราคาปิดจึงทิ้งข้อมูลไปสามในสี่ส่วน
แท่งเทียนแก้ด้วยการอัดทั้งสี่ค่าไว้ในสัญลักษณ์เดียว ส่วนที่หนาคือช่วงระหว่างเปิดกับปิด ส่วนเส้นบาง ๆ ที่ยื่นออกมาคือจุดสูงสุดและต่ำสุดที่แตะระหว่างวัน
สีทำหน้าที่บอกทิศทาง ถ้าปิดสูงกว่าเปิดใช้สีหนึ่ง ถ้าปิดต่ำกว่าเปิดใช้อีกสี ผู้อ่านจึงกวาดตาเห็นแนวโน้มรวมได้โดยไม่ต้องอ่านตัวเลข
สิ่งที่แท่งเทียนบอกได้และกราฟเส้นบอกไม่ได้คือ "ความผันผวนภายในคาบ" ไส้ที่ยาวมากแปลว่าวันนั้นราคาแกว่งแรงแม้จะปิดใกล้เคียงกับที่เปิด ซึ่งเป็นข้อมูลสำคัญเรื่องความเสี่ยง
ข้อควรระวังคือกราฟนี้ต้องการข้อมูลครบสี่ค่าจริง ๆ ถ้ามีแค่ราคาปิดก็ไม่มีประโยชน์ที่จะใช้ และการดูแท่งเทียนเยอะเกินไปในหน้าเดียวจะทำให้รายละเอียดหายหมด
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
date | คาบเวลา | เวลา | x | 20–120 คาบ | หนึ่งแท่งต่อหนึ่งคาบ |
open | ราคาเปิด | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ค่าแรกของคาบ |
high | สูงสุด | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ต้อง >= max(open, close) |
low | ต่ำสุด | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ต้อง <= min(open, close) |
close | ราคาปิด | ตัวเลขต่อเนื่อง | y | ต่อเนื่อง | ค่าสุดท้ายของคาบ |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- ตรวจว่า high >= max(open, close) และ low <= min(open, close) ทุกแถว
- เรียงตามเวลา
- ตัดสินใจว่าจะแสดงคาบที่ไม่มีการซื้อขายอย่างไร
ค่าที่หายไป — คาบที่ไม่มีการซื้อขายควรเว้นช่องว่างหรือย่อแกนข้ามไป ต้องเลือกอย่างใดอย่างหนึ่งและระบุ
สเกลของแกน — linear สำหรับช่วงสั้น และ log สำหรับช่วงยาวที่ราคาเปลี่ยนหลายเท่า เพราะ log ทำให้เปอร์เซ็นต์การเปลี่ยนแปลงที่เท่ากันดูเท่ากัน
กราฟจะเริ่มพังเมื่อไร
เกิน 150 แท่ง แท่งจะบางจนไส้และตัวเทียนแยกไม่ออก — ลดช่วงเวลาหรือเปลี่ยนเป็น line-chart
หน้าตาไฟล์ที่ต้องเตรียม
date,open,high,low,close
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- ทิศทางของแต่ละคาบจากสี
- ความผันผวนภายในคาบจากความยาวของไส้
- ช่วงที่มีคาบบวกหรือลบติดต่อกัน
- คาบที่แกว่งแรงผิดปกติ
สิ่งที่กราฟนี้ตอบไม่ได้
- ไม่บอกลำดับของการเคลื่อนไหวภายในคาบ — ไม่รู้ว่าแตะสูงสุดก่อนหรือต่ำสุดก่อน
- ไม่บอกปริมาณการซื้อขาย ซึ่งต้องมีกราฟแยก
อ่านตามลำดับนี้
- ดูสีเพื่อรู้ทิศทางของคาบ
- ดูความยาวของไส้เพื่อประเมินความผันผวน
- ดูความหนาของตัวเทียนเพื่อรู้ขนาดของการเปลี่ยนแปลงสุทธิ
คำถามที่ตอบได้
- วันนี้ราคาขึ้นหรือลง
- วันไหนที่แกว่งแรงที่สุด
- มีช่วงที่ขึ้นติดต่อกันกี่วัน
สัญญาณว่ามีอะไรผิด
- high ต่ำกว่า open หรือ close ซึ่งแปลว่าข้อมูลผิด
- แท่งเยอะจนไส้กับตัวเทียนแยกไม่ออก
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ทำเครื่องหมายคาบที่มีเหตุการณ์สำคัญ
- วางกราฟปริมาณการซื้อขายไว้ใต้กราฟราคาด้วยแกนเวลาเดียวกัน
- เขียนช่วงเวลาที่แสดงให้ชัด
รูปแบบชื่อกราฟที่ควรใช้
ราคาปิดที่ <ค่า> โดยมีคาบบวก <จำนวน> จาก <ทั้งหมด> คาบ
06เอาไปใช้ต่อ
โค้ดทุกชิ้นอ่านไฟล์ candlestick-chart-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง
# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด candlestick-chart-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg") # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a" # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"
df = pd.read_csv("candlestick-chart-sample.csv")
df["open"] = pd.to_numeric(df["open"], errors="coerce")
df["high"] = pd.to_numeric(df["high"], errors="coerce")
df["low"] = pd.to_numeric(df["low"], errors="coerce")
df["close"] = pd.to_numeric(df["close"], errors="coerce")
NOTE = "wick" # ← ค่าจาก Playground
fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)
df["date"] = pd.to_datetime(df["date"])
d = df.sort_values("date")
for _, r in d.iterrows():
up = r["close"] >= r["open"]
color = "#008300" if up else "#e34948"
ax.plot([r["date"], r["date"]], [r["low"], r["high"]], color=color, linewidth=1.2) # ไส้เทียน
ax.plot([r["date"], r["date"]], [r["open"], r["close"]], color=color, linewidth=5) # ตัวเทียน
ax.set_ylabel("ราคา"); ax.grid(axis="y", alpha=0.25); ax.set_axisbelow(True)
fig.autofmt_xdate()
ax.spines[["top", "right"]].set_visible(False) # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("candlestick-chart.png", dpi=160)
print("เขียน candlestick-chart.png แล้ว ·", len(df), "แถว")07ลองเล่นเพื่อเข้าใจ
ดูข้อมูลเป็นตาราง (30 แถว)
| วันที่ | เปิด | สูง | ต่ำ | ปิด |
|---|---|---|---|---|
| 2025-06-02 | 48.00 | 48.49 | 45.81 | 46.66 |
| 2025-06-03 | 46.66 | 48.24 | 46.33 | 47.74 |
| 2025-06-04 | 47.74 | 48.62 | 46.85 | 47.88 |
| 2025-06-05 | 47.88 | 48.38 | 47.21 | 47.60 |
| 2025-06-06 | 47.60 | 49.10 | 46.96 | 48.36 |
| 2025-06-07 | 48.36 | 48.98 | 46.94 | 47.12 |
| 2025-06-08 | 47.12 | 48.97 | 46.32 | 47.92 |
| 2025-06-09 | 47.92 | 50.38 | 47.38 | 50.14 |
| 2025-06-10 | 50.14 | 53.11 | 49.58 | 51.94 |
| 2025-06-11 | 51.94 | 52.29 | 51.14 | 51.33 |
| 2025-06-12 | 51.33 | 51.55 | 50.06 | 50.42 |
| 2025-06-13 | 50.42 | 51.34 | 49.45 | 50.87 |
| 2025-06-14 | 50.87 | 51.77 | 48.68 | 49.55 |
| 2025-06-15 | 49.55 | 50.24 | 48.25 | 49.04 |
| 2025-06-16 | 49.04 | 49.72 | 47.84 | 48.95 |
| 2025-06-17 | 48.95 | 49.90 | 47.95 | 49.58 |
| 2025-06-18 | 49.58 | 50.76 | 48.65 | 49.07 |
| 2025-06-19 | 49.07 | 50.86 | 48.63 | 50.04 |
| 2025-06-20 | 50.04 | 51.13 | 49.02 | 51.10 |
| 2025-06-21 | 51.10 | 52.38 | 50.80 | 51.89 |
| 2025-06-22 | 51.89 | 51.99 | 50.57 | 51.20 |
| 2025-06-23 | 51.20 | 51.83 | 49.79 | 50.31 |
| 2025-06-24 | 50.31 | 51.03 | 50.02 | 50.65 |
| 2025-06-25 | 50.65 | 51.14 | 49.65 | 50.97 |
| 2025-06-26 | 50.97 | 51.04 | 49.41 | 49.69 |
| 2025-06-27 | 49.69 | 51.17 | 49.68 | 50.65 |
| 2025-06-28 | 50.65 | 51.18 | 49.52 | 49.72 |
| 2025-06-29 | 49.72 | 49.76 | 48.50 | 48.83 |
| 2025-06-30 | 48.83 | 49.74 | 47.73 | 49.68 |
| 2025-07-01 | 49.68 | 51.82 | 49.00 | 50.76 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: หาคาบที่ตัวเทียนสั้นแต่ไส้ยาวมาก นั่นคือวันที่ราคาแกว่งแรงแต่จบใกล้เดิม ซึ่งกราฟเส้นที่ใช้ราคาปิดอย่างเดียวมองไม่เห็นเลย
ข้อควรระวัง
- ใช้กราฟนี้ทั้งที่มีแค่ราคาปิด ซึ่งไม่ได้อะไรเพิ่มจากกราฟเส้น
- ไม่ตรวจว่า high และ low สอดคล้องกับ open และ close ทำให้วาดข้อมูลที่ผิดออกมา
- ใส่แท่งมากเกินไปจนไส้กับตัวเทียนแยกไม่ออก
- ใช้สีแดงเขียวโดยไม่มีสัญลักษณ์อื่นช่วย ทำให้คนตาบอดสีอ่านทิศทางไม่ได้
เมื่อไหร่ไม่ควรใช้กราฟนี้
- มีเฉพาะราคาปิด→ใช้แทน: line-chart
- ผู้อ่านไม่คุ้นกับข้อมูลราคา→ใช้แทน: line-chart พร้อมแถบแสดงช่วง
- สนใจแค่ความผันผวน→ใช้แทน: confidence-band หรือ box-plot รายคาบ