편찌

OpenClaw + 로컬 LLM으로 텔레그램 주식 뉴스 자동 알림 봇 만들기 (월 비용 $0)

매일 아침 출근 전에 주식 뉴스를 챙겨보는 건 솔직히 귀찮다. 네이버 증권 켜고, 야후 파이낸스 들어가고, 환율 확인하고… 이걸 하루에 여러 번 반복해야 한다. 그래서 아예 AI가 자동으로 시장을 분석해서 텔레그램으로 보내주는 시스템을 만들었다. 클라우드 API 비용 한 푼 안 들이고, 내 맥북에서 로컬 LLM을 돌려서 월 운영비 $0으로 굴리고 있다.

이 글에서는 OpenClaw(AI 게이트웨이) + LMStudio(로컬 LLM) + 텔레그램 봇을 조합해서 주식/뉴스 자동 알림 시스템을 구축한 전 과정을 공유한다. Docker 설정부터 크론잡 스케줄링, 삽질 과정, 그리고 실제 운영하면서 느낀 점까지 다 담았다.

완성된 시스템 구조

전체 아키텍처를 먼저 보자:

[LMStudio (로컬)] ←→ [OpenClaw (Docker)] ←→ [Telegram Bot] → [@stocknews_jr 채널]
  Qwen3.5-122b        Gateway + Cron         @newsking123bot     구독자에게 전달
  6bit (100GB)         localhost:18789
  MacBook Pro          KST 타임존

크게 세 가지 컴포넌트로 구성된다:

  • LMStudio: 맥북에서 Qwen 3.5 122B 모델을 로컬로 돌린다. OpenAI 호환 API를 제공하기 때문에 기존 OpenAI 클라이언트 코드를 그대로 갖다 쓸 수 있다.
  • OpenClaw: Docker 기반 AI 게이트웨이. 크론잡으로 스케줄 관리하고, 웹 크롤링으로 실시간 데이터를 긁어온 뒤 LLM에게 분석을 시킨다. 에이전트 기반이라 복잡한 멀티스텝 작업도 알아서 처리한다.
  • 텔레그램 봇: 분석이 끝나면 결과를 채널로 자동 전송. 구독자는 폰 알림만 확인하면 된다.
텔레그램 stocknews_jr 채널에서 KOSPI KOSDAQ 주식 브리핑이 자동으로 발송되는 화면
텔레그램 @stocknews_jr 채널 — KOSPI/KOSDAQ 개장 현황, 외국인/기관 수급, 환율, 미국 시장 영향 분석이 자동 발행된다

왜 로컬 LLM을 선택했는가

처음에는 당연히 GPT-4나 Claude API를 쓸 생각이었다. 근데 계산기를 두드려보니 비용이 만만치 않았다.

하루에 크론잡이 13개 돌아간다. 각 잡마다 웹 크롤링 데이터를 프롬프트에 넣고 분석 리포트를 생성하면, 입출력 토큰이 상당하다. GPT-4o 기준으로 대충 계산해봐도 월 $30~50은 나올 판이었다. Claude API도 비슷하거나 더 나온다.

반면 로컬 LLM은 초기에 맥북 메모리만 충분하면 추가 비용이 전혀 없다. M시리즈 맥북의 통합 메모리 덕분에 100GB짜리 모델도 돌릴 수 있고, 속도도 꽤 쓸 만하다. 24시간 돌려도 전기세 약간 더 나오는 수준이다.

LMStudio 세팅

LMStudio는 로컬 LLM을 GUI로 관리할 수 있는 앱이다. 모델 다운로드, 서버 실행, 파라미터 조정을 클릭 몇 번으로 할 수 있어서 편하다.

LMStudio 앱에서 Qwen 3.5 122B 모델을 로컬 서버로 실행하고 있는 Developer 화면
LMStudio Developer 모드 — Qwen 3.5 122B 모델이 로컬 API 서버로 서빙되고 있다

