Polygon API와 Python을 활용한 자동 주식 모멘텀 스크리닝 시스템 구축: 실시간 데이터 기반 투자 전략

실시간 주식 데이터 기반의 모멘텀 스크리닝 시스템을 구축하여 투자 결정을 자동화하고 싶으신가요? Polygon API와 Python을 활용하여 실시간 데이터를 수집하고, 모멘텀 지표를 계산하여 투자 기회를 포착하는 시스템을 구축하는 방법을 단계별로 안내합니다. 이 시스템을 통해 데이터에 기반한 전략적 투자 결정을 내리고 시간과 노력을 절약할 수 있습니다.

1. The Challenge / Context

개인 투자자로서, 수많은 주식 데이터를 실시간으로 분석하고 모멘텀을 기반으로 투자 결정을 내리는 것은 매우 어려운 일입니다. 기존의 투자 방식은 시간 소모적이고, 감정적인 편향에 취약하며, 데이터 기반의 객관적인 분석이 부족할 수 있습니다. 특히 빠른 시장 변화에 대응하기 위해서는 실시간 데이터에 기반한 자동화된 분석 시스템이 필수적입니다. 이 시스템은 정보 과부하를 줄이고, 잠재적 투자 기회를 효율적으로 식별하는 데 도움이 됩니다.

2. Deep Dive: Polygon API

Polygon API는 실시간 주식 시장 데이터, 과거 데이터, 기업 정보 등을 제공하는 강력한 API입니다. 다른 API와 비교했을 때, Polygon API는 다음과 같은 장점을 가지고 있습니다:

  • 실시간 데이터 제공: 낮은 지연 시간으로 정확한 실시간 데이터를 제공하여 신속한 의사 결정을 지원합니다.
  • 광범위한 데이터 커버리지: 미국 주식 시장 뿐만 아니라 암호화폐, 외환 등 다양한 금융 상품 데이터를 제공합니다.
  • 사용 편의성: RESTful API로 설계되어 있어 다양한 프로그래밍 언어에서 쉽게 사용할 수 있습니다.
  • 합리적인 가격: 다양한 요금제를 제공하여 개인 투자자부터 기관 투자자까지 적합한 플랜을 선택할 수 있습니다.

핵심적인 엔드포인트는 다음과 같습니다:

  • /v2/ticks/{stockTicker}/{date}: 특정 날짜의 주식 티커에 대한 실시간 거래 내역(tick data)을 제공합니다.
  • /v2/aggs/ticker/{stockTicker}/range/{multiplier}/{timespan}/{from}/{to}: 특정 기간 동안의 OHLCV (Open, High, Low, Close, Volume) 데이터를 제공합니다. 모멘텀 계산에 필수적입니다.
  • /v3/reference/tickers: 주식 티커, 회사 이름, 섹터 등 기업의 기본 정보를 제공합니다.

3. Step-by-Step Guide / Implementation

이제 Polygon API와 Python을 사용하여 자동 주식 모멘텀 스크리닝 시스템을 구축하는 단계를 자세히 살펴보겠습니다.

Step 1: Polygon API 키 획득

Polygon.io 웹사이트에 가입하고 API 키를 발급받습니다. 무료 플랜으로 시작하여 필요에 따라 유료 플랜으로 업그레이드할 수 있습니다. API 키는 환경 변수 또는 구성 파일에 안전하게 저장하는 것이 좋습니다.

Step 2: Python 환경 설정

Python 3.7 이상이 설치되어 있는지 확인합니다. 필요한 라이브러리를 설치합니다:

pip install requests pandas python-dotenv

  • requests: API 요청을 보내는 데 사용됩니다.
  • pandas: 데이터 분석 및 조작에 사용됩니다.
  • python-dotenv: API 키와 같은 환경 변수를 관리하는 데 사용됩니다.

Step 3: 환경 변수 설정

`.env` 파일을 생성하고 Polygon API 키를 저장합니다:

POLYGON_API_KEY=YOUR_POLYGON_API_KEY

Python 코드에서 `.env` 파일을 로드합니다:

from dotenv import load_dotenv
import os

load_dotenv()
POLYGON_API_KEY = os.getenv("POLYGON_API_KEY")

if POLYGON_API_KEY is None:
    raise ValueError("Polygon API key not found in environment variables.")

Step 4: 데이터 수집 함수 정의

