공정 엔지니어의 AI 엔지니어로의 성장 기록

비전공자의 바이브 코딩/일상 & 기초

클로드코드(Claude Code)로 주식 분석 웹 서비스 만들기 : #4. 주식 분석 기능 만들기

ai-process-engineer 2026. 5. 5. 20:31
클로드코드로 주식 분석 웹 서비스 만들기 #4 — 주식 분석 기능 구현

클로드코드(Claude Code)로
주식 분석 웹 서비스 만들기
— #4. 주식 분석 기능 만들기

웹 페이지가 완성됐으니 이제 핵심인 분석 기능을 붙일 차례다. RSI, MACD, 볼린저밴드, SuperTrend, ADX 등 8개 지표를 조합한 4가지 전략을 4개 시간봉에 걸쳐 독립 실행하고, 2개 이상 전략에서 동시에 매수 신호가 나온 종목만 추천하는 구조를 Claude Code로 구현했다. 아래에 실제 사용한 프롬프트와 구현 내용을 정리했다.

01 사용한 프롬프트 모음

Claude Code에 아래 프롬프트를 순서대로 입력하면 이 글의 기능 전체를 재현할 수 있다. 각 프롬프트는 독립된 작업 단위로 설계했으며, 이전 결과물이 다음 프롬프트의 컨텍스트가 된다.

Prompt 01 — 기술적 분석 전략 기반 설계
# 4가지 기술적 분석 전략 모듈을 Python으로 구현해줘.
# 각 전략은 독립적으로 buy/sell/neutral 신호와 0~100 강도를 반환해야 해.
#
# 전략 1: RSI(14) + MACD(12/26/9) + 볼린저밴드(20, 2σ) 복합 모멘텀
# 전략 2: SuperTrend(10, 3×ATR) + EMA 크로스오버(5 vs 20) 추세 추종
# 전략 3: Stochastic(14,3) + ADX(14) 모멘텀 + 추세 강도
# 전략 4: 볼린저밴드 단독 평균 회귀
#
# 입력: OHLCV 캔들 리스트 (최소 30개)
# 출력: {"strategy": str, "signal": "buy"|"sell"|"neutral", "strength": int, "details": dict}
# Wilder's Smoothing 방식으로 RSI를 구현하고, 각 지표 계산 함수는 별도 분리해줘.
Prompt 02 — 멀티 타임프레임 캔들 집계
# 60분봉 OHLCV 리스트를 받아 3시간봉과 6시간봉으로 집계하는 함수를 만들어줘.
# 집계 규칙:
#   Open  = 그룹 내 첫 캔들 시가
#   High  = 그룹 내 최고가
#   Low   = 그룹 내 최저가
#   Close = 그룹 내 마지막 캔들 종가
#   Volume = 그룹 내 거래량 합산
# 1h → 3h: 3개 묶기 / 1h → 6h: 6개 묶기
# SQLAlchemy 모델(ChartData)에서 바로 읽어 변환까지 처리하는 코드도 포함해줘.
Prompt 03 — 매수 추천 알고리즘
# 종목별 매수 추천 알고리즘을 구현해줘.
# 입력: 종목 리스트, 시간봉("1h"|"3h"|"6h"|"1d"), 마켓("KOSPI"|"NASDAQ")
#
# 처리 흐름:
# 1. 종목마다 최근 100개 캔들 로드 (최소 30개 미만 시 건너뜀)
# 2. 4개 전략 독립 실행
# 3. buy 신호 개수 카운트, 복합점수 = buy strength 합계 / 4
# 4. buy 전략 2개 이상인 종목만 필터링
# 5. 복합점수 기준 상위 20개 추출
# 결과는 PostgreSQL TechnicalSignal 테이블에 upsert 처리해줘.
Prompt 04 — 교차 분석 추천 (외국인/기관/조회)
# 3가지 랭킹 데이터 교차 분석 추천 로직을 구현해줘.
# 조회 순위(30%), 외국인 순매수(40%), 기관 순매수(30%) 가중치로
# 세 카테고리에 모두 등장하는 종목의 복합 점수를 계산하고 Top 10 추출.
# 점수 = view_rank × 0.3 + foreign_rank × 0.4 + inst_rank × 0.3
# (순위가 낮을수록 점수가 낮고 = 더 좋은 종목)
# 결과는 Recommendation 테이블에 저장하고, FastAPI GET /api/recommend 엔드포인트도 만들어줘.
Prompt 05 — APScheduler 스케줄러 통합
# APScheduler를 사용해서 아래 주기로 데이터 수집 + 분석을 자동 실행하는 스케줄러를 만들어줘.
# - 조회 순위: 60초
# - 외국인/기관 순매수: 300초
# - 60분봉 수집 + 3h/6h 집계: 600초
# - 기술적 분석 추천 갱신: 300초
# - 교차 분석 추천 갱신: 300초
# - NASDAQ yfinance 수집: 3600초
# FastAPI lifespan 이벤트로 앱 시작 시 스케줄러도 함께 시작하도록 설정해줘.
Prompt 06 — 프론트엔드 주식 분석 탭
# Next.js 14 App Router + TypeScript + Tailwind CSS로
# 주식 분석 탭 UI를 만들어줘.
#
# 기능:
# - 봉 단위 선택 버튼: 1시간 / 3시간 / 6시간 / 1일
# - KOSPI / NASDAQ 마켓 탭 전환
# - GET /api/technical 호출 → 카드 그리드 표시 (모바일 2열 → 데스크탑 5열)
# - 각 카드에 종목명, 현재가, 등락률, 전략 매수 개수(■□ 아이콘), 복합점수 표시
# - 카드 클릭 시 4개 전략 상세 신호/지표값 모달 표시
# - 5분마다 자동 갱신 (setInterval)
팁 — 프롬프트를 한 번에 붙여넣기보다 하나씩 실행하고 결과를 확인한 뒤 다음으로 넘어가는 방식이 효과적이다. Claude Code는 이전 작업의 파일 구조를 컨텍스트로 유지하므로, 순서대로 진행하면 불필요한 재작업이 줄어든다.