내가 사용하는 모델 스펙:

  • 모델: qwen3.5-122b-a10b@6bit — MoE(Mixture of Experts) 아키텍처라서, 122B 파라미터 중 실제 활성화되는 건 10B 수준이다. 덕분에 크기 대비 추론 속도가 빠르다.
  • 양자화: 6bit (MLX 포맷) — 모델 파일 크기가 약 100GB. M시리즈 맥북 128GB 모델이면 넉넉하다.
  • 컨텍스트 윈도우: 262,144 토큰 — 웹 크롤링 데이터를 통째로 넣어도 넘치지 않는다.
  • 지원 기능: Vision, Tool Use, Reasoning 모두 가능
  • API 엔드포인트: http://192.168.0.72:1234/v1/chat/completions — OpenAI 호환이라 어디서든 호출 가능

처음에 4bit 양자화로 시작했는데, 분석 리포트의 논리적 일관성이 떨어지고 가끔 헛소리를 하길래 6bit으로 올렸다. 메모리는 더 먹지만 답변 품질이 확실히 달라졌다. 특히 숫자 해석이나 시장 영향 분석에서 4bit과 6bit의 차이가 체감된다.

OpenClaw — Docker 기반 AI 게이트웨이

OpenClaw는 AI 에이전트를 위한 오픈소스 게이트웨이다. Docker 컨테이너로 돌리는데, 이게 핵심 역할을 한다:

  • 크론잡 스케줄링: 시간대별로 다른 분석 작업을 자동 실행
  • 웹 크롤링: web_fetch로 네이버 금융, 야후 파이낸스 등에서 실시간 데이터 수집
  • 에이전트 오케스트레이션: 수집한 데이터를 LLM에 전달하고, 분석 결과를 텔레그램으로 전송하는 전 과정을 자동 관리
  • 텔레그램 채널 연동: 봇 API를 통해 분석 결과를 자동 발송

Docker Compose 설정

OpenClaw를 띄우는 건 Docker Compose 한 줄이면 된다. 내가 쓰고 있는 설정에서 중요한 부분만 뽑으면:

# docker-compose.yml 핵심 부분
services:
  openclaw-gateway:
    image: alpine/openclaw:latest
    ports:
      - "18789:18789"
    environment:
      - OPENCLAW_TZ=Asia/Seoul    # 이게 없으면 크론잡이 UTC로 돌아감
    volumes:
      - ~/.openclaw:/data

OPENCLAW_TZ=Asia/Seoul은 반드시 넣어야 한다. 안 넣으면 크론잡 시간이 전부 9시간 어긋나서 새벽 6시 리포트가 오후 3시에 온다.

Docker로 돌릴 때 불편한 점들

솔직히 Docker로 돌리는 게 마냥 편하지만은 않다:

  1. 맥북 재시작 시 자동 실행 문제 — Docker Desktop이 로그인 시 자동 시작되도록 설정해도, 컨테이너가 항상 자동으로 올라오는 건 아니다. restart: unless-stopped 옵션을 넣어도 가끔 Docker Desktop 자체가 늦게 뜨면 컨테이너도 늦게 올라온다. macOS 업데이트 후에는 Docker Desktop을 수동으로 한번 켜줘야 하는 경우도 있다.
  2. 로컬 네트워크 접근 — Docker 컨테이너 안에서 호스트 맥의 LMStudio(localhost:1234)에 접근하려면 host.docker.internal을 써야 한다. 그냥 localhost 쓰면 컨테이너 자기 자신을 가리키니까 연결이 안 된다. 이거 처음에 몰라서 한참 헤맸다.
  3. 볼륨 마운트 권한~/.openclaw 폴더를 마운트하는데, macOS에서 Docker가 파일 접근 권한을 요구할 때가 있다. 특히 시스템 설정에서 “전체 디스크 접근”을 Docker에 허용해줘야 하는 경우가 있다.
  4. 리소스 점유 — Docker Desktop 자체가 메모리를 꽤 먹는다. LMStudio도 100GB 쓰는 상황에서 Docker까지 돌리면 128GB 맥북이어도 여유가 빠듯할 때가 있다. 특히 Xcode나 다른 무거운 앱을 같이 쓸 때 스왑이 발생하면 LLM 추론 속도가 눈에 띄게 느려진다.
  5. 로그 확인이 번거로움 — 크론잡이 실패해도 조용히 넘어가는 경우가 있다. docker logs를 주기적으로 확인하거나, OpenClaw 웹 대시보드에서 직접 확인해야 한다. 알림이 안 왔는데 왜 안 왔는지 모르는 상황이 가끔 생긴다.