Polygon API를 사용하여 주식 데이터를 가져오는 함수를 정의합니다:

import requests
import pandas as pd
from datetime import datetime, timedelta

def get_stock_data(ticker, from_date, to_date, api_key):
    """
    Polygon API를 사용하여 주식 데이터를 가져옵니다.

    Args:
        ticker (str): 주식 티커.
        from_date (str): 시작 날짜 (YYYY-MM-DD 형식).
        to_date (str): 종료 날짜 (YYYY-MM-DD 형식).
        api_key (str): Polygon API 키.

    Returns:
        pandas.DataFrame: 주식 데이터 (Open, High, Low, Close, Volume).
    """
    url = f"https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{from_date}/{to_date}?adjusted=true&sort=asc&limit=5000&apiKey={api_key}"
    response = requests.get(url)
    response.raise_for_status()  # HTTP 에러 발생 시 예외 처리

    data = response.json()

    if data['results']:
        df = pd.DataFrame(data['results'])
        df['t'] = pd.to_datetime(df['t'], unit='ms')  # 타임스탬프를 datetime으로 변환
        df = df.rename(columns={'t': 'Date', 'o': 'Open', 'h': 'High', 'l': 'Low', 'c': 'Close', 'v': 'Volume'})
        df = df[['Date', 'Open', 'High', 'Low', 'Close', 'Volume']]
        return df
    else:
        return pd.DataFrame()  # 빈 DataFrame 반환

Step 5: 모멘텀 지표 계산 함수 정의

주식 데이터에서 모멘텀 지표(예: 단순 이동 평균, 상대 강도 지수(RSI))를 계산하는 함수를 정의합니다:

def calculate_sma(data, window):
    """
    단순 이동 평균 (SMA)을 계산합니다.

    Args:
        data (pandas.Series): 주식 가격 데이터.
        window (int): 이동 평균 기간.

    Returns:
        pandas.Series: SMA 값.
    """
    return data.rolling(window=window).mean()

def calculate_rsi(data, window=14):
    """
    상대 강도 지수 (RSI)를 계산합니다.

    Args:
        data (pandas.Series): 주식 가격 데이터.
        window (int): RSI 기간.

    Returns:
        pandas.Series: RSI 값.
    """
    delta = data.diff()
    up, down = delta.copy(), delta.copy()
    up[up < 0] = 0
    down[down > 0] = 0

    roll_up1 = up.ewm(span=window, adjust=False).mean()
    roll_down1 = down.abs().ewm(span=window, adjust=False).mean()

    RS = roll_up1 / roll_down1
    RSI = 100.0 - (100.0 / (1.0 + RS))
    return RSI

Step 6: 스크리닝 로직 구현

모멘텀 지표를 기반으로 주식을 스크리닝하는 로직을 구현합니다. 예를 들어, 특정 이동 평균 이상인 주식, RSI가 특정 값 이상인 주식 등을 필터링할 수 있습니다:

def screen_stocks(tickers, api_key, from_date, to_date):
    """
    주식 티커 목록에서 모멘텀 스크리닝을 수행합니다.

    Args:
        tickers (list): 주식 티커 목록.
        api_key (str): Polygon API 키.
        from_date (str): 시작 날짜 (YYYY-MM-DD 형식).
        to_date (str): 종료 날짜 (YYYY-MM-DD 형식).

    Returns:
        pandas.DataFrame: 스크리닝된 주식 데이터.
    """
    screened_stocks = []
    for ticker in tickers:
        try:
            data = get_stock_data(ticker, from_date, to_date, api_key)
            if not data.empty:
                data['SMA_20'] = calculate_sma(data['Close'], 20)
                data['RSI'] = calculate_rsi(data['Close'])

                # 스크리닝 조건 예시: 20일 이동 평균 이상, RSI > 70
                last_row = data.iloc[-1]
                if last_row['Close'] > last_row['SMA_20'] and last_row['RSI'] > 70:
                    screened_stocks.append({
                        'Ticker': ticker,
                        'Close': last_row['Close'],
                        'SMA_20': last_row['SMA_20'],
                        'RSI': last_row['RSI']
                    })
        except Exception as e:
            print(f"Error processing {ticker}: {e}")

    return pd.DataFrame(screened_stocks)

Step 7: 스크리닝 실행 및 결과 확인

스크리닝 로직을 실행하고 결과를 확인합니다:

