0Pricing
AI Agents · บทเรียน

การผสาน API ข้อมูลตลาด

Alpha Vantage, Yahoo Finance และ Polygon.io สำหรับข้อมูลแบบเรียลไทม์และข้อมูลย้อนหลัง

การผสาน API ข้อมูลตลาด เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

ข้อมูลตลาดในเอเจนต์การเงิน

เอเจนต์วิเคราะห์ทางการเงินจำเป็นต้องเข้าถึงข้อมูลตลาดแบบเรียลไทม์และข้อมูลย้อนหลัง ประเภทข้อมูลที่พบบ่อย ได้แก่ OHLCV (ราคาเปิด/ราคาสูงสุด/ราคาต่ำสุด/ราคาปิด/ปริมาณการซื้อขาย) วันที่ประกาศผลประกอบการ อัตราส่วนทางพื้นฐาน และชุดข้อมูลออปชัน

มี API หลายรายการที่ให้ข้อมูลเหล่านี้ เช่น yfinance (ใช้ฟรีจาก Yahoo Finance), Polygon.io (มีค่าใช้จ่ายและเชื่อถือได้) และ Alpha Vantage (มีระดับใช้ฟรี)

yfinance: ข้อมูลราคาย้อนหลัง

yfinance ทำหน้าที่ห่อหุ้ม Yahoo Finance API และเป็นวิธีที่รวดเร็วที่สุดในการเริ่มต้นใช้งาน Ticker.history() จะส่งคืน DataFrame ของ pandas ที่มีข้อมูล OHLCV

import yfinance as yf

ticker = yf.Ticker('AAPL')

# 1 year of daily data
history = ticker.history(period='1y')
print(history.tail(3))
#                  Open        High         Low       Close    Volume
# Date
# 2026-05-27  189.1500  190.3200  188.9200  190.0500  55234000
# 2026-05-28  190.4200  191.5600  189.7800  191.1200  62345000
print(f'Rows: {len(history)}')

yfinance: ช่วงวันที่ที่กำหนดเอง

ใช้พารามิเตอร์ start และ end เพื่อกำหนดช่วงวันที่เอง หรือใช้ interval สำหรับข้อมูลระหว่างวัน (1m, 5m, 1h) โปรดทราบว่าข้อมูลระหว่างวันจำกัดอยู่ที่ 60 วันล่าสุด ทั้งนี้ขึ้นอยู่กับช่วงเวลา

import yfinance as yf

ticker = yf.Ticker('MSFT')

# Custom date range
history = ticker.history(start='2024-01-01', end='2024-12-31')
print(f'Trading days in 2024: {len(history)}')

# Batch multiple tickers
tickers = yf.download(['AAPL', 'MSFT', 'GOOGL'],
                       start='2025-01-01', end='2025-12-31')
print(tickers['Close'].head())

REST API ของ Polygon.io

Polygon.io ให้บริการข้อมูลตลาดระดับมืออาชีพ โดยมีขีดจำกัดอัตราการเรียกใช้สูงกว่าและมีเวลาพร้อมใช้งานที่เชื่อถือได้มากกว่าแหล่งข้อมูลฟรี ควรใช้บริการนี้กับเอเจนต์การเงินในระบบจริง

import requests

POLYGON_KEY = 'YOUR_POLYGON_API_KEY'

def get_polygon_daily(ticker: str, from_date: str, to_date: str) -> list[dict]:
    url = f'https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{from_date}/{to_date}'
    resp = requests.get(url, params={'apiKey': POLYGON_KEY, 'limit': 365})
    resp.raise_for_status()
    data = resp.json()
    return data.get('results', [])

bars = get_polygon_daily('AAPL', '2025-01-01', '2025-12-31')
print(f'Bars returned: {len(bars)}')
if bars:
    print('Latest close:', bars[-1]['c'])

TIME_SERIES_DAILY ของ Alpha Vantage

Alpha Vantage มีระดับใช้ฟรี (เรียกใช้ได้ 25 ครั้งต่อวัน) และระดับแบบชำระเงิน จุดเชื่อมต่อ TIME_SERIES_DAILY จะส่งคืนข้อมูล OHLCV พร้อมตัวเลือกราคาที่ปรับปรุงแล้ว

import requests

ALPHA_KEY = 'YOUR_ALPHA_VANTAGE_KEY'

def get_alpha_vantage_daily(symbol: str, outputsize: str = 'compact') -> dict:
    # outputsize: 'compact' (100 days) or 'full' (20+ years)
    resp = requests.get('https://www.alphavantage.co/query', params={
        'function':   'TIME_SERIES_DAILY_ADJUSTED',
        'symbol':     symbol,
        'outputsize': outputsize,
        'apikey':     ALPHA_KEY
    })
    resp.raise_for_status()
    data = resp.json()
    series = data.get('Time Series (Daily)', {})
    return series   # dict: {date_str: {open, high, low, close, volume, ...}}