그래도 Docker의 장점이 훨씬 크다. 환경 격리가 되니까 맥 시스템을 더럽히지 않고, 버전 업데이트도 이미지만 바꾸면 된다. 문제가 생기면 컨테이너 지우고 다시 띄우면 끝이다.

Cron Jobs 설정

OpenClaw의 핵심 기능은 크론잡이다. 웹 대시보드에서 잡을 추가하고, 프롬프트를 설정하면 정해진 시간에 자동으로 실행된다.

OpenClaw 웹 대시보드에서 Cron Jobs 설정 화면 크론잡 스케줄링
OpenClaw 웹 대시보드 — 평일 기준 13개의 크론잡이 KST 타임존으로 스케줄링되어 있다

하루 스케줄 (평일 기준)

평일에는 총 13개의 크론잡이 돌아간다. 각 잡마다 역할이 다르다:

시간 잡 이름 내용
06:00 글로벌 마감 리포트 미국/유럽 마감 상세, 섹터별 분석, VIX 지수, 한국 시장 영향 전망 (멀티파트)
07:00 프리마켓 전망 KOSPI 갭 예상, 주목 섹터/종목, 수급 흐름, 투자전략 제안 (멀티파트)
08:00 아침 브리핑 전일 주요 뉴스 + 미국장 마감 + 원자재/환율 요약
09:00 개장 브리핑 KOSPI/KOSDAQ 시가, 외국인/기관 초반 동향
10:00 오전 업데이트 아시아 시장 + 한국 오전장 흐름 + 유럽 프리마켓
12:00 점심 업데이트 오전장 중간 정리 + 오후 전망
15:00 오후 업데이트 미국 프리마켓 움직임 + 한국 오후장
15:40 마감 정리 KOSPI/KOSDAQ 마감 수치 + 수급 최종 정리
17:00 하루 종합 일일 시장 종합 리뷰 + 내일 전망
20:00 유망종목 탐색 실적/수급/차트 기반 국내 유망 종목 심층 분석
매 2시간 긴급 모니터링 주요 지수 ±3% 이상 변동 감지 시 즉시 알림
토 10:00 주간 복기 주중 시장 흐름 복기 및 교훈 정리
일 18:00 주간 전망 주간 종합 리뷰 + 다음주 투자 전략

특히 06:00과 07:00 리포트는 멀티파트로 발송된다. 텔레그램 메시지 하나에 4,000자 제한이 있어서, 긴 분석 리포트는 자동으로 여러 메시지로 나눠서 보낸다.

데이터 수집 전략 — web_fetch vs web_search

OpenClaw에서 데이터를 수집하는 방법은 크게 두 가지다:

1순위: web_fetch (직접 크롤링)

web_fetch는 URL을 직접 지정해서 페이지 내용을 긁어오는 방식이다. Gemini API 쿼타를 사용하지 않기 때문에 무제한으로 쓸 수 있다.

  • 한국 주식: finance.naver.com/sise/ → KOSPI/KOSDAQ 실시간 지수
  • 한국 뉴스: finance.naver.com/news/mainnews.naver → 증시 관련 최신 뉴스
  • 미국 주식: finance.yahoo.com → S&P 500, 나스닥, 다우존스
  • 환율/원자재: finance.naver.com/marketindex/ → 원/달러, WTI 유가, 금 시세
  • 글로벌 지수: investing.com/indices/major-indices → 전 세계 주요 지수

2순위: web_search (Gemini 웹 검색)

OpenClaw에는 Gemini API를 통한 웹 검색 기능이 있다. 그런데 무료 티어가 일 20회로 제한되어 있다. 하루 13개 잡이 돌아가니까 잡당 1.5회밖에 못 쓴다. 그래서 정말 필요할 때만 아껴서 사용한다. 대부분의 데이터는 web_fetch로 커버 가능하다.

프롬프트에 이런 식으로 지시를 넣어놨다:

데이터 수집 방법 (반드시 따르세요):
1단계: 아래 사이트에서 직접 데이터를 크롤링하세요 (Gemini 쿼타를 사용하지 않음)
- web_fetch('https://finance.naver.com/sise/') → KOSPI/KOSDAQ
- web_fetch('https://finance.yahoo.com/') → S&P 500, 나스닥
⚠️ web_search 사용 금지! 일일 쿼타(20회)가 매우 적으므로 절대 사용하지 마세요.
web_fetch만으로 충분합니다.