02 시스템 구조 개요

이번 편에서 구현한 기능은 크게 세 레이어로 나뉜다. 데이터 수집 → 기술적 분석 → API + UI 순서로 연결된다.

키움 REST API
국내 OHLCV + 랭킹
yfinance
NASDAQ 20종목
4전략 × 4시간봉
= 16 신호/종목
Top 20 추천
2개+ 전략 필터
구분기술역할
백엔드Python, FastAPI, SQLAlchemy, APScheduler분석 엔진 + API 서버
프론트엔드Next.js 14, TypeScript, Tailwind CSS분석 결과 시각화 UI
데이터베이스PostgreSQL캔들·신호·추천 저장
국내 데이터키움증권 REST APIKOSPI/KOSDAQ OHLCV + 수급
해외 데이터yfinance (무료, API키 불필요)NASDAQ 주요 20종목
알림카카오톡 개인 메시지 API매수 추천 알림

03 데이터 수집 구조

국내 주식은 키움증권 REST API, NASDAQ은 yfinance로 수집한다. 두 소스 모두 동일한 DB 스키마(ChartData)에 저장되며, 60분봉은 수집 후 즉시 3시간봉·6시간봉으로 집계된다.

국내 — 키움 REST API

일봉 ka10081, 60분봉 ka10080 엔드포인트로 OHLCV 수집. 조회/거래량/외국인/기관 4종 랭킹을 60~300초 주기로 별도 수집.

NASDAQ — yfinance

AAPL, NVDA, MSFT 등 주요 20종목. 일봉(1년) + 시간봉(60일) 1시간마다 갱신. 가격은 정밀도 유지를 위해 ×100 정수 저장.

분봉 집계는 단순하지만 중요한 규칙을 따른다. 캔들을 그룹으로 묶을 때 시가는 첫 캔들, 종가는 마지막 캔들, 고가/저가는 그룹 내 극값, 거래량은 합산으로 처리한다.

Python — 1h → 3h 집계 핵심 로직
# 1시간봉 3개를 묶어 3시간봉 1개 생성
def aggregate_candles(candles: list, n: int) -> list:
    result = []
    for i in range(0, len(candles) - n + 1, n):
        group = candles[i:i+n]
        result.append({
            "open":   group[0]["open"],
            "high":   max(c["high"] for c in group),
            "low":    min(c["low"] for c in group),
            "close":  group[-1]["close"],
            "volume": sum(c["volume"] for c in group),
        })
    return result

