คุณเคยอยากได้ข้อมูลราคา Bitcoin หรือเหรียญอื่น ๆ ย้อนหลังหลายเดือนเพื่อนำมาวิเคราะห์ไหม? บทความนี้จะสอนคุณใช้งาน Binance API เพื่อดึงข้อมูล Candlestick หรือที่เรียกกันว่า "กราฟเทียน" ได้อย่างง่ายดาย ไม่ต้องมีพื้นฐานการเขียนโค้ดมาก่อนก็ทำตามได้

Binance Historical Candle Data API คืออะไร?

API ย่อมาจาก Application Programming Interface ซึ่งเป็นช่องทางให้คอมพิวเตอร์ของเราสามารถ "พูดคุย" กับระบบของ Binance ได้ สมมติว่าคุณอยากรู้ว่าราคา Bitcoin เป็นเท่าไหร่เมื่อ 30 วันก่อน คุณก็ส่งคำขอไปที่ Binance แล้วเขาก็จะส่งข้อมูลกลับมาให้เรานั่นเอง

ข้อดีของการใช้ API คือ:

เตรียมตัวก่อนเริ่มต้น

สิ่งที่คุณต้องมี:

หากยังไม่มี Python สามารถดาวน์โหลดได้ฟรีจาก python.org เลือกดาวน์โหลดเวอร์ชันล่าสุดแล้วติดตั้งตามขั้นตอนที่หน้าจอแนะนำ

หลังจากติดตั้งเสร็จ ให้เปิด Command Prompt (Windows) หรือ Terminal (Mac/Linux) แล้วพิมพ์คำสั่งติดตั้งไลบรารีที่จำเป็น:

pip install requests pandas

ดึงข้อมูล Candle จาก Binance อย่างง่าย

เริ่มต้นด้วยโค้ดพื้นฐานที่สุด เปิดโปรแกรม Text Editor แล้วพิมพ์โค้ดด้านล่างนี้:

import requests
import pandas as pd

กำหนดคู่เทรดที่ต้องการ (BTCUSDT = Bitcoin ต่อ USDT)

symbol = "BTCUSDT"

กำหนด Timeframe (1h = 1 ชั่วโมง, 1d = 1 วัน)

interval = "1h"

จำนวนข้อมูลที่ต้องการ (max 1000 ต่อครั้ง)

limit = 100

URL ของ Binance API

url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&limit={limit}"

ส่งคำขอไปยัง Binance

response = requests.get(url)

แปลงข้อมูลเป็น JSON

data = response.json()

แสดงผล 5 รายการแรก

print("ข้อมูล 5 รายการแรก:") for candle in data[:5]: print(f"เวลา: {candle[0]}") print(f" เปิด: {candle[1]}") print(f" สูง: {candle[2]}") print(f" ต่ำ: {candle[3]}") print(f" ปิด: {candle[4]}") print()

เมื่อรันโค้ดนี้ คุณจะเห็นข้อมูลราคา Bitcoin ย้อนหลัง 100 ชั่วโมงล่าสุด แสดงราคาเปิด สูงสุด ต่ำสุด และราคาปิดของแต่ละชั่วโมง

บันทึกข้อมูลเป็นไฟล์ Excel

ต่อไปเราจะปรับปรุงโค้ดให้สามารถบันทึกข้อมูลเป็นไฟล์ CSV หรือ Excel เพื่อนำไปใช้วิเคราะห์ได้สะดวกขึ้น:

import requests
import pandas as pd
from datetime import datetime

ตั้งค่าพารามิเตอร์

symbol = "ETHUSDT" # Ethereum interval = "1d" # ข้อมูลรายวัน limit = 500 # ดึงข้อมูล 500 วันย้อนหลัง

เรียก API

url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&limit={limit}" response = requests.get(url) data = response.json()

สร้าง DataFrame จากข้อมูล

df = pd.DataFrame(data, columns=[ 'เวลาเปิด', 'เปิด', 'สูง', 'ต่ำ', 'ปิด', 'Volume', 'เวลาปิด', 'Quote Asset Volume', 'Number of Trades', 'Taker Buy Base', 'Taker Buy Quote', 'Ignore' ])