텔레그램 봇 연동

텔레그램 봇은 @BotFather를 통해 만들었다. 봇 이름은 @newsking123bot이고, 이 봇이 @stocknews_jr 채널에 메시지를 보내는 구조다.

OpenClaw에서 텔레그램 연동할 때 주의할 점이 있다:

  • 채널 ID는 숫자로@stocknews_jr 같은 유저네임이 아닌, -1003522237329 같은 숫자 ID를 써야 한다. OpenClaw가 유저네임 방식을 제대로 처리 못 하는 경우가 있다.
  • 봇을 채널 관리자로 — 봇이 채널에 메시지를 보내려면 관리자 권한이 필요하다. 채널 설정에서 봇을 관리자로 추가하고 “메시지 보내기” 권한을 줘야 한다.
  • 멀티파트 발송 — 긴 리포트는 4,000자 단위로 자동 분할해서 연속 발송된다. 프롬프트에 “메시지가 길면 여러 파트로 나눠서 보내라”고 지시해놨다.

삽질한 것들 (트러블슈팅)

처음부터 한 번에 된 건 하나도 없다. 솔직히 삽질이 더 재밌었다:

1. 타임존 지옥

Docker 컨테이너는 기본적으로 UTC 시간대를 사용한다. 그래서 크론잡을 0 8 * * 1-5 (월-금 08:00)로 설정하면, 실제로는 KST 17:00에 실행된다. 처음에 이걸 모르고 “왜 아침 브리핑이 저녁에 오지?” 하고 한참 헤맸다. OPENCLAW_TZ=Asia/Seoul 환경변수 한 줄로 해결.

2. 모델 양자화 삽질

4bit으로 시작했을 때 겪은 문제들:

  • “KOSPI가 어제 2% 상승했습니다”라고 크롤링 데이터에 있는데, 리포트에는 “KOSPI 하락세”라고 쓰는 경우
  • 환율과 유가 수치를 뒤바꿔서 분석하는 경우
  • 분석 도중 갑자기 맥락을 잃고 엉뚱한 얘기를 시작하는 경우

6bit으로 올리니까 이런 문제들이 대부분 사라졌다. 숫자 인식 정확도가 확실히 좋아졌고, 논리적 일관성도 크게 향상됐다.

3. Gemini API 쿼타 관리

무료 티어 일 20회는 정말 빠듯하다. 초반에 web_search를 잡마다 2~3회씩 쓰게 프롬프트를 짰더니, 오전 잡 몇 개 돌리고 나면 쿼타가 바닥나서 오후부터는 검색을 못 하는 상황이 발생했다. 그래서 전략을 완전히 바꿔서 web_fetch 크롤링 위주로 전환했다. web_search는 정말 예외적인 상황(속보, 긴급 뉴스 확인)에만 쓴다.

4. 컨텍스트 오버플로우

네이버 금융 페이지를 통째로 크롤링하면 HTML이 엄청 길다. 여러 사이트를 크롤링하면 컨텍스트 윈도우가 금방 찬다. LMStudio에서 TruncateMiddle 경고가 뜨면서 크롤링 데이터 중간 부분이 잘리는 문제가 있었다. 컨텍스트 윈도우를 262,144 토큰까지 확장해서 해결했다.

5. 한국어 출력 강제

Qwen 모델은 기본적으로 영어 위주다. 한국 주식 데이터를 넣어줘도 리포트를 영어로 쓰는 경우가 있었다. 프롬프트 맨 앞에 “반드시 한국어로만 작성하세요. 영어를 절대 사용하지 마세요.”라고 강제 지시를 넣어서 해결. 그래도 가끔 영어가 섞이긴 하지만, 90% 이상은 한국어로 잘 나온다.

6. 텔레그램 메시지 길이 제한

텔레그램은 메시지 하나에 4,096자까지만 보낼 수 있다. 새벽 글로벌 마감 리포트 같은 건 가볍게 6,000~8,000자가 넘는다. 그래서 프롬프트에 “4,000자가 넘으면 Part 1, Part 2… 로 나눠서 각각 별도 메시지로 전송하라”는 지시를 넣었다. 멀티파트 발송이 자연스럽게 동작한다.

