정말 미리 썻어야 한데.. 이제야 씁니다. 게을러 빠져서
상장사 분석 웹앱을 짓고, 그 데이터로 움직이는 AI 투자팀을 키운 기록
📝 한줄 요약
비개발자가 AI와 함께 두 가지를 만들었다 — ① 상장사 재무를 한눈에 보는 분석 웹 대시보드, ② 디스코드에서 룰 기반으로 모의 자동매매를 돌리는 AI 투자팀. 그리고 이 둘을 "웹앱이 만든 데이터를 봇이 먹는" 구조로 잇고 있다.
바쁘시면 이것만 읽어도 돼요:
만든 것 1 — 분석 웹앱: 종목 코드만 넣으면 DART 공시에서 재무를 끌어와 분기 시계열·밸류에이션·AI 해설까지 보여준다.
만든 것 2 — AI 투자팀: 디스코드 봇이 조건검색으로 종목을 찾고 → 기술적 신호(RCI·MACD·박스권)로 판정 → 모의로 사고팔고 → 그 결과를 스스로 복기한다.
핵심 철학: 가격을 예측하는 AI가 아니라, 룰 기반 신호 + 자기 복기로 점점 나아지는 시스템. "넓게 사서 데이터로 검증 → 좁히기."
제일 큰 깨달음: 자동매매의 진짜 자산은 매매가 아니라 "왜 사서 왜 팔았는지"의 완결 기록(원장)이다. 이게 없으면 개선이 '감'이 된다.
둘을 잇다: 웹앱이 가공한 재무·외인 데이터를 봇의 판단 근거로 끌어오는 게 다음 단계다.
🎯 이런 분들께 도움돼요
주식 분석을 매번 수동으로 하다 지친 분
"AI 자동매매"가 궁금하지만 블랙박스 예측 모델은 못 믿겠는 분
비개발자인데 API·자동화로 나만의 도구를 만들고 싶은 분
데이터와 자동화를 안전하게(모의로) 실험하고 싶은 분
😫 문제 상황 (Before)
투자를 하다 보면 두 가지가 늘 번거로웠다.
분석이 수동이다 — 종목 하나 보려면 증권사 앱, 공시 사이트, 뉴스를 오가며 재무를 손으로 짜맞춰야 했다. 분기별 추세나 밸류에이션은 매번 다시 계산이다.
매매가 감에 의존한다 — "왜 샀더라? 왜 팔았더라?"가 기록으로 안 남으니, 잘했는지 못했는지 복기가 안 됐다. 다음에 더 나아질 근거가 없었다.
그래서 두 도구가 필요했다 — 재무를 자동으로 정리해주는 분석판, 그리고 규칙대로 사고팔되 그 이유를 기록하는 자동매매 시스템. 단, AI가 "오를 거예요"라고 점치는 블랙박스는 싫었다. 규칙이 명확하고, 결과를 검증할 수 있는 구조여야 했다.
🛠️ 사용한 도구
AI 코딩 파트너(Hermes 기반,n8n,cursor): 코드 작성·디버깅·검증을 한 단계씩 함께
분석 웹앱: Node.js + 서버리스 배포 + 차트 라이브러리, DART 공시 API
투자팀 봇: 증권사 모의투자 API(2곳) + 디스코드 + 파이썬 (외부 의존 최소)
데이터 소스: DART(공시·재무), 증권사 API(시세·조건검색·수급), 공개 시장 데이터
🔒 전부 모의투자: 실제 돈이 아니라 모의 계좌로 검증. 실전 키는 분리·격리.
🔧 작업 과정 — 1부: 분석 웹앱
📊 1막 — "종목 코드만 넣으면 재무가 보이게"
첫 목표는 단순했다. 종목 코드 하나로 그 회사의 재무를 한눈에. 공시(DART) API에서 재무제표를 끌어와, 손익·재무상태·현금흐름을 차트로 그렸다.
여기서 진짜 일은 데이터 가공의 함정과 싸우는 거였다. 공시 재무는 생각보다 까다로웠다:
분기 데이터가 누적값이다 — 1분기·반기·3분기·연간이 차곡차곡 쌓인 숫자라, 단일 분기 값을 보려면 빼야 한다.
같은 계정인데 이름이 다르다 — "영업활동 현금흐름"(띄어쓰기)과 "영업활동현금흐름"(붙임)이 보고서마다 달라서, 모르고 짜면 데이터가 통째로 빈다.
순이익 계정명이 보고서마다 네 가지 — 당기/분기/반기순이익이 섞여서, 고정 이름으로 찾으면 특정 분기부터 값이 끊긴다.
이런 함정을 하나씩 실측으로 잡으며, 분기 재무 시계열을 안정적으로 뽑는 로직을 완성했다.
아래는 완성 웹이다.
📈 2막 — 밸류에이션과 AI 해설까지
재무를 그리고 나니 욕심이 났다. 단순 숫자를 넘어:
밸류에이션 지표(PER·PBR·ROE·주당지표)를 공시 데이터로 직접 계산
주가는 공개 시세를 결합
AI가 그 회사 재무를 읽고 한국어로 해설해주는 기능
그리고 여러 종목을 나란히 비교하는 기능, 업종별 빠른 비교 프리셋까지 붙였다. 종목 코드만 넣으면 분석 리포트가 나오는 도구가 됐다.
재무 차트를 그리고 나니 욕심이 났다. 단순 숫자 나열을 넘어, "이 회사가 싼가 비싼가, 잘 버는가"를 보여주고 싶었다. 그래서 세 갈래로 키웠다.
① 밸류에이션을 공시 데이터로 직접 계산했다. PER·PBR·ROE에 더해 주당 지표(BPS·EPS·SPS·주당영업현 금흐름·주당FCF·DPS)까지 — 외부에서 가져오지 않고 공시의 순이익·자본·매출 + 발행주식수로 직접 산출했다. 외부 지표를 긁어오면 출처가 흐려지고 계산 기준이 제각각이지만, 직접 계산하면 근거가 명확하고 토큰도 안 든다. 적자 종목은 PER을 무한대로 폭발시키지 않게 N/A로 막는 등, 예외도 하나씩 막았다.
② 주가는 공개 시세를 결합했다. 밸류에이션의 분자(주가)만 공개 시세에서 가져와 결합했는데, 여기서 솔직한 한계를 만났다 — 무료 시세는 최근 약 110일치만 주더라. 그래서 PER·PBR 같은 주가 기반 지표는 최근 1~2분기만 채워지고, 과거 밴드는 못 그린다. 반면 주당 지표(공시 기반)는 12분기 전체가 완성된다. "왜 과거 PER이 안 뜨지?"의 답이 바로 이 구조적 한계였고, 위조해서 채우지 않고 없는 건 없다고 정직하게 뒀다.
③ AI가 재무를 읽고 한국어로 해설하게 했다. 차트만 있으면 비개발자는 "그래서 뭐?"가 남는다. 그래서 손익·재무상태·현금흐름·지표를 AI에게 넘겨 친절한 한국어 해설을 생성했다. 단, 매번 AI를 부르면 느리고 비싸서 결과를 일정 시간 캐시해 같은 종목 재조회는 즉답하게 했다.
여기에 여러 종목을 나란히 비교하는 기능(스냅샷 표 + 11개 지표 추이 차트 + 기준점 100 리베이스), 업종별 빠른 비교 프리셋까지 붙였다. 종목 코드만 넣으면 — 분기 재무 시계열, 밸류에이션, AI 해설, 종목 비교까지 한 번에 나오는 도구가 됐다.
🔧 3막 — "기존 걸 부수지 말고, 추가만"
이 과정에서 뼈아픈 교훈이 하나 있었다. 기능을 개선하려다 기존에 잘 되던 화면을 통째로 깨먹은 적이 있다. 재무 데이터 소스를 바꿨더니 차트·표·지표가 전부 빈값이 됐다.
그 뒤로 원칙을 박았다 — 잘 되는 코드는 건드리지 않는다. 새 기능은 새 경로로 추가만 한다. 이게 라이브 서비스를 안정적으로 키우는 핵심이었다.
🔧 작업 과정 — 2부: AI 투자팀
🤖 4막 — 디스코드에 투자팀을 세우다
분석판이 생겼으니, 이제 행동하는 쪽이다. 매번 증권사 앱을 켜는 대신, 평소 쓰는 메신저(디스코드)에서 말 걸면 답하는 봇으로 만들고 싶었다.
① 모의투자 계좌를 연동했다 — 그것도 증권사 2곳. 실제 돈 없이 시세 조회·매수·매도를 API로 한다. 한 곳이 아니라 두 곳을 붙인 건, 같은 전략이라도 증권사마다 체결·데이터가 어떻게 다른지 비교하려고. 두 계좌를 하나의 공통 인터페이스(시세/잔고/매수/매도)로 감싸서, 봇은 "어느 증권사인지" 신경 안 쓰고 명령만 내리면 되게 했다.
② 명령형 + 자연어 하이브리드로 만들었다. 이게 핵심 설계였다:!시세 !잔고 !매수 같은 빠른 명령은 즉답(5초 내외) — AI를 안 거치니 빠르고, 비용도 0.
그 외 자연어 질문("하이닉스 지금 팔까?")은 AI가 해석해 답변. 이때 실시간 잔고·전략 요약·최근 대화를 함 께 넘겨서, 봇이 현재 상황을 알고 답하게 했다.
왜 굳이 둘로 나눴냐면 — 모든 걸 AI로 처리하면 느리고 비싸다. 자주 쓰는 조회는 즉답 명령으로, 판단이 필요한 것만 AI로. 속도와 비용을 둘 다 잡는 구조다.
③ 첨부 파일·이미지까지 읽게 했다. PDF·엑셀·차트 이미지를 던지면 봇이 읽고 해석한다. 여기서 깨달은 핵심이 있다 — 읽기와 해석을 분리한 것. 파일에서 텍스트를 뽑는 건 순수 코드로(토큰 0원), 그 내용을 해석하는 것만 AI가 한다. PDF가 아무리 길어도 읽는 비용은 공짜고, AI는 다 뽑아둔 내용을 볼 때만 불린다. 이미지(차트)는 추출이 안 되니 AI 비전으로 직접 보게 했다.
④ 그리고 API 함정과의 싸움. 자동매매에서 짐작은 곧 손실이라, "되겠지"로 넘기지 않고 실제 응답을 하나씩 찍어보며 확인했다. 실제로 부딪힌 것들:
토큰 발급에 횟수 제한이 있어서, 받아둔 토큰을 캐시하고 만료 직전에만 갱신해야 했다.
계정 이름이 화면에 보이는 것과 API상 실제 값이 달랐다 — 모르고 짜면 인증이 멀쩡한데도 거부된다.
모의 서버 특유의 빈 응답 — 당일 체결 내역이 어떤 조합으로 물어도 비어서, 체결 확인을 잔고 조회로 우회했다.
장 마감 후 주문은 정상적으로 거부된다는 것도, 에러가 아니라 정상 동작임을 응답으로 확인했다.
이런 함정은 문서엔 안 나온다. 실제로 호출해서 응답을 봐야 알 수 있고, 그게 자동매매에서 가장 중요한 습관이었다.
🎯 5막 — 가격을 예측하지 않는다, 신호로 판정한다
핵심 철학이 여기 있다. AI가 "오를 거예요"라고 예측하게 두지 않았다. 예측 모델은 왜 그 답이 나왔는지 설명이 안 되고, 틀려도 고칠 데가 없는 블랙박스다. 대신 명확한 룰 기반 신호로 판정하게 했다 — 각 신호는 "왜 샀는지"가 한 줄로 설명된다.
매수 신호는 한 종류가 아니라 여러 갈래로 두고, 하나라도 걸리면 후보로 본다:
추세 신호 — 이동평균 정배열 + 과매수 아님(추세를 타되 꼭지는 피함)
저점 반등 신호 — 여러 기간의 순위지표(RCI 9·13·18·26선)가 동시에 바닥(-80 이하)에 모임. 과매도가 여러 시간축에서 겹칠 때가 반등 타점
추세 초입 신호 — 골든크로스(단기가 장기를 막 돌파) + 장기 정배열 + 과열 아님
수급 확인 — 외국인 순매수 동향으로 "돈이 실제로 들어오는지" 거름
여기서 중요한 건, 여러 신호를 OR로 넓게 잡되 둘 이상 겹치면 "강력 추천"으로 표시한 것. 처음부터 "이 신호 AND 저 신호"로 좁히면 후보가 거의 안 나온다. 그래서 넓게 사두고, 나중에 어떤 조합이 진짜 강했는지를 데이터로 가려 좁히는 방향을 택했다. (이게 6막 복기로 이어진다.)
전략도 하나가 아니라 여러 개를 동시에 굴렸다:
박스권 전략 — 횡보장에서 밴드 하단 매수 / 상단 매도. 단, "상단 닿으면 무조건 매도"가 아니라 돌파하면 트레일링(고점 따라가다 꺾이면 매도)으로 더 먹게
신호 전략 — 위 신호들로 추세 초입을 잡아 매수
일일 전략 — 대형주 워치리스트 기반 보수형