본문으로 건너뛰기

주식나침반

한국·미국 주식 매매 원칙을 적용한 1인용 종목 선별 도구

기획·구현·리팩토링 전 과정을 멀티 에이전트 오케스트레이터로 운영

개요

기간

2026.05

개요

개인 프로젝트

주요 기능

다중 필터 스크리너, 종목별 1회 호출 AI 분석, 재무·주가 시각화, AI 테마 자동 매핑

사용 기술

FastAPIJinja2SQLAlchemySQLiteyfinanceclaude CLIAPSchedulerChart.js

주요 기능과 개발 과정

종목별 1회 호출로 AI 테마를 자세히 조사

종목당 1회WebSearch·WebFetch 조사마지막 JSON 블록만 추출공백 제거 키로 중복 제거다음 종목 반복시총 상위 종목 목록claude 서브프로세스종목 응답종목-테마 매핑stock_themes 저장
종목당 1회 claude 호출로 조사하고, 응답 말미 JSON만 추출해 중복 없이 저장함.
종목당 1회 호출 AI 조사 결과 화면 (참고 링크 포함)
문제

한 번의 AI 호출에서 여러 종목을 함께 분석하면 컨텍스트 한도 때문에 각 종목을 충분히 조사하기 어려움. 특히 정치·정책 이슈나 소셜 모멘텀(온라인에서 관심과 반응이 이어지는 흐름)처럼 자료가 여러 곳에 흩어진 주제는 일부 정보만 확인하게 됨.

분석

AI 호출을 종목당 1회로 분리하고, 분석할 때마다 별도 서브프로세스(subprocess, 독립적으로 실행되는 하위 프로세스)를 시작함. claude CLI가 WebSearch와 WebFetch(웹 검색·수집 도구)를 사용해 해당 종목만 자세히 조사하도록 프롬프트를 작성함. 한국 시장 프롬프트에는 "종목명 관련주", "테마 관련주" 형태의 여러 검색어와 정치·정책 테마의 별도 확인을 포함함. 참고 자료는 7건 이상(증권사 2건, 블로그 5건)으로 정함.

해결

프롬프트는 응답 마지막에 종목-테마 매핑 JSON(정해진 구조로 데이터를 표현하는 형식)을 반드시 출력하도록 구성함. 응답을 처리할 때 코드블록의 마지막 JSON만 가져와 `stock_themes` 테이블에 저장함. 테마명에서 공백을 제거한 값을 비교해 같은 테마가 중복 저장되지 않도록 함.

결과

종목 하나를 분석하는 데 1~3분이 걸리지만, 종목당 평균 7개 이상의 참고 자료 링크와 정치·정책 테마를 확보함. 분석 대상은 시가총액 상위 N개(KR 30, US 50)로 제한해 1회 스크리닝(조건에 맞는 종목 선별)에 드는 비용을 미리 예상할 수 있게 함.

Popen + SIGTERM으로 진행 중인 분석 즉시 취소

current 필드 폴링다음 종목 전 플래그 확인확인 후 cancel API평균 1초 내cancel_requested 감지분석 중종목명 표시반복 계속중단 버튼SIGTERM 전송실행 중 호출 종료중단됨 상태
분석 중 상태에서 중단을 요청하면 SIGTERM으로 실행 중 호출을 끝내고 반복도 플래그로 정리함.
문제

종목별로 AI를 한 번씩 호출하면서, 한 번의 분석 작업이 30~50개 서브프로세스를 차례로 실행하게 됨. 사용자가 분석 대상을 잘못 선택하면 모든 작업이 끝날 때까지 기다려야 하므로 즉시 중단하는 기능이 필요해짐.

분석

claude 호출 방식을 `subprocess.run`에서 `subprocess.Popen`으로 바꾸고, 현재 실행 중인 프로세스 핸들을 모듈 전역에 저장함. `cancel_analysis()`가 호출되면 저장된 프로세스에 SIGTERM(프로세스에 정상 종료를 요청하는 신호)을 보내 현재 종목 분석을 즉시 종료함. 다음 종목으로 넘어가기 전에는 `cancel_requested` 플래그를 확인해 반복 작업도 종료함.

해결

화면이 "분석 중" 상태이면 현재 분석하는 종목명을 본문에 표시함. 폴링(polling, 서버 상태를 일정 간격으로 확인하는 방식) 응답의 `current` 필드로 종목명을 갱신함. 중단 버튼은 확인 대화상자를 거쳐 `/api/analyze/cancel`에 요청을 보냄. 백그라운드 작업은 페이지 이동이나 새로고침 뒤에도 계속 실행되며, 어느 화면에서든 같은 폴링 결과를 확인할 수 있음.

결과

중단을 요청하면 평균 1초 안에 실행 중인 claude 호출이 끝나고 분석 반복 작업도 함께 정리됨. UI에는 "중단됨" 상태가 표시되며, 사용자는 필터 수정이나 재분석 같은 다음 작업을 바로 시작할 수 있음.

결과와 회고

결과

claude CLI 웹 검색 기반 AI 분석 기능 구현 (종목당 1회 호출, 평균 7+ 참고 자료 확보)

시장별 차이만 추상 클래스로 분리하고 필터 엔진과 분석 러너는 공통으로 구성함. 시장별 차이는 종목 시드, 티커 변환, 프롬프트, 시가총액 기준값임

백그라운드 분석 즉시 취소 기능 구현 (Popen + SIGTERM 기반 1초 내 종료)

테마 자동 매핑과 공백 제거 정규화로 중복 카드 증가 방지

회고

DECISIONS.md에 결정 이유를 한 줄씩 기록해 KR/US 통합처럼 구조를 크게 바꾸는 작업에서도 기존 결정의 근거를 확인할 수 있었음. 회고를 위해 만든 문서가 개발 중에도 유용함을 확인함.

한 번의 호출에서 분석하는 종목 수가 AI 분석의 깊이에 큰 영향을 줌을 확인함. 여러 종목을 한 호출에 넣어 컨텍스트를 아끼는 것보다 호출을 분리하는 편이 효과적이었으며, 종목당 1회 호출이 비용과 분석 깊이의 균형을 안정적으로 맞췄음.

기획·구현·감사 단계를 멀티 에이전트 오케스트레이터(여러 AI 에이전트의 작업을 나누고 조정하는 방식)로 분리해 운영하면 본인은 우선순위 결정과 검토에 집중할 수 있음을 확인함.

라이선스