1. 기획 배경
투자자라면 누구나 코스피의 현재 위치가 고점인지 저점인지 고민한다. 이때 가장 신뢰할 수 있는 지표 중 하나가 바로 PBR(주가순자산비율)이다. 하지만 국가통계포털에 매번 접속해 일일이 데이터를 확인하는 과정은 생각보다 번거롭고 지속하기 어렵다.
이러한 불편을 해결하고자 매일 장 마감 후, 종가 기준 PBR을 분석해 텔레그램으로 브리핑해 주는 'PBR 실시간 모니터링 챗봇'을 구축하기로 했다.
역사적인 월별 코스피 PBR 추이를 분석해 보면, PBR이 1.3을 초과할 때 시장은 고점 신호를 보냈고, 0.8 수준까지 내려오면 바닥을 다지는 저점 구간임을 확인할 수 있었다.
이 데이터를 객관적인 지표로 삼아, 감정에 휘둘리지 않는 시스템을 설계했다. 우선 이 '0.8(저점)과 1.3(고점)'이라는 명확한 수치를 기준점(Threshold)으로 설정하여 시장 상황을 실시간으로 감시하고 알림을 보내주는 챗봇을 구현했다.
2. 기술 스택 및 아키텍쳐
- Language: Python 3.10
- Library: FinanceDataReader (금융 데이터 수집), requests (텔레그램 전송)
- Infrastructure: GitHub Actions (Automation)
- Alarm: Telegram Bot API
3. 주요 구현 코드
import FinanceDataReader as fdr
import requests
import os
# 1. 환경 변수 로드 (GitHub Secrets 활용)
TOKEN = os.environ.get('TELEGRAM_TOKEN')
CHAT_ID = os.environ.get('TELEGRAM_CHAT_ID')
def send_message(text):
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage?chat_id={CHAT_ID}&text={text}"
requests.get(url)
# 2. 데이터 수집 및 로직 실행
try:
# 코스피 지수 데이터 수집
kospi_index = fdr.DataReader('KS11')
current_index = float(kospi_index['Close'].iloc[-1])
# 분석된 PBR 수치 (차트 기반 데이터 활용)
current_pbr = 1.35
message = f"현재 KOSPI 지수: {current_index:.2f}\n현재 예상 PBR: {current_pbr}\n\n"
# 3. 원칙에 따른 조건별 메시지
if current_pbr <= 0.8:
message += "🚨 [적극 매수] 저평가 구간입니다!"
elif current_pbr > 1.3:
message += "⚠️ [위험/매도] 역사적 고점 부근입니다. 수익 실현을 검토하세요."
else:
message += "✅ [관망] 정상 범위 내에 있습니다."
send_message(message)
except Exception as e:
send_message(f"에러 발생: {str(e)}")
- 네트워크 타임 아웃
- 데이터 무결성 확인
- 결측치 처리
- 최종 예외 처리
name: KOSPI PBR Monitor
on:
schedule:
- cron: '0 7 * * 1-5' # 월-금 한국시간 16:00
workflow_dispatch: # 수동 실행 버튼 활성화
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.10' }
- run: pip install finance-datareader requests
- run: python monitor.py
env:
TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
4. 결과 및 인사이트
실제 구축한 Workflow를 통해 실시간으로 텔레그램 알림이 도착하는 것을 확인했다. 이전에는 복잡한 통계 사이트에 직접 접속해 일일이 데이터를 찾아야 했지만, 이제는 내가 설정한 로직이 먼저 정보를 찾아 내 손안으로 가져다준다.
데이터 확인의 뎁스(Depth)를 줄이고 자동화한 것만으로도, 단순히 편리함을 넘어 시장 변화에 대응할 수 있는 '심리적 여유'를 얻을 수 있었다. 비효율적인 프로세스를 기술로 해결하는 과정을 통해, 데이터 기반의 의사결정을 돕는 제품(Product)이 사용자에게 줄 수 있는 가치가 무엇인지 깊이 체감한 소중한 경험이었다.
앞으로 코스피뿐만 아니라, 자산 가치 성장에 실질적인 도움이 되는 다양한 지표들을 이 자동화 프로세스에 이식하여 시스템을 더욱 정교하게 고도화해 나갈 계획이다.
5. 문제점 : 예상치 못한 차단, 그리고 기술적 피벗(Pivot)
| 최종 결과 화면 |
의욕 넘치게 시작했지만 곧바로 벽에 부딪혔다. KRX에서 데이터를 직접 가져오려고 보니 보안 정책상 깃허브 액션의 IP를 막아버린 것. 자동화를 하려다 오히려 프로세스가 멈춰버리는 위기였다.
결국 '안정성'을 최우선으로 두고 수집 경로를 아예 새로 짰다. '언젠가 또 막히겠지'라는 불안감을 안고 크롤링을 고집하기보다, 국가에서 제공하는 KOSIS Open API를 활용하기로 했다.
하지만 해결책 뒤에 또 다른 고민이 생겼다. 공공 API는 월별 단위로 제공되는 데다, 업데이트 시점도 말일 기준이라 당일의 실시간 지표를 즉시 반영하기엔 한계가 있었다.
이를 위해 장기적인 추이는 API로 분석하되, 당일의 정확한 수치는 사용자가 직접 검증할 수 있도록 원천 데이터 확인용 URL을 리포트에 포함시켰다.
또한 장 마감 후의 데이터를 관찰해보니, 당일 PBR 수치가 5시 전후로 업데이트되는 패턴을 확인할 수 있었다. 데이터가 완전히 확정되는 골든 타임을 고려해, 매일 오후 6시 5분에 가장 따끈따끈한 리포트를 받아볼 수 있도록 실행 스케줄을 조정하며 시스템을 안착시켰다.
0 댓글