주식 데이터 수집부터 AI 분석까지: 초보자를 위한 완벽 가이드

주식 데이터를 AI에게 분석 부탁하려면? 데이터 수집부터 분석까지 A to Z

안녕하세요, 주식 투자에 관심이 많거나 AI를 활용해 투자 전략을 세우고 싶은 분들을 위한 글을 준비했습니다. 최근 AI 기술이 발전하면서, 주식 데이터를 분석해 매매 시점을 예측하거나 패턴을 찾아주는 도구로 활용할 수 있다는 점이 매력적이죠. 하지만 AI에게 “이 주식 분석해줘!”라고 말하기 위해서는 먼저 정확하고 풍부한 데이터가 필요합니다.

그렇다면 주식 데이터는 어디서 어떻게 구할까요? 이번 글에서는 한국투자증권(KIS) Open API를 활용해 주식 데이터를 수집하고, 기술적 지표를 추가한 뒤 CSV로 저장하는 프로그램을 직접 만들어보겠습니다. 이 과정을 통해 AI에게 넘겨줄 데이터를 준비하고, 나아가 분석까지 부탁할 수 있는 기반을 마련해보겠습니다.


1. 왜 이 코드가 필요할까?

AI에게 주식 분석을 부탁하려면 다음과 같은 데이터가 필요합니다:

  • 과거 주가 데이터: 시가(Open), 고가(High), 저가(Low), 종가(Close), 거래량(Volume).
  • 기술적 지표: 이동평균(SMA), RSI, MACD, 볼린저 밴드 등.

이 데이터를 직접 수집하지 않으면:

  • 무료 사이트는 데이터가 제한적이거나 최신이 아닐 수 있음.
  • 유료 서비스는 비용이 부담스러움.
  • API를 활용하지 않으면 수작업으로 데이터를 모으는 데 시간이 너무 많이 걸림.

따라서 한국투자증권 Open API를 사용해 한국(코스피/코스닥)과 미국(NASDAQ/NYSE) 주식 데이터를 자동으로 가져오고, 기술적 지표를 추가해 AI가 바로 분석할 수 있는 형태로 저장하는 코드를 만들어보려고 합니다. 이 과정은 초보자도 따라 할 수 있도록 단계별로 설명하겠습니다.


2. 준비물

코드를 만들기 전에 다음을 준비해야 합니다:

  1. 한국투자증권 계좌: API 사용을 위한 계좌가 필요합니다. (모의투자 계좌도 가능)
  2. API 키: KIS Open API에서 발급받은 appkeyappsecret.
  3. Python 환경: Python 3.8 이상 설치.
  4. 필요한 라이브러리:
  • requests: API 요청.
  • pandas: 데이터 처리.
  • ta: 기술적 분석 지표 계산.
  • python-dotenv: 환경 변수 관리.
  • tkinter: GUI (기본 내장 모듈).

3. 설치 과정

3.1 Python 설치

  • Python 공식 사이트에서 최신 버전을 다운로드해 설치하세요.
  • 설치 시 “Add Python to PATH” 옵션을 체크하세요.

3.2 라이브러리 설치

터미널에서 다음 명령어를 실행하세요:

pip install requests pandas ta python-dotenv
  • tkinter는 Python에 기본 포함되어 별도 설치가 필요 없습니다.

3.3 API 키 발급

  1. 한국투자증권 홈페이지에 로그인.
  2. Open API 메뉴에서 “API 신청” 후 appkeyappsecret 발급.
  3. 발급받은 키를 .env 파일에 아래와 같이 저장 (.env 파일은 파이썬 파일과 같은 폴더에 저장되어있어야 합니다.)
   API_KEY="발급받은_appkey"
   API_SECRET="발급받은_appsecret"

4. 코드 작성 과정

이제 본격적으로 코드를 만들어보겠습니다. 전체 코드는 길지만, 주요 부분을 나누어 설명하겠습니다.

4.1 기본 설정

먼저 필요한 모듈을 임포트하고 환경 변수를 설정합니다:

import requests
import pandas as pd
from ta.trend import SMAIndicator, MACD
from ta.momentum import RSIIndicator
from ta.volatility import BollingerBands
import time
from datetime import datetime, timedelta
from dotenv import load_dotenv, set_key
import os
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import re
import logging

# 로깅 설정
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

# .env 파일 경로 설정
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ENV_PATH = os.path.join(BASE_DIR, ".env")
load_dotenv(dotenv_path=ENV_PATH)

# API 키 로드
API_KEY = os.getenv("API_KEY")
API_SECRET = os.getenv("API_SECRET")
BASE_URL = "https://openapi.koreainvestment.com:9443"  # 실전투자

4.2 토큰 관리

API 요청에 필요한 토큰을 발급하고 유효성을 관리합니다:

TOKEN = os.getenv("ACCESS_TOKEN")
TOKEN_ISSUE_TIME = float(os.getenv("ISSUE_TIME", "0"))
TOKEN_EXPIRY = 6 * 60 * 60  # 6시간

def get_access_token():
    global TOKEN, TOKEN_ISSUE_TIME
    url = f"{BASE_URL}/oauth2/tokenP"
    headers = {"content-type": "application/json"}
    body = {"grant_type": "client_credentials", "appkey": API_KEY, "appsecret": API_SECRET}
    response = requests.post(url, headers=headers, json=body)
    if response.status_code == 200:
        data = response.json()
        TOKEN = data["access_token"]
        TOKEN_ISSUE_TIME = time.time()
        set_key(ENV_PATH, "ACCESS_TOKEN", TOKEN)
        set_key(ENV_PATH, "ISSUE_TIME", str(TOKEN_ISSUE_TIME))
        logging.info("토큰 발급 성공")
        return True, "토큰 발급 성공"
    return False, f"토큰 발급 실패: {response.text}"

