들어가며
매일 아침 미국 주식 앱을 켜서 보유 종목을 하나하나 확인하는 게 귀찮았다.
그래서 Claude Code랑 대화하면서 하루 만에 자동화 봇을 만들었다.
지금은 두 가지 알림이 매일 자동으로 텔레그램으로 날아온다.
- 포트폴리오 리포트 — 미장 마감 후, 보유 종목별 전일대비·평단가대비 수익률과 전체 손익금액(원화 포함)
- 뉴스 브리핑 — 매일 아침 7시 30분(출근 시간), 미국 증시 전반과 보유 종목 관련 뉴스 요약
이 글은 그 과정에서 거친 선택들과 삽질한 지점들을 정리한 기록이다.
아키텍처
두 스케줄러가 같은 텔레그램 봇으로 모인다

미장 마감 후엔 yfinance로 주가를 받아 손익을 계산하고, 매일 아침엔 Google News RSS를 모아 Claude API로 요약한다. 실행 시각과 데이터 경로는 서로 다르지만 둘 다 같은 Telegram Bot API를 거쳐 한 사람(ME!)에게 도착한다.
포트폴리오 리포트
yfinance(비공식 파이썬 라이브러리)로 종목별 현재가와 전일종가를 가져와서 계산한다. API 키가 필요 없다는 게 큰 장점이다.
- 종목별: 전일 대비 수익률, 평단가 대비 수익률
- 전체: 총 평가금액(달러 + 원화 환산), 전일 대비/평단가 대비 손익 금액
- 전일 대비 ±5% 이상 움직인 종목은 ⚠️ 표시하고 리스트 아래로 정렬
매일 미장 마감 후(평일, 한국시간 새벽 5~6시) 이런 메시지가 온다.
📊 2026-10-16 (금) 미장 마감 포트폴리오 리포트
AAPL: $343.46 (전일 +0.43% / 평단가 +23.05%)
GOOGL: $340.59 (전일 -2.47% / 평단가 -2.16%)
⚠️ QLD: $87.72 (전일 -5.02% / 평단가 -6.06%)
💰 총 평가금액: $6,142.35 (₩8,166,868)
전일 대비: -3.04% (-₩255,642)
평단가 대비: +2.51% (+₩199,682)
평단가 대비 수익률은 환율 변동을 반영하지 않고 순수 달러 주가 변동만 반영한다—증권사 앱에서 보는 원화 환산 손익률과 조금 다를 수 있다는 걸 나중에 알게 됐다.
카카오톡에서 텔레그램으로 갈아탄 이유
처음에는 카카오톡 "나에게 보내기"(self memo) API로 시작했다. 카카오 디벨로퍼스에 앱 등록하고, OAuth로 Refresh Token 발급받고, GitHub Actions에서 매번 Access Token을 갱신하는 구조로 구현했다.
문제는 완성된 다음에 터져나왔다: "나와의 채팅" 방은 알림(푸시)이 잘 안 온다. 아침에 조용히 앱을 열어봐야 메시지가 와 있는지 알 정도로 두고도 알림이 없었다. 자동화 알림의 존재 이유가 "바로 알 수 있음"인데, 그게 안 되니 의미가 없었다.
그래서 Telegram Bot API로 전체 교체했다. 장점이 명확했다:
- OAuth, Refresh Token, Client Secret 등 복잡한 인증 과정이 없음 — 봇 토큰 하나로 끝
- 봇이 보내는 메시지는 별도 채팅방으로 와서 푸시 알림이 확실히 옴
- 토큰 만료/갱신 개념 자체가 없음
아침 뉴스 브리핑
포트폴리오 알림만으로는 성에 안 차서, 보유 종목과 시장 전반 뉴스를 요약해주는 기능도 추가했다. 구조는 간단하다.
- Google News RSS로 시장 전반 뉴스("US stock market")와 보유 종목별 뉴스("{ticker} stock") 헤드라인 수집 — API 키 불필요, URL 요청만으로 XML 파싱
- 수집한 헤드라인들을 Claude API(claude-haiku-5-5)에 넣어서 한국어 아침 브리핑으로 요약
- 텔레그램으로 전송
매일(주말 포함) 아침 7시 30분에 이런 메시지가 온다.
📰 오늘의 미국 증시 브리핑
📉 시장 전반
- 나스닥은 금요일 2% 하락하며 6월 이후 최악의 주간 성적을 기록했어요...
🍎 AAPL
- 아이폰 신제품 사전 주문이 순식간에 매진되며 주가가 사상 최고치를 기록했어요...
구현 중 가장 기억에 남는 버그가 하나 있었다 — 바로 아래 트러블슈팅 항에서 다룬다.
삽질의 기록
실제로 가장 시간이 걸린 건 구현이 아니라 디버깅이었다.
문제원인해결
| 카카오 "등록하지 않은 Redirect URI" 에러 | Redirect URI 등록 위치를 잘못 찾음 — "카카오 로그인" 메뉴가 아니라 [앱] > [플랫폼 키] > REST API 키 화면 안에 있었음. "로그아웃 리다이렉트 URI"랑도 헷갈림 | 정확한 위치를 찾아서 등록 |
| 토큰 요청 시 401 에러 | REST API 키에 클라이언트 시크릿이 기본 활성화되어 있어서, client_secret 없이는 토큰 발급이 거부됨 | 요청에 client_secret 추가 |
| refresh_token 400 에러 (KOE322) | GitHub Secret에 토큰을 붙여넣는 과정에서 일부가 누락됨 | 토큰 재발급 후 전체 값 다시 복사 |
| 뉴스 요약이 빈 응답으로 돌아옴 (KeyError: 'text') | claude-haiku-5-5가 기본적으로 extended thinking을 써서, max_tokens를 생각(thinking) 토큰으로 다 써버리고 답변 텍스트를 못 씀 | 요청에 "thinking": {"type": "disabled"} 추가 |
마지막 건 가장 헷갈렸던 버그였다 — API는 200 OK를 반환했는데 content 배열의 첫 블록이 text가 아니라 thinking 타입이라서, 응답이 끝까지 안 온다는 걸 알기까지 시간이 걸렸다.
마무리
AI와 대화하면서 진행하니 아키텍처 설계부터 API 연동, 에러 디버깅까지 하루 만에 끝낼 수 있었다. 특히 카카오 개발자 콘솔처럼 문서가 복잡한 곳은 실제 콘솔 화면을 함께 보면서 한 단계씩 디버깅하는 게 훨씬 빨랐다.
앞으로 추가하고 싶은 것:
- 뉴스 브리핑 요약 품질 개선 (종목별 중요도 가중치 등)
- 다른 관심사(중고거래 득템, 환율 알림 등)로 같은 구조 확장
전체 코드는 GitHub에 공개해 두었다.
'주섬주섬' 카테고리의 다른 글
| 텔레그램 명령어로 포트폴리오 관리하기 (Vercel webhook 삽질기) (0) | 2026.10.19 |
|---|