แปลงเวลา Unix Timestamp เป็นวันที่ปกติ

df['เวลาเปิด'] = pd.to_datetime(df['เวลาเปิด'], unit='ms') df['เวลาปิด'] = pd.to_datetime(df['เวลาปิด'], unit='ms')

เลือกเฉพาะคอลัมน์ที่ต้องการ

df_clean = df[['เวลาเปิด', 'เปิด', 'สูง', 'ต่ำ', 'ปิด', 'Volume', 'Number of Trades']]

แปลงข้อมูลเป็นตัวเลข

for col in ['เปิด', 'สูง', 'ต่ำ', 'ปิด', 'Volume']: df_clean[col] = pd.to_numeric(df_clean[col])

บันทึกเป็นไฟล์ CSV

df_clean.to_csv('eth_price_data.csv', index=False, encoding='utf-8-sig') print(f"บันทึกสำเร็จ! ได้ข้อมูล {len(df_clean)} รายการ") print(df_clean.head(10))

หลังจากรันโค้ดนี้ คุณจะได้ไฟล์ชื่อ eth_price_data.csv ที่มีข้อมูลราคา Ethereum ย้อนหลัง 500 วัน พร้อมให้เปิดดูใน Excel ได้ทันที

Timeframe ที่ Binance รองรับ

Binance API รองรับ Timeframe หลายรูปแบบ คุณสามารถเปลี่ยนค่า interval ในโค้ดได้ตามต้องการ:

หากต้องการข้อมูลย้อนหลังมากกว่า 1000 รายการ สามารถดึงข้อมูลเป็นช่วง ๆ โดยใช้พารามิเตอร์ startTime และ endTime แทน limit

ดึงข้อมูลหลายเหรียญพร้อมกัน

หากคุณต้องการเปรียบเทียบข้อมูลหลายเหรียญพร้อมกัน สามารถใช้โค้ดด้านล่างนี้:

import requests
import pandas as pd

รายชื่อเหรียญที่ต้องการ

symbols = ["BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT"] interval = "1d" limit = 100 all_data = {} for symbol in symbols: url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&limit={limit}" response = requests.get(url) data = response.json() # ดึงเฉพาะราคาปิด close_prices = [float(candle[4]) for candle in data] timestamps = [pd.to_datetime(candle[0], unit='ms') for candle in data] all_data[symbol] = close_prices

สร้าง DataFrame รวม

df = pd.DataFrame(all_data, index=timestamps) df.index.name = 'วันที่'

บันทึกไฟล์

df.to_csv('multiple_coins.csv', encoding='utf-8-sig') print("ข้อมูลทั้งหมด:") print(df.tail())

โค้ดนี้จะดึงข้อมูลราคาปิดของ Bitcoin, Ethereum, BNB และ Solana ย้อนหลัง 100 วัน มาวางในตารางเดียวกัน สะดวกสำหรับการเปรียบเทียบผลตอบแทนของแต่ละเหรียญ

เหมาะกับใคร / ไม่เหมาะกับใคร

การใช้งาน Binance API เพื่อดึงข้อมูล Historical Candle มีจุดเด่นและข้อจำกัดที่ควรพิจารณา:

เหมาะกับ ไม่เหมาะกับ
นักวิเคราะห์ทางเทคนิคที่ต้องการข้อมูลย้อนหลังเพื่อทดสอบกลยุทธ์ ผู้ที่ต้องการทำเทรดอัตโนมัติแบบเต็มรูปแบบ (ต้องใช้ API Key ของ Binance)
นักพัฒนาที่กำลังสร้างโปรแกรมวิเคราะห์หรือ Bot เทรด ผู้ที่ไม่มีพื้นฐานการใช้งานคอมพิวเตอร์เลย
นักศึกษาที่ศึกษาเกี่ยวกับ Cryptocurrency และ Data Science ผู้ที่ต้องการข้อมูล Real-time (ต้องใช้ WebSocket API แทน)
ผู้ที่ต้องการ Export ข้อมูลไปใช้ใน Excel, Python หรือเครื่องมืออื่น ผู้ที่ต้องการดึงข้อมูลที่ละเกิน 1000 รายการต่อครั้ง (ต้องทำ Loop เอง)