04 4가지 기술적 분석 전략

각 전략은 독립 모듈로 구현되며 signal(buy/sell/neutral)과 strength(0~100) 두 값을 반환한다. 점수 기반 가산 방식이라 조건이 많이 충족될수록 강도가 높아진다.

  • 전략 1 — RSI + MACD + 볼린저밴드 (모멘텀 복합) RSI 과매도(30 이하 +35점), MACD 골든크로스(+35점), 볼린저밴드 하단 10% 이하(+30점)를 합산. 매수·매도 점수가 각각 40점 이상이면 신호 발생. RSI는 Wilder's Smoothing 방식으로 계산.
  • 전략 2 — SuperTrend + EMA 크로스오버 (추세 추종) SuperTrend(10, 3×ATR)로 추세 방향 판단(+40점), EMA5 > EMA20 골든크로스(+30점 + 보너스 +15점). 추세가 전환되는 시점에 추가 점수를 부여해 진입 타이밍을 포착.
  • 전략 3 — 스토캐스틱 + ADX (모멘텀 + 추세 강도) 스토캐스틱 %K 20 이하(+40점)에 ADX 필터를 결합. ADX ≥ 20이면 신호를 1.2배 증폭, ADX < 20이면 0.6배 감쇄. 횡보장에서의 거짓 신호를 자동으로 줄여준다.
  • 전략 4 — 볼린저밴드 단독 (평균 회귀) 가격이 하단밴드 이하일 때 +50점, 밴드 하위 20% 구간 +35점. 밴드 폭이 3% 미만(변동성 수축)이면 돌파 임박으로 +10점 추가. RSI < 35 보조 확인 시 +15점.