if __name__ == "__main__":
    # 스크리닝할 주식 티커 목록
    tickers = ['AAPL', 'MSFT', 'GOOG', 'TSLA', 'AMZN']
    today = datetime.today().strftime('%Y-%m-%d')
    one_year_ago = (datetime.today() - timedelta(days=365)).strftime('%Y-%m-%d')

    # 스크리닝 실행
    screened_stocks = screen_stocks(tickers, POLYGON_API_KEY, one_year_ago, today)

    # 결과 출력
    if not screened_stocks.empty:
        print("Screened Stocks:")
        print(screened_stocks)
    else:
        print("No stocks met the screening criteria.")

4. Real-world Use Case / Example

저는 이 시스템을 사용하여 매일 아침 장 시작 전에 유망한 주식을 스크리닝합니다. 기존에는 여러 웹사이트를 돌아다니며 수동으로 데이터를 확인해야 했지만, 이제는 자동화된 시스템을 통해 30분 이상 절약할 수 있습니다. 예를 들어, 2023년 초, 이 시스템은 Tesla의 모멘텀 상승을 포착하여 조기에 투자 기회를 제공했습니다. 수동 분석으로는 놓칠 수 있었던 기회를 데이터 기반 시스템이 잡아낸 것입니다.

5. Pros & Cons / Critical Analysis

  • Pros:
    • 자동화된 데이터 수집 및 분석으로 시간 절약
    • 객관적인 데이터 기반 투자 결정
    • 실시간 데이터 기반 빠른 시장 대응
    • 다양한 모멘텀 지표를 활용한 맞춤형 스크리닝
  • Cons:
    • Polygon API 사용 비용 발생 (무료 플랜 제한 존재)
    • API 응답 속도에 따라 스크리닝 시간 변동 가능성
    • 모멘텀 투자 전략의 inherent risk (과거 성과가 미래 수익을 보장하지 않음)
    • 시스템 유지보수 및 업데이트 필요
    • 백테스팅 필수: 과거 데이터에 대한 테스트를 통해 전략의 유효성을 검증해야 합니다.

6. FAQ

  • Q: Polygon API 무료 플랜으로도 충분한가요?
    A: 초기 테스트 및 소규모 투자를 위해서는 무료 플랜으로도 충분할 수 있습니다. 하지만 실시간 데이터 접근 및 API 호출 횟수 제한이 있으므로, 본격적인 투자를 위해서는 유료 플랜을 고려해야 합니다.
  • Q: 어떤 모멘텀 지표를 사용하는 것이 가장 효과적인가요?
    A: 효과적인 모멘텀 지표는 시장 상황, 투자 목표, 위험 감수 수준에 따라 다릅니다. 단순 이동 평균, 상대 강도 지수(RSI), MACD 등 다양한 지표를 조합하여 자신만의 전략을 개발하는 것이 좋습니다. 백테스팅을 통해 과거 데이터에 대한 전략의 성과를 검증하는 것이 중요합니다.
  • Q: 스크리닝된 주식을 무조건 매수해야 하나요?
    A: 스크리닝은 투자 결정을 위한 참고 자료일 뿐입니다. 스크리닝된 주식에 대한 추가적인 분석 (예: 재무 분석, 기업 전망)을 수행하고, 자신의 투자 목표 및 위험 감수 수준에 맞춰 신중하게 투자 결정을 내려야 합니다.
  • Q: 실시간 데이터를 사용하면 항상 더 좋은 결과를 얻을 수 있나요?
    A: 실시간 데이터는 빠른 시장 변화에 대응하는 데 도움이 될 수 있지만, 항상 더 나은 결과를 보장하는 것은 아닙니다. 과도한 실시간 데이터 의존은 빈번한 거래 (잦은 매매)를 유발하여 거래 비용 증가 및 감정적인 투자 결정으로 이어질 수 있습니다. 신중한 분석과 전략적인 접근이 필요합니다.

7. Conclusion

Polygon API와 Python을 활용한 자동 주식 모멘텀 스크리닝 시스템은 데이터 기반 투자 결정을 자동화하고 투자 효율성을 높이는 강력한 도구입니다. 이 가이드에서 제시된 단계를 따라 자신만의 스크리닝 시스템을 구축하고, 투자 전략을 개선하여 성공적인 투자를 이루시길 바랍니다. 지금 바로 Polygon API를 사용하여 주식 데이터 분석을 시작해보세요!