본문 바로가기

주섬주섬

포트폴리오 + 뉴스 브리핑 텔레그램 봇 만들기

들어가며

매일 아침 미국 주식 앱을 켜서 보유 종목을 하나하나 확인하는 게 귀찮았다.

그래서 Claude Code랑 대화하면서 하루 만에 자동화 봇을 만들었다.

지금은 두 가지 알림이 매일 자동으로 텔레그램으로 날아온다.

  1. 포트폴리오 리포트 — 미장 마감 후, 보유 종목별 전일대비·평단가대비 수익률과 전체 손익금액(원화 포함)
  2. 뉴스 브리핑 — 매일 아침 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 등 복잡한 인증 과정이 없음 — 봇 토큰 하나로 끝
  • 봇이 보내는 메시지는 별도 채팅방으로 와서 푸시 알림이 확실히 옴
  • 토큰 만료/갱신 개념 자체가 없음

아침 뉴스 브리핑

포트폴리오 알림만으로는 성에 안 차서, 보유 종목과 시장 전반 뉴스를 요약해주는 기능도 추가했다. 구조는 간단하다.

  1. Google News RSS로 시장 전반 뉴스("US stock market")와 보유 종목별 뉴스("{ticker} stock") 헤드라인 수집 — API 키 불필요, URL 요청만으로 XML 파싱
  2. 수집한 헤드라인들을 Claude API(claude-haiku-5-5)에 넣어서 한국어 아침 브리핑으로 요약
  3. 텔레그램으로 전송

매일(주말 포함) 아침 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에 공개해 두었다.

https://github.com/mingkyyy/us-stock-kakao-alert