ราคาและ ROI

Binance Historical API นั้นฟรีสำหรับการใช้งานทั่วไป (Rate Limit: 1200 requests/minute) แต่หากคุณต้องการนำข้อมูลไปประมวลผลด้วย AI เพื่อวิเคราะห์แนวโน้มหรือสร้างสัญญาณเทรด คุณอาจต้องใช้บริการ AI API เพิ่มเติม

ตารางเปรียบเทียบราคา AI API ยอดนิยม 2026:

โมเดล ราคา/ล้าน Token เหมาะกับงาน
DeepSeek V3.2 $0.42 วิเคราะห์ข้อมูลทั่วไป ประหยัดมาก
Gemini 2.5 Flash $2.50 งานที่ต้องการความเร็วสูง
GPT-4.1 $8.00 งานวิเคราะห์เชิงลึก
Claude Sonnet 4.5 $15.00 งานเขียนโค้ดและการวิเคราะห์ขั้นสูง

ทำไมต้องเลือก HolySheep

หากคุณวางแผนจะใช้ AI ในการวิเคราะห์ข้อมูลที่ดึงมาจาก Binance สมัครที่นี่ HolySheep AI เพราะมีข้อได้เปรียบด้านราคาที่เหนือกว่า:

ข้อมูลที่ได้จาก Binance Candle API

แต่ละแท่งเทียน (Candle) ที่ได้จาก API จะประกอบด้วยข้อมูลสำคัญดังนี้:

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. ข้อผิดพลาด: ConnectionError หรือ Timeout Error

# วิธีแก้ไข: เพิ่ม Try-Except และ Retry Logic
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def fetch_with_retry(url, max_retries=3):
    session = requests.Session()
    retries = Retry(total=max_retries, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))
    
    try:
        response = session.get(url, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"เกิดข้อผิดพลาด: {e}")
        return None

ใช้งาน

data = fetch_with_retry(url) if data: print("ดึงข้อมูลสำเร็จ!")

2. ข้อผิดพลาด: Rate Limit (429 Too Many Requests)

# วิธีแก้ไข: เพิ่ม Delay ระหว่าง Request
import time

def fetch_multiple_data(urls, delay=0.5):
    all_data = []
    for i, url in enumerate(urls):
        response = requests.get(url)
        if response.status_code == 200:
            all_data.append(response.json())
        elif response.status_code == 429:
            print(f"รอเนื่องจากถูก Rate Limit... (รอ {delay} วินาที)")
            time.sleep(delay)
            response = requests.get(url)
            all_data.append(response.json())
        else:
            print(f"ข้อผิดพลาด: Status {response.status_code}")
        
        # รอก่อนดึงข้อมูลถัดไป
        if i < len(urls) - 1:
            time.sleep(delay)
    
    return all_data

ดึงข้อมูล 3 เหรียญพร้อม Delay

urls = [ "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=100", "https://api.binance.com/api/v3/klines?symbol=ETHUSDT&interval=1d&limit=100", "https://api.binance.com/api/v3/klines?symbol=SOLUSDT&interval=1d&limit=100" ] data = fetch_multiple_data(urls)

3. ข้อผิดพลาด: Invalid JSON Response

# วิธีแก้ไข: ตรวจสอบ Response ก่อน Parse
response = requests.get(url)
print(f"Status Code: {response.status_code}")
print(f"Content: {response.text[:200]}")  # ดู 200 ตัวอักษรแรก

if response.status_code == 200:
    try:
        data = response.json()
        print(f"ได้ข้อมูล {len(data)} รายการ")
    except ValueError as e:
        print(f"JSON Parse Error: {e}")
else:
    print(f"Request ล้มเหลว: {response.text}")

4. ข้อผิดพลาด: Symbol Not Found

# วิธีแก้ไข: ตรวจสอบ Symbol ก่อนใช้งาน
def get_valid_symbol(symbol):
    # ลบช่องว่างและ uppercase
    symbol = symbol.replace(" ", "").upper()
    
    # เพิ่ม USDT ถ้ายังไม่มี
    if not symbol.endswith("USDT"):
        symbol = symbol + "USDT"
    
    return symbol

ตัวอย่า