def is_token_valid():
    return TOKEN is not None and time.time() - TOKEN_ISSUE_TIME < TOKEN_EXPIRY

def ensure_token():
    if is_token_valid():
        return True, "기존 토큰 재사용"
    return get_access_token()

4.3 주식 데이터 가져오기

한국과 미국 주식 데이터를 가져오는 핵심 함수입니다:

def get_stock_data(market, ticker, period):
    valid, message = validate_ticker_market(market, ticker)
    if not valid:
        return None, None, message

    success, message = ensure_token()
    if not success:
        return None, None, message

    end_date = datetime.now()
    start_date = end_date - timedelta(days=800)

    if market == "KR":
        url = f"{BASE_URL}/uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice"
        params = {
            "fid_cond_mrkt_div_code": "J",
            "fid_input_iscd": ticker,
            "fid_input_date_1": start_date.strftime("%Y%m%d"),
            "fid_input_date_2": end_date.strftime("%Y%m%d"),
            "fid_period_div_code": period,
            "fid_org_adj_prc": "0"
        }
        headers = {"authorization": f"Bearer {TOKEN}", "appkey": API_KEY, "appsecret": API_SECRET, "tr_id": "FHKST03010100"}
        response = requests.get(url, headers=headers, params=params)
        data = response.json()
        df = pd.DataFrame(data["output2"])
        df = df[["stck_bsop_date", "stck_oprc", "stck_hgpr", "stck_lwpr", "stck_clpr", "acml_vol"]]
        df.columns = ["Date", "Open", "High", "Low", "Close", "Volume"]
        df["Date"] = pd.to_datetime(df["Date"])
        stock_name = data["output1"]["hts_kor_isnm"]
    else:  # NAS, NYS
        url = f"{BASE_URL}/uapi/overseas-price/v1/quotations/dailyprice"
        params = {"EXCD": market, "SYMB": ticker.upper(), "GUBN": "0", "MODP": "1"}
        headers = {"authorization": f"Bearer {TOKEN}", "appkey": API_KEY, "appsecret": API_SECRET, "tr_id": "HHDFS76240000"}
        response = requests.get(url, headers=headers, params=params)
        data = response.json()
        df = pd.DataFrame(data["output2"])
        df = df[["xymd", "open", "high", "low", "clos", "tvol"]]
        df.columns = ["Date", "Open", "High", "Low", "Close", "Volume"]
        df["Date"] = pd.to_datetime(df["Date"])
        stock_name = data["output1"]["rsym"][4:]

    df = add_technical_indicators(df)
    return df, stock_name, "데이터 가져오기 성공"

4.4 기술적 지표 추가

AI가 분석할 수 있도록 지표를 추가합니다:

def add_technical_indicators(df):
    sma5 = SMAIndicator(close=df["Close"], window=5).sma_indicator()
    sma20 = SMAIndicator(close=df["Close"], window=20).sma_indicator()
    df["SMA5"] = sma5
    df["SMA20"] = sma20
    df["RSI"] = RSIIndicator(close=df["Close"], window=14).rsi()
    df["MACD"] = MACD(close=df["Close"]).macd()
    df["BB_High"] = BollingerBands(close=df["Close"]).bollinger_hband()
    return df

4.5 GUI 구현

사용자가 쉽게 입력할 수 있도록 GUI를 추가합니다:

class StockDataApp:
    def __init__(self, root):
        self.root = root
        self.root.title("주식 데이터 다운로더")
        tk.Label(root, text="시장:").grid(row=0, column=0)
        self.market_var = tk.StringVar(value="KR")
        ttk.Combobox(root, textvariable=self.market_var, values=["KR", "NAS", "NYS"]).grid(row=0, column=1)
        tk.Label(root, text="티커:").grid(row=1, column=0)
        self.ticker_entry = tk.Entry(root)
        self.ticker_entry.grid(row=1, column=1)
        tk.Button(root, text="데이터 가져오기", command=self.fetch_and_save).grid(row=2, column=0, columnspan=2)

    def fetch_and_save(self):
        market = self.market_var.get()
        ticker = self.ticker_entry.get()
        df, stock_name, message = get_stock_data(market, ticker, "D")
        if df is not None:
            df.to_csv(f"{stock_name}_{ticker}.csv", index=False)
            messagebox.showinfo("성공", "데이터 저장 완료!")

4.6 전체 코드 통합

위 코드를 하나로 합치고 실행하면 됩니다.


5. 실행 결과

  1. 프로그램을 실행하면 GUI 창이 열립니다.
  2. 시장(KR), 티커(005930), 주기(D)를 입력하고 버튼을 누릅니다.
  3. 삼성전자 데이터가 삼성전자_005930.csv로 저장됩니다.
실행-GUI

6. AI에게 분석 부탁하기

csv파일-생성-예시

이제 데이터를 준비했으니 AI(예: ChatGPT, Grok 등)에게 넘겨줄 수 있습니다:

  • 질문 예시: “이 CSV 데이터를 보고 삼성전자 주가가 다음 달에 오를지 분석해줘.”
  • : 데이터를 업로드하거나, 주요 지표(SMA, RSI 등)를 요약해 텍스트로 전달하면 더 정확한 답변을 받을 수 있습니다.

이 코드를 통해 주식 데이터를 수집하고 AI 분석의 첫걸음을 내디뎠습니다.

    궁금한 점이 있으면 댓글로 남겨주세요!


    참고

    • 이 글은 초보자를 위해 일부 코드를 간소화했습니다. 실제 코드에는 에러 처리, 재시도 로직 등이 추가되어 있습니다.

    댓글 달기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

    위로 스크롤