0Pricing
AI Agents · 강의

시장 데이터 API 통합

실시간 및 과거 데이터를 위해 Alpha Vantage, Yahoo Finance, Polygon.io를 활용합니다.

시장 데이터 API 통합은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

금융 에이전트의 시장 데이터

금융 분석 에이전트는 실시간 및 과거 시장 데이터에 접근해야 합니다. 일반적인 데이터 유형으로는 OHLCV(시가/고가/저가/종가/거래량), 실적 발표일, 기본 재무 비율, 옵션 체인 등이 있습니다.

여러 API가 이러한 데이터를 제공합니다. yfinance(무료, Yahoo Finance), Polygon.io(유료, 안정적), Alpha Vantage(무료 요금제 제공) 등이 있습니다.

yfinance: 과거 가격 데이터

yfinance는 Yahoo Finance API를 감싸며, 시작하기에 가장 빠른 방법입니다. Ticker.history()는 OHLCV 데이터의 pandas DataFrame을 반환합니다.

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())

Polygon.io REST API

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'])

Alpha Vantage TIME_SERIES_DAILY

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 호출을 피하려면 데이터를 캐시하시기 바랍니다. (티커, 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'))

오류 처리: 상장 폐지 및 유효하지 않은 티커

모든 티커 기호가 유효하거나 현재 거래되고 있는 것은 아닙니다. 상장 폐지된 회사는 빈 history를 반환합니다. 분석을 진행하기 전에 항상 응답을 검증하시기 바랍니다.

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

Alpha Vantage TIME_SERIES_DAILY 엔드포인트의 ‘compact’ 출력 크기는 무엇을 반환합니까?

API 출력 크기 매개변수를 이해하는 것은 금융 에이전트의 대역폭, 지연 시간, API 할당량을 관리하는 데 중요합니다.

시장 데이터 API 통합 요약

빠른 프로토타이핑에는 yfinance(무료), 운영 환경에는 Polygon.io(안정적이고 유료), 무료 요금제 옵션에는 Alpha Vantage를 사용합니다. 항상 요청 빈도 제한, 과거 데이터를 위한 디스크 캐싱, 거래일이 아닌 날을 위한 누락 구간 감지를 구현하시기 바랍니다.

데이터 가져오기를 에이전트 도구로 공개하여 LLM이 필요할 때 데이터를 요청할 수 있도록 합니다.

자주 묻는 질문

“시장 데이터 API 통합” 강의는 무료인가요?

네 — “시장 데이터 API 통합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.

“시장 데이터 API 통합”에서 뭘 배우나요?

실시간 및 과거 데이터를 위해 Alpha Vantage, Yahoo Finance, Polygon.io를 활용합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Agents을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“시장 데이터 API 통합” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 시장 데이터 API 통합
  2. 포트폴리오 분석 에이전트 도구
  3. 위험 및 규정 준수 안전장치
  4. 에이전트 결정 백테스트
← AI Agents(으)로 돌아가기