파이썬으로 환율 주식 자동 수집과 슬랙 알림 만들기
"1,400원 넘으면 환전해야지." 이렇게 마음먹어 놓고, 정작 그 순간을 놓쳐본 적 있으세요? 저는 자주 그랬어요. 하루에도 몇 번씩 환율 앱을 켜서 확인하는데, 꼭 딴짓하는 사이에 목표가를 찍고 다시 내려가더라고요.
그래서 이런 생각을 하게 되는 거예요. 나 대신 시세판을 계속 지켜보다가, 조건이 맞는 순간에만 슬랙으로 톡 알려주는 비서가 있으면 얼마나 좋을까.
오늘 만들 게 딱 그거예요. 환율과 주가를 자동으로 수집하다가, 내가 정한 조건에 닿으면 슬랙으로 알림을 쏘는 봇. 그리고 지난 편에서 클라우드에 올리는 법까지 배웠으니까, 이 봇은 장난감이 아니라 내 노트북을 꺼도 24시간 도는 진짜 실전 봇이 될 거예요.
사실 새로 배우는 건 거의 없어요
여기서 중요한 걸 하나 말씀드릴게요. 오늘은 새 문법을 잔뜩 외우는 편이 아니에요. 오히려 그동안 따로따로 배운 부품들을 하나로 조립하는 편이에요.
그림으로 보면 이래요.
[수집] 환율·주가 가져오기 ← 16, 18에서 배운 API/크롤링
↓
[판단] 목표 조건에 맞나? ← 입문편의 if 하나
↓
[알림] 슬랙으로 쏘기 ← 지난 슬랙 편에서 만든 함수 재사용
↓
[반복] 정해진 시각마다 ← 23에서 배운 스케줄
↓
[기록] 로그로 남기기 ← 24에서 배운 로깅
레고 블록을 그동안 하나씩 사 모았잖아요. 크롤링 블록, 슬랙 블록, 스케줄 블록, 로깅 블록. 오늘은 설명서대로 그걸 하나의 완성품으로 끼우는 날이에요. 새로 사는 블록은 딱 하나, 주가를 가져오는 yfinance뿐이고요.
그러니까 중간에 낯선 게 나와도 겁먹지 마세요. 십중팔구 예전에 이미 해본 거예요.
환율 자동 수집: 무료 API로 원/달러 가져오기
첫 부품, 환율부터요. 방식은 16, 18에서 배운 거랑 똑같아요. requests로 주소를 부르고, 돌아온 JSON(파이썬 딕셔너리처럼 생긴 데이터 뭉치)에서 원하는 숫자 하나만 꺼내는 거예요.
import requests # 예전에 배운 그 라이브러리 그대로
# 키 없이 되는 무료 환율 API 주소를 부른다
응답 = requests.get("https://open.er-api.com/v6/latest/USD")
데이터 = 응답.json() # 돌아온 JSON을 파이썬 데이터로 변환
원달러 = 데이터["rates"]["KRW"] # 그 안에서 원/달러 값 하나만 꺼냄
print(f"현재 환율: 1달러 = {원달러:.2f}원")
# 실행 결과:
# 현재 환율: 1달러 = 1387.50원
포인트는 세 단계예요. 주소 부르기 → .json() → 대괄호로 값 꺼내기.
처음엔 데이터["rates"]["KRW"]처럼 대괄호를 파고드는 게 좀 막막하실 거예요. 그럴 땐 꺼내기 전에 print(데이터)로 통째로 한 번 찍어보세요. JSON 구조가 눈에 들어오면 "아, 여기 안에 rates가 있고 그 안에 KRW가 있구나" 하고 길이 보이거든요. 이 습관 하나면 KeyError로 헤맬 일이 확 줄어요.
주식 시세 크롤링, yfinance면 한 줄이면 돼요
주가는 사실 크롤링으로 직접 긁을 수도 있어요. 근데 초보한테는 번거롭고, 증권 사이트 구조가 자주 바뀌어서 코드가 금방 망가지거든요. 그래서 오늘의 유일한 새 부품, yfinance를 써요. 설치는 pip install yfinance 한 번이면 끝이에요.
import yfinance as yf # pip install yfinance 먼저 해두세요
def 주가_가져오기(티커):
종목 = yf.Ticker(티커) # 종목 하나를 지정
최근 = 종목.history(period="1d") # 최근 하루치 시세를 요청
현재가 = 최근["Close"].iloc[-1] # 가장 마지막 종가(≈현재가)
return 현재가
print("애플:", 주가_가져오기("AAPL")) # 미국 주식은 알파벳 약자
print("삼성전자:", 주가_가져오기("005930.KS")) # 국내 주식은 .KS 필수!
# 실행 결과:
# 애플: 231.4600067138672
# 삼성전자: 71200.0
여기서 꼭 짚고 갈 게 티커(종목마다 붙은 고유 약칭)예요. 미국 주식은 애플이 AAPL, 테슬라가 TSLA처럼 알파벳이에요. 근데 국내 주식은 숫자 코드에 접미사를 붙여요. 삼성전자는 005930.KS, 코스피는 .KS, 코스닥은 .KQ예요.
이 접미사 빼먹는 게 초보 1순위 실수예요. 삼성전자를 그냥 005930이나 삼성전자라고 넣으면 값이 텅 비어서 와요. 그 빈 값에서 가격을 꺼내려다 에러가 나고요. 저도 처음에 이걸로 한참 헤맸거든요.
그리고 하나 더. 이 값은 실시간 체결가가 아니에요. 무료 데이터라 몇 분 지연될 수 있어요. "지금 정확히 얼마"가 아니라 "대략 지금 이 정도"를 참고하는 용도라고 선을 그어두시는 게 마음 편해요.
조건이 맞으면 슬랙으로 — 알림 봇의 심장
수집했으면 이제 판단이에요. 여기가 봇에 지능이 생기는 지점인데, 문법은 입문편 그 if 하나가 전부예요. 부담 가지실 필요 전혀 없어요.
# 슬랙_알림() 함수는 지난 슬랙 편에서 만든 것을 그대로 가져와 씀 (여기선 호출만)
목표_환율 = 1400 # 관리하기 쉽게 맨 위에 변수로 빼둠
if 원달러 >= 목표_환율: # 조건 판단 — 익숙한 if 하나
슬랙_알림(f"[환율 알림] 1달러 = {원달러:.0f}원 (목표 {목표_환율} 돌파)")
else:
print("아직 목표에 못 미침 — 조용히 대기")
보시면 슬랙 함수를 새로 안 만들었죠. 지난 편에서 웹훅으로 메시지 쏘는 함수를 고생해서 만들어 뒀잖아요. 그걸 그냥 공구함에서 드라이버 꺼내듯 다시 꺼내 쓰는 거예요.
이게 함수로 쪼개두는 습관의 보상이에요. 한 번 잘 만든 함수는 다음 프로젝트에서 그대로 부품이 되거든요.
그리고 목표값을 코드 맨 위에 목표_환율 = 1400처럼 변수로 빼둔 것도 봐주세요. 나중에 목표를 1450으로 바꾸고 싶으면 숫자 하나만 고치면 돼요. 코드 여기저기 뒤질 필요가 없어요.
부품 조립하기: 파이썬 금융 자동화 봇 완성
이제 진짜 조립이에요. 각 부품을 함수로 나누고, 순서대로 부르는 한 바퀴를 만들고, 거기에 로깅과 스케줄을 얹으면 돼요.
import schedule, time, logging # 23의 스케줄, 24의 로깅
logging.basicConfig(filename="bot.log", level=logging.INFO,
format="%(asctime)s %(message)s")
def 봇_한바퀴():
try:
원달러 = 환율_가져오기() # 앞의 예제를 함수로 정리했다고 치고
logging.info(f"환율 확인: {원달러:.0f}원")
if 원달러 >= 목표_환율:
슬랙_알림(f"환율 {원달러:.0f}원 — 목표 돌파!") # 슬랙 함수 재사용
logging.info("슬랙 알림 발송")
except Exception as e: # 24에서 배운 안전장치
logging.error(f"실행 중 에러: {e}")
schedule.every().day.at("08:00").do(봇_한바퀴) # 매일 아침 8시 딱 한 번
while True:
schedule.run_pending()
time.sleep(60)
# 실행 후 bot.log 파일에 이렇게 쌓여요:
# 2026-08-26 08:00:01 환율 확인: 1405원
# 2026-08-26 08:00:02 슬랙 알림 발송
이 짧은 코드 안에서 다섯 부품이 다 만나고 있어요. 수집, 판단, 알림, 반복, 기록. 그동안 배운 게 여기서 하나로 합쳐지는 거예요. 뭔가 뭉클하지 않으세요?
try로 감싼 것도 봐주세요. API 서버가 잠깐 느리거나 인터넷이 끊기면 요청이 실패하는데, 봇이 거기서 죽으면 그날 알림을 통째로 놓쳐요. 그래서 24에서 배운 안전장치로 감싸고, 실패해도 로그에 남기고 넘어가게 한 거예요.
무한 알림 폭탄 막기 (실전에서 꼭 만나는 벽)
봇을 처음 돌리면 십중팔구 이걸 겪으실 거예요. 저도 그랬거든요. 슬랙이 쉴 새 없이 울려대는 거예요.
이유는 간단해요. 스케줄을 5분마다로 걸어두면, 조건이 참인 동안 5분마다 똑같은 알림이 계속 날아와요. 환율이 목표를 넘은 채로 하루 종일 있으면? 알림 폭탄이죠.
가장 쉬운 해법은 위 코드에 이미 들어 있어요. schedule.every().day.at("08:00"), 하루 딱 한 번만 실행하는 거예요. 아침에 한 번만 확인하고 알리니까 애초에 폭탄이 안 나요.
조금 더 자주 돌리고 싶으면 "이미 알림 보냄" 표시를 어딘가에 기억해뒀다가, 보낸 적 있으면 건너뛰게 하는 방법도 있어요. 이건 나중에 필요해지면 붙이시면 되고, 지금은 하루 한 번으로 충분해요.
이 데이터, 어디까지 믿어야 할까요
담백하게 짚고 갈게요. 무료 데이터는 실시간이 아니라 조금 지연될 수 있어요. 주식은 장이 열린 시간에만 값이 갱신돼서, 주말이나 새벽엔 마지막 종가가 계속 나와요. "왜 값이 안 변하죠?" 싶으면 대개 장이 닫혀서 그런 거예요.
그리고 이건 분명히 해둘게요. 이 봇이 주는 건 참고 정보일 뿐이에요. 실제로 사거나 파는 결정, 그리고 그 결과에 대한 책임은 전적으로 본인에게 있어요. 봇은 "조건 되면 알려줌"까지만 하는 거예요.
클라우드에 올리면 진짜 24시간
여기까지 만든 봇을 내 노트북에서 돌리면, 노트북을 끄는 순간 봇도 멈춰요. 근데 지난 편에서 클라우드에 올리는 법을 배웠잖아요. 이 코드를 그대로 그 서버에 올리면, 내가 잠든 사이에도 봇이 혼자 아침 8시에 일어나 환율을 확인하고 알림을 쏴요.
서버엔 화면이 없으니까 bot.log가 봇의 유일한 눈이에요. 로그를 열어보면 "언제 얼마였고 알림을 보냈는지"가 차곡차곡 쌓여 있을 거예요. 그걸 보는 순간, 봇이 나 없이도 혼자 일하고 있다는 게 실감 나거든요.
직접 해보실 차례예요
- 자기 관심 종목 1~2개랑 환율 1개로 조건을 정해 알림 봇을 만들어보세요. 목표값은 꼭 코드 맨 위에 변수로 빼두시고요.
- 순서가 중요해요. 먼저 한 바퀴만 수동으로 돌려서 슬랙에 메시지가 오는지 확인하세요. 그다음 스케줄로 "매일 아침 한 번"을 걸고, 여유 되면 클라우드에 올려 노트북을 꺼도 도는지 보세요.
힌트를 하나 드리면, 관심 종목을 여러 개 관리하고 싶을 땐 딕셔너리가 딱이에요.
관심종목 = {"AAPL": 200, "005930.KS": 70000} # 티커: 목표가(이하면 알림)
for 티커, 목표 in 관심종목.items():
가격 = 주가_가져오기(티커)
if 가격 <= 목표:
슬랙_알림(f"{티커} 현재가 {가격:.0f} — 목표 {목표} 이하 도달!")
종목을 늘려도 반복문은 그대로예요. 딕셔너리에 한 줄만 추가하면 되거든요.
오늘 만든 환율·주식 봇도 결국은 부품들의 조립이었잖아요. 다음 편에서는 이 조립을 한 단계 더 키워볼 거예요. 그동안 배운 걸 전부 쏟아부어서, 출근하면 책상에 보고서가 와 있는 시스템을 만드는 졸업 작품이에요. 이번 편이 그 마지막을 향한 마지막 워밍업인 셈이죠.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 26. 파이썬 자동화 봇 24시간 돌리기 (무료 클라우드 호스팅) (0) | 2026.08.18 |
|---|---|
| [Python] 25. 파이썬 Pillow로 이미지 일괄 처리하기 (리사이즈와 워터마크) (0) | 2026.08.14 |
| [Python] 24. 파이썬 로깅과 에러 알림: 봇이 죽지 않게 지키기 (0) | 2026.08.13 |
| [Python] 23. 파이썬 스케줄링: schedule 모듈로 정기 실행하기 (0) | 2026.08.10 |
| [Python] 22. 파이썬으로 AI 문서 요약과 번역 봇 만들기 - 긴 문서도 통째로 (0) | 2026.08.07 |