실제 운영하면서 느낀 점

좋은 점

  • 시장 흐름 파악이 진짜 편해졌다 — 출근 전에 텔레그램 알림만 확인하면 전날 미국장, 당일 한국장 전망이 한눈에 들어온다.
  • 비용 $0 — 이게 가장 크다. 클라우드 API였으면 벌써 수십 달러 나갔을 것.
  • 커스터마이징 자유 — 프롬프트를 수정하면 분석 관점이나 포맷을 즉시 바꿀 수 있다. “반도체 섹터 위주로 분석해줘”라든지, “투자 전략 부분을 더 상세히”라든지.
  • 데이터 프라이버시 — 내 맥북에서 로컬로 돌아가니까 데이터가 외부로 나가지 않는다.

아쉬운 점

  • 맥북이 항상 켜져 있어야 한다 — 로컬 LLM이니까 당연하다. 맥북 덮으면 크론잡이 안 돌아간다. OpenClaw의 wakeMode: "now" 옵션으로 맥이 깨어났을 때 밀린 잡을 바로 실행하게 해놨지만, 실시간성은 떨어진다.
  • LLM 추론 속도 — GPT-4o나 Claude 3.5보다는 확실히 느리다. 긴 리포트 생성 시 2~3분 걸리는 경우도 있다. 하지만 크론잡이 자동으로 돌아가는 거라 체감상 불편하지는 않다.
  • 가끔 틀린 분석 — 로컬 LLM이 GPT-4o보다 분석 능력이 떨어지는 건 사실이다. 가끔 데이터를 잘못 해석하거나, 인과관계를 잘못 연결하는 경우가 있다. 참고용으로는 충분하지만, 이걸로 투자 결정을 내리면 안 된다.
  • Docker 리소스 — 앞서 말했듯이 Docker + LMStudio가 동시에 돌아가면 메모리 여유가 빠듯하다.

운영 비용 총정리

이게 제일 맘에 드는 부분이다:

항목 월 비용
LLM 추론 (LMStudio 로컬) $0
OpenClaw 게이트웨이 (Docker 셀프호스팅) $0
텔레그램 봇 API $0
Gemini 웹 검색 (무료 티어) $0
전기세 증가분 (추정) ~$3~5
실질 총 비용 ~$3~5/월

전기세를 빼면 사실상 $0이다. 같은 수준의 서비스를 GPT-4o API로 구축하면 월 $30~50, Claude API로 하면 월 $40~60 정도 나올 거다. 로컬 LLM의 최대 강점이 바로 이 부분이다.

이런 분들에게 추천한다

  • 매일 주식 뉴스를 챙겨보는데 직접 찾아보기 귀찮은 분
  • M시리즈 맥북(특히 64GB 이상)을 갖고 있는 분
  • Docker 사용에 익숙하거나, 배워볼 의향이 있는 분
  • AI API 비용을 절약하고 싶은 분
  • 로컬 AI를 활용해보고 싶은 개발자

M시리즈 맥북이 아니어도 가능하긴 한데, NVIDIA GPU + VRAM이 충분해야 한다. 로컬 LLM은 결국 하드웨어 투자 vs 클라우드 비용의 트레이드오프다.

텔레그램 채널 구독

현재 @stocknews_jr 채널에서 평일 하루 10회 이상, 주말에도 주간 정리/전망 리포트가 자동 발행되고 있다. KOSPI/KOSDAQ 지수, 외국인/기관 수급, 환율, 유가, 미국 시장 영향까지 한눈에 볼 수 있다.

관심 있으면 아래 QR 코드를 스캔하거나, 텔레그램에서 @stocknews_jr을 검색해서 구독하면 된다.

👉 텔레그램 채널 바로가기: https://t.me/stocknews_jr


텔레그램 stocknews_jr 채널 QR코드 주식뉴스 자동알림 구독
텔레그램 @stocknews_jr 채널 QR코드 — 스캔하면 바로 구독 가능

※ 본 채널의 정보는 투자 참고용이며, 투자 판단과 그에 따른 책임은 본인에게 있습니다.

댓글 1개

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다