ขีดจำกัดอัตราการเรียกใช้และตรรกะการลองใหม่

API ข้อมูลตลาดทุกรายการมีขีดจำกัดอัตราการเรียกใช้ หากเรียกเกินขีดจำกัด คุณจะได้รับข้อผิดพลาด 429 (คำขอมากเกินไป) ควรใช้การหน่วงเวลาแบบทวีคูณและปฏิบัติตามขีดจำกัดอยู่เสมอ

import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def make_rate_limited_session(calls_per_minute: int = 5) -> requests.Session:
    session = requests.Session()
    retry = Retry(
        total=3,
        backoff_factor=2,         # 1s, 2s, 4s waits
        status_forcelist=[429, 500, 502, 503, 504]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('https://', adapter)
    session._calls_per_min = calls_per_minute
    session._min_interval  = 60.0 / calls_per_minute
    session._last_call     = 0.0
    return session

def rate_limited_get(session, url, **kwargs):
    elapsed = time.time() - session._last_call
    if elapsed < session._min_interval:
        time.sleep(session._min_interval - elapsed)
    session._last_call = time.time()
    return session.get(url, **kwargs)

การแคชข้อมูลตลาด

ข้อมูลย้อนหลังไม่เปลี่ยนแปลง เพราะราคาปิดของเมื่อวานจะไม่เปลี่ยนแปลงอีก ให้แคชข้อมูลดังกล่าวเพื่อหลีกเลี่ยงการเรียก API ซ้ำซ้อน ใช้แคชบนดิสก์แบบง่ายโดยใช้ (Ticker, date_range) เป็นคีย์

import hashlib, json, os

CACHE_DIR = '/tmp/market_cache'
os.makedirs(CACHE_DIR, exist_ok=True)

def cache_key(ticker: str, start: str, end: str) -> str:
    return hashlib.md5(f'{ticker}_{start}_{end}'.encode()).hexdigest()

def get_cached(ticker: str, start: str, end: str):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    if os.path.exists(path):
        with open(path) as f:
            return json.load(f)
    return None

def set_cached(ticker: str, start: str, end: str, data):
    key = cache_key(ticker, start, end)
    path = os.path.join(CACHE_DIR, f'{key}.json')
    with open(path, 'w') as f:
        json.dump(data, f)

if __name__ == '__main__':
    set_cached('AAPL', '2024-01-01', '2024-01-31', {'close': [150, 151, 149]})
    cached = get_cached('AAPL', '2024-01-01', '2024-01-31')
    print('Cached data for AAPL:', cached)
    print('Cache miss for MSFT:', get_cached('MSFT', '2024-01-01', '2024-01-31'))

การจัดการชั่วโมงทำการซื้อขายและช่องว่างของตลาด

ตลาดปิดทำการในวันสุดสัปดาห์และวันหยุด ช่วงวันที่ครอบคลุมวันที่ไม่มีการซื้อขายจะมีช่องว่างในข้อมูล ควรตรวจจับและจัดการช่องว่างเหล่านี้เสมอ แทนที่จะสมมติว่าข้อมูลรายวันมีต่อเนื่อง

import pandas as pd
from pandas.tseries.offsets import BDay

def detect_gaps(history: pd.DataFrame) -> list[str]:
    if history.empty:
        return []
    date_range = pd.date_range(
        start=history.index.min(),
        end=history.index.max(),
        freq=BDay()  # Business days only
    )
    missing = date_range.difference(history.index)
    return [str(d.date()) for d in missing]

import yfinance as yf
history = yf.Ticker('AAPL').history(start='2024-12-23', end='2025-01-07')
gaps = detect_gaps(history)
print('Missing business days (holidays):', gaps)

การสร้างเครื่องมือข้อมูลตลาดสำหรับเอเจนต์

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

import yfinance as yf, json

def get_market_data_tool(ticker: str, period: str = '1y') -> str:
    cached = get_cached(ticker, period, 'yfinance')
    if cached:
        return json.dumps(cached)
    try:
        hist = yf.Ticker(ticker).history(period=period)
        if hist.empty:
            return json.dumps({'error': f'No data for {ticker}'})
        result = {
            'ticker':     ticker,
            'period':     period,
            'start':      str(hist.index.min().date()),
            'end':        str(hist.index.max().date()),
            'latest_close': float(hist['Close'].iloc[-1]),
            'pct_change_ytd': float((hist['Close'].iloc[-1] / hist['Close'].iloc[0] - 1) * 100),
            'rows':       len(hist)
        }
        set_cached(ticker, period, 'yfinance', result)
        return json.dumps(result)
    except Exception as e:
        return json.dumps({'error': str(e)})

ข้อมูลพื้นฐานจาก yfinance

นอกเหนือจากข้อมูลราคาแล้ว yfinance ยังให้ข้อมูลพื้นฐาน เช่น อัตราส่วน P/E กำไรต่อหุ้น มูลค่าหลักทรัพย์ตามราคาตลาด และข้อมูลอื่น ๆ ข้อมูลพื้นฐานช่วยให้การวิเคราะห์ของเอเจนต์มีมิติมากกว่าการพิจารณาความเคลื่อนไหวของราคาเพียงอย่างเดียว

import yfinance as yf

ticker = yf.Ticker('AAPL')
info  = ticker.info

print('Market Cap:      ', info.get('marketCap'))
print('P/E Ratio:       ', info.get('trailingPE'))
print('EPS:             ', info.get('trailingEps'))
print('52-Week High:    ', info.get('fiftyTwoWeekHigh'))
print('52-Week Low:     ', info.get('fiftyTwoWeekLow'))
print('Dividend Yield:  ', info.get('dividendYield'))
print('Analyst Target:  ', info.get('targetMeanPrice'))

การจัดการข้อผิดพลาด: Ticker ที่ถูกถอดออกจากตลาดและไม่ถูกต้อง

สัญลักษณ์หลักทรัพย์บางรายการอาจไม่ถูกต้องหรือไม่มีการซื้อขายอยู่ในปัจจุบัน บริษัทที่ถูกถอดออกจากตลาดจะส่งคืนประวัติที่ว่างเปล่า ควรตรวจสอบคำตอบที่ได้รับก่อนดำเนินการวิเคราะห์ต่อเสมอ

import yfinance as yf

def safe_fetch(ticker_symbol: str, period: str = '1y') -> dict:
    try:
        ticker = yf.Ticker(ticker_symbol)
        history = ticker.history(period=period)

        if history.empty:
            return {
                'error': f'No data for {ticker_symbol}. May be delisted or invalid.',
                'ticker': ticker_symbol
            }
        return {
            'ticker':       ticker_symbol,
            'latest_close': float(history['Close'].iloc[-1]),
            'data_start':   str(history.index.min().date()),
            'bars':         len(history)
        }
    except Exception as e:
        return {'error': str(e), 'ticker': ticker_symbol}

print(safe_fetch('AAPL'))    # valid
print(safe_fetch('INVALID')) # returns error dict

พารามิเตอร์ outputsize ค่า compact ในจุดเชื่อมต่อ TIME_SERIES_DAILY ของ Alpha Vantage ส่งคืนอะไร

การทำความเข้าใจพารามิเตอร์ขนาดผลลัพธ์ของ API มีความสำคัญต่อการจัดการแบนด์วิดท์ เวลาแฝง และโควตา API ในเอเจนต์การเงิน

สรุปการผสานรวม API ข้อมูลตลาด

ใช้ yfinance สำหรับการสร้างต้นแบบอย่างรวดเร็ว (ใช้ฟรี), Polygon.io สำหรับระบบจริง (เชื่อถือได้และมีค่าใช้จ่าย) และ Alpha Vantage เป็นตัวเลือกที่มีระดับใช้ฟรี ควรใช้ การจำกัดอัตราการเรียกใช้, การแคชบนดิสก์สำหรับข้อมูลย้อนหลัง และ การตรวจจับช่องว่างสำหรับวันที่ไม่มีการซื้อขายอยู่เสมอ

เปิดให้เรียกใช้การดึงข้อมูลเป็นเครื่องมือของเอเจนต์ เพื่อให้ LLM ขอข้อมูลได้เมื่อจำเป็น

คำถามที่พบบ่อย

บทเรียน “การผสาน API ข้อมูลตลาด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การผสาน API ข้อมูลตลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การผสาน API ข้อมูลตลาด”

Alpha Vantage, Yahoo Finance และ Polygon.io สำหรับข้อมูลแบบเรียลไทม์และข้อมูลย้อนหลัง คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การผสาน API ข้อมูลตลาด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การผสาน API ข้อมูลตลาด
  2. เครื่องมือเอเจนต์สำหรับวิเคราะห์พอร์ตการลงทุน
  3. กรอบป้องกันความเสี่ยงและการปฏิบัติตามข้อกำหนด
  4. การทดสอบย้อนหลังการตัดสินใจของเอเจนต์
← กลับไปที่ AI Agents