Python — RSI 계산 (Wilder's Smoothing)
# 첫 14봉: 단순 평균으로 초기화
avg_gain = sum(gains[:14]) / 14
avg_loss = sum(losses[:14]) / 14

# 이후 봉: 지수 평활 (Wilder's method)
for i in range(14, len(closes)):
    avg_gain = (avg_gain * 13 + gains[i]) / 14
    avg_loss = (avg_loss * 13 + losses[i]) / 14

rsi = 100 - (100 / (1 + avg_gain / avg_loss))

05 멀티 타임프레임 분석

4개 전략이 4개 시간봉(1h / 3h / 6h / 1d)에서 독립적으로 실행된다. 종목 하나당 총 16개의 신호가 생성되며, 사용자는 원하는 시간봉을 선택해 그 기준의 분석 결과를 볼 수 있다.

시간봉의미데이터 소스
1h장중 실시간 모멘텀키움 60분봉 직접 수집
3h중기 추세 흐름1h 캔들 3개 집계
6h세션 레벨 패턴1h 캔들 6개 집계
1d장기 추세 확인일봉 직접 수집
활용 팁 — 1일봉과 1시간봉에서 동시에 매수 신호가 나온 종목은 신뢰도가 높다. 장기 추세와 단기 모멘텀이 일치하는 구간을 노리는 것이 기본 전략이다.

06 매수 추천 알고리즘

단순히 신호 개수만 세는 것이 아니라 강도(strength)까지 반영한 복합 점수로 종목을 정렬한다.

  1. 01 최근 100개 캔들 로드 — 최소 30개 미만이면 건너뜀
  2. 02 4개 전략 독립 실행 → 각각 signal + strength 반환
  3. 03 buy 신호 개수 카운트. 2개 이상인 종목만 후보 유지
  4. 04 복합 점수 = (4개 전략 strength 합계) / 4
  5. 05 복합 점수 기준 상위 20개 추출 → DB upsert

예시: RSI+MACD+BB(75점 buy), SuperTrend+EMA(62점 buy), Stochastic+ADX(neutral), Bollinger(58점 buy)일 경우 → 복합 점수 48.75점, 매수 전략 3개로 추천 대상 확정.

07 교차 분석 추천 (외국인/기관/조회)

기술적 분석과 별도로 운영하는 수급 기반 추천이다. 개인(조회), 외국인, 기관이 동시에 관심 갖는 종목은 상승 확률이 높다는 가설을 수식으로 구현했다.

카테고리가중치의미
조회 순위30%개인 투자자 관심도
외국인 순매수40%스마트 머니 동향
기관 순매수30%기관 수급 동향
추천 로직 (의사코드)
# 3가지 랭킹의 교집합 종목만 대상
candidates = view_set ∩ foreign_set ∩ institution_set

# 복합 점수 계산 (낮을수록 좋음 — 순위가 낮으면 점수 낮음)
score = view_rank × 0.3 + foreign_rank × 0.4 + inst_rank × 0.3

# 점수 오름차순 정렬 → Top 10 추출
result = sorted(candidates, key=lambda x: x.score)[:10]

08 백테스팅 결과

약 1년(250~311 거래일) 동안 NASDAQ 10종목 + KOSPI/KOSDAQ 20종목을 대상으로 4가지 설정을 비교 테스트했다. 진입 조건(몇 개 전략 동시 신호), 목표가, 손절가, 최대 보유일을 달리하며 검증했다.

51.6%
보수 전략 승률
(3개+ 전략 동시)
+0.82%
보수 전략
평균 수익/거래
+452%
기본 전략
1년 누적 수익
전략목표가손절가진입조건승률누적수익
A (공격적)+3%-2%2개+47.9%+247%
B (기본)+5%-3%2개+50.5%+452%
C (보수적)+7%-4%3개+51.6%+430%
D (타이트 손절)+5%-2%2개+45.1%+344%
실전 권장 — 목표가 +5~7%, 손절가 -3~4%, 최대 보유 5~7일, 진입 조건 2개+(빈도 우선) 또는 3개+(정확도 우선), 종목당 전체 자금 10% 이하, 동시 보유 최대 5종목.

09 API 설계

FastAPI 기반으로 3개 핵심 엔드포인트를 구현했다. 응답 구조는 프론트엔드 카드 UI와 1:1로 대응되도록 설계했다.

엔드포인트파라미터설명
GET /api/technicalinterval, market, at기술적 분석 매수 추천 Top 20 (전략별 상세 포함)
GET /api/technical/{code}특정 종목의 4전략 × 4시간봉 전체 신호
GET /api/recommendmarket수급 교차 분석 추천 Top 10

스케줄러는 APScheduler로 구동하며 FastAPI의 lifespan 이벤트에 연결해 앱 시작과 동시에 활성화된다. 가장 빠른 작업이 60초, 가장 느린 NASDAQ 수집이 3600초 주기다.

10 프론트엔드 UI

분석 결과는 반응형 카드 그리드로 표시된다. 모바일에서는 2열, 데스크탑에서는 5열로 자동 전환되며 5분마다 자동 갱신된다.

  • 봉 단위 선택 버튼 1시간 / 3시간 / 6시간 / 1일 버튼을 클릭하면 해당 시간봉의 분석 결과로 즉시 갱신된다.
  • 종목 카드 종목명, 현재가, 등락률, 전략 매수 개수를 ■□ 아이콘으로 시각화, 복합점수 표시. Tailwind grid-cols-2 lg:grid-cols-5 반응형.
  • 종목 상세 모달 카드 클릭 시 4개 전략 각각의 신호, 강도, RSI·MACD·BB 포지션 등 세부 지표값을 모달로 확인할 수 있다.
Summary

이번 편에서는 4가지 기술적 분석 전략(RSI+MACD+BB, SuperTrend+EMA, Stochastic+ADX, 볼린저밴드)을 4개 시간봉에 걸쳐 독립 실행하고, 2개 이상 전략에서 동시에 매수 신호가 나온 종목을 자동 추출하는 시스템을 Claude Code로 구현했다. 약 1년 백테스팅 결과 기본 설정(+5%/−3%, 5일 보유, 2개+ 전략)에서 누적 수익 +452%를 기록했다. 다음 편에서는 카카오톡 알림 연동과 단타 매매 포지션 관리 기능을 다룬다.

#ClaudeCode #클로드코드 #주식분석 #기술적분석 #RSI #MACD #볼린저밴드 #SuperTrend #ADX #멀티타임프레임 #키움증권API #yfinance #FastAPI #알고리즘트레이딩