자동화

나만의 마켓 뉴스 브리핑 봇 만들기


이 글의 목차
  1. 왜 직접 만들기로 했나
  2. 첫 설계는 발송자 분리였다
  3. DM 전송기는 작게 만들었다
  4. 브리핑은 하루 세 번으로 나눴다
  5. 가장 크게 바뀐 기준은 KRX였다
  6. 채널이 아니라 DM이어야 했다
  7. 미국장은 배경으로만 둔다
  8. 조심해야 할 점
  9. 다음에 개선하고 싶은 것
  10. 작은 자동화는 운영하면서 완성된다

매일 시장 뉴스를 확인하는 일은 중요하지만, 매번 직접 찾아보는 과정은 생각보다 번거롭다. 뉴스는 너무 많고, 제목만 봐서는 실제로 시장에 영향을 줄 내용인지 바로 판단하기 어렵다. 그래서 내가 보고 싶은 마켓 뉴스를 자동으로 모아 Discord DM으로 보내주는 작은 브리핑 봇을 만들기 시작했다.

처음 목표는 단순했다. 내가 확인하고 싶은 시점에 필요한 뉴스를 정리해서 받아보는 것. 그런데 실제로 운영해 보니, 단순히 “뉴스를 보내는 봇”만으로는 부족했다. 언제 보내야 하는지, 어느 시장을 기준으로 판단해야 하는지, 휴장일에는 어떻게 멈춰야 하는지까지 정해야 했다.

결국 이 봇은 단순 DM 발송기에서 시작해, 한국장 투자자 기준으로 장전·장중·장마감 브리핑을 나눠 보내는 개인용 시장 브리핑 자동화로 바뀌었다.

만들고 나서 가장 크게 남은 기준은 세 가지다. 알림은 개인 DM으로 보내고, 일정은 KRX 정상 개장일을 기준으로 판단하며, 브리핑 안에서는 사실·해석·시장 반응·리스크를 섞지 않는 것. 이 기준이 잡히고 나서야 봇이 단순 요약기가 아니라 실제로 매일 쓸 수 있는 도구에 가까워졌다.

왜 직접 만들기로 했나

시장 뉴스는 공개된 정보가 많다. 포털 뉴스, 증권사 리포트, 공시, 경제지 속보, 해외 매체, 커뮤니티 요약까지 소스는 넘친다. 문제는 소스가 부족한 게 아니라 너무 많다는 점이다.

아침에 뉴스를 훑다 보면 비슷한 제목이 반복되고, 이미 전날 반영된 뉴스와 오늘 새로 나온 뉴스가 섞인다. 어떤 기사는 개별 종목 이야기처럼 보이지만 실제로는 업종 전체에 영향을 줄 수 있고, 어떤 기사는 제목은 커도 시장 반응은 크지 않을 수 있다.

내가 매번 하던 일은 대략 이런 흐름이었다.

  • 오늘 한국장 일정과 휴장 여부를 확인한다.
  • 전날 미국장과 해외 이슈가 한국장에 줄 영향을 본다.
  • 국내 주요 뉴스, 공시, 정책 이슈를 훑는다.
  • 이미 반영된 뉴스와 다음 거래일로 넘어갈 뉴스를 나눈다.
  • 장중에는 오전장 움직임과 오후 체크포인트를 다시 본다.
  • 장마감 후에는 오늘 반영된 이슈와 다음 거래일 리스크를 정리한다.

이 과정은 매일 반복된다. 반복된다는 건 자동화 후보라는 뜻이다. 다만 전부 자동화하려고 하면 일이 너무 커진다. 그래서 처음에는 “내가 매번 같은 형식으로 정리하는 부분”만 봇에게 맡기기로 했다.

첫 설계는 발송자 분리였다

처음 고민은 “누가 보내는 것처럼 보이게 할 것인가”였다. 기존 OpenClaw cron으로도 메시지는 보낼 수 있지만, 대화형 봇과 시장 브리핑이 섞이면 알림의 성격이 흐려진다. 그래서 별도 Discord 뉴스 봇을 만들고, OpenClaw는 브리핑 생성과 스케줄 관리를 맡으며, 최종 발송만 뉴스 봇 계정으로 분리하는 구조를 선택했다.

처음 검토한 선택지는 세 가지였다.

  • 기존 OpenClaw가 그대로 DM을 보낸다.
  • 별도 Discord 봇 토큰을 만들어 뉴스 봇이 DM을 보낸다.
  • 비공개 브리핑 채널을 만들고 그 채널에만 발송한다.

최종적으로는 두 번째를 골랐다. DM은 내가 이미 확인하는 흐름에 잘 맞고, 별도 뉴스 봇으로 보내면 알림의 용도도 명확해진다. 대신 토큰 보관, DM 실패 처리, 로그, 스케줄 운영 같은 관리 포인트가 생긴다.

그래서 토큰은 공개 채널이나 저장소에 두지 않고, 로컬 환경 변수로만 관리했다. 봇은 필요한 권한만 부여해 서버에 초대했고, 실제 발송은 DM 테스트를 먼저 거친 뒤 연결했다.

DM 전송기는 작게 만들었다

초기 구현에서 봇이 맡은 가장 확실한 역할은 Discord DM 전송이었다. 시장 브리핑 내용을 만들고 나면, 별도 스크립트가 그 내용을 받아 개인 DM으로 보내는 구조다.

전송기의 역할은 단순하다.

  • 환경 변수에서 Discord 봇 토큰과 수신자 정보를 읽는다.
  • 표준 입력이나 실행 인자로 브리핑 본문을 받는다.
  • Discord DM 채널을 만든다.
  • 메시지가 길면 여러 조각으로 나눠 보낸다.
  • 전송 결과는 로그로 남긴다.

중요한 부분은 메시지 분할이었다. Discord 메시지에는 길이 제한이 있고, 시장 브리핑은 토픽이 많아지면 금방 길어진다. 그래서 문단 단위로 최대 길이를 넘지 않게 나누고, 그래도 긴 문단은 줄 단위로 다시 자른다. 작은 처리지만, 브리핑을 “보내는 데 성공했다”와 “읽기 좋게 도착했다”는 전혀 다른 문제였다.

function splitMessage(text, maxLength = 1800) {
  if (text.length <= maxLength) return [text];

  const chunks = [];
  const paragraphs = text.split(/\n{2,}/);
  let current = "";

  for (const paragraph of paragraphs) {
    const next = current ? `${current}\n\n${paragraph}` : paragraph;
    if (next.length <= maxLength) {
      current = next;
      continue;
    }

    if (current) chunks.push(current);

    const lines = paragraph.split(/\n/);
    current = "";
    for (const line of lines) {
      if (line.length > maxLength) {
        if (current) chunks.push(current);
        current = "";

        for (let index = 0; index < line.length; index += maxLength) {
          chunks.push(line.slice(index, index + maxLength));
        }
        continue;
      }

      const candidate = current ? `${current}\n${line}` : line;
      if (candidate.length <= maxLength) {
        current = candidate;
        continue;
      }

      if (current) chunks.push(current);
      current = line;
    }
  }

  if (current) chunks.push(current);
  return chunks;
}

코드 자체는 어렵지 않다. 하지만 이런 작은 처리가 실제 사용감에는 꽤 중요했다. 긴 브리핑이 중간에 잘리거나, 메시지 순서가 이상해지거나, 매번 수동으로 복사해서 보내야 한다면 자동화의 의미가 줄어든다.

브리핑은 하루 세 번으로 나눴다

처음에는 하루 한 번 요약이면 충분할 것 같았다. 하지만 시장 브리핑은 시간대마다 필요한 정보가 다르다.

장전에는 전날 해외시장, 오늘 일정, 장전 시나리오가 중요하다. 장중에는 오전장 움직임과 오후로 넘어갈 뉴스가 중요하다. 장마감에는 오늘 반영된 뉴스와 다음 거래일 체크리스트가 중요하다.

그래서 브리핑을 세 가지 형태로 나눴다.

  • 장전 브리핑: 한국장 시작 전에 시장 배경, 주요 뉴스, 오늘 일정, 시나리오를 정리한다.
  • 장중 브리핑: 오전장 흐름과 오후에 계속 볼 이슈를 정리한다.
  • 장마감 브리핑: 오늘 반영된 뉴스, 업종·테마 흐름, 다음 거래일 체크리스트를 정리한다.

장마감 브리핑의 뼈대는 이런 식이다.

장마감 시장 브리핑 — YYYY-MM-DD

한 줄 결론: ...

시장 마감 지도
KOSPI: ...
KOSDAQ: ...
원/달러: ...
핵심 구도: ...
장중 특징: ...

━━━━━━━━━━━━━━━━━━━━
[토픽 제목]
중요도: 상/중/하
NEW / 지속: NEW 또는 지속
매체 구분: 국내 매체 / 해외 매체 / 국내+해외 / 공시 / 시장 데이터
발행/포착 시각: ...
핵심 내용: ...
장중/마감 반응: ...
기사별 차이점: ...
시장·산업 영향: ...

업종/테마 리뷰
...

다음 거래일 체크리스트
...

리스크 정리
...

이 형식의 핵심은 뉴스를 한 줄 요약으로 끝내지 않는 것이다. 같은 뉴스라도 새로 나온 내용인지, 기존 이슈의 연장인지, 시장 반응이 이미 있었는지, 다음 거래일로 넘어갈 만한지에 따라 읽는 방식이 달라진다. 브리핑은 정보를 많이 담는 것보다, 읽는 순서와 판단 기준을 고정해 주는 쪽에 더 가깝다.

가장 크게 바뀐 기준은 KRX였다

처음에는 “평일 아침이면 브리핑을 보내면 되겠지”에 가까웠다. 그런데 실제 운영 첫날부터 허점이 드러났다. 2026년 5월 25일은 한국 기준 부처님오신날 대체공휴일이자 KRX 휴장일이었다. 그런데 아침 브리핑이 나갔다.

이 사건 때문에 기준을 다시 잡았다.

나는 한국장을 기준으로 뉴스를 보기 때문에, 발송 스케줄과 휴장 판단도 KRX 기준이어야 한다. 미국장은 중요하지만 알림의 주체가 아니다. 한국장에 영향을 줄 수 있는 야간 배경 정보로 들어가면 충분하다.

그래서 브리핑 작업은 모두 시작 전에 KRX 정상 개장일인지 확인하도록 바꿨다.

  • 장전 브리핑도 KRX 정상 개장일일 때만 보낸다.
  • 장중 브리핑도 KRX 정상 개장일일 때만 보낸다.
  • 장마감 브리핑도 KRX 정상 개장일일 때만 보낸다.
  • 평일 휴장일에는 별도 휴장 안내 DM을 먼저 보낸다.
  • 주말 요약과 다음 주 체크도 채널이 아니라 뉴스 봇 DM으로 보낸다.

휴장 판정도 단순히 주말만 보면 안 된다. 한국장은 대체공휴일, 임시공휴일, 선거일, 설·추석 연휴, 연말 휴장, 신년 첫 거래일 시간 변경 같은 예외가 있다. 그래서 “평일이면 실행”이 아니라 “KRX 정상 개장일이면 실행”으로 기준을 바꾸는 것이 핵심이었다.

채널이 아니라 DM이어야 했다

운영 중 또 한 번 드러난 문제는 발송 위치였다. 주말 요약과 공휴일 체크 작업을 만들면서 일부 메시지가 DM이 아니라 채널에 올라간 적이 있었다. 이건 개인 브리핑 자동화의 목적과 맞지 않았다.

시장 브리핑은 개인 알림이다. 채널에 남길 내용이 아니라 내가 조용히 받아보고 판단할 내용이다. 그래서 일반 브리핑은 모두 뉴스 봇 DM으로 통일했고, 채널에는 실행 실패 같은 운영 알림만 남기는 방향으로 정리했다.

이 차이는 작아 보이지만 중요하다. 자동화는 “무엇을 할지”뿐 아니라 “어디에 나타날지”까지 맞아야 한다. 알림이 잘못된 공간에 나타나면 정보가 아니라 소음이 된다.

미국장은 배경으로만 둔다

한국장 기준으로 바꾸면서 미국장 처리도 다시 정의했다.

미국장은 한국장에 영향을 줄 수 있다. 전날 나스닥 흐름, 금리, 반도체 업종, 주요 빅테크 실적, 환율 움직임은 장전 배경으로 중요하다. 하지만 내가 기준으로 삼는 시장은 한국장이므로, 미국장 자체가 독립 알림의 기준이 되면 안 된다.

그래서 규칙을 이렇게 잡았다.

  • 제목, 스케줄, 발송 여부는 KRX 기준으로 판단한다.
  • 미국 휴장 여부만으로 별도 알림을 만들지 않는다.
  • 미국장은 장전 브리핑의 배경 정보로만 사용한다.
  • 한국장에 영향을 줄 수 있는 이슈만 추려서 다룬다.
  • 프롬프트 안에서도 “미국장 기준” 표현이 알림 트리거처럼 남지 않게 한다.

이 기준을 정하지 않으면 자동화가 엉뚱한 방향으로 똑똑해질 수 있다. 예를 들어 미국장이 휴장이라는 이유로 별도 알림을 보내거나, 한국 휴장일인데 해외 뉴스가 많다는 이유로 장전 브리핑을 보내는 식이다. 자동화에서 중요한 것은 많이 아는 것이 아니라, 내가 실제로 필요한 기준에 맞게 행동하는 것이다.

조심해야 할 점

시장 뉴스 자동화는 편하지만 조심할 점도 많다.

가장 큰 문제는 출처 확인이다. 브리핑이 그럴듯해도 직접 출처가 확인되지 않은 내용이면 제외하는 쪽이 낫다. 특히 시장 관련 내용은 틀린 정보가 들어가면 단순한 오타보다 영향이 크다.

두 번째는 투자 조언처럼 보이지 않게 하는 것이다. 이 봇은 “무엇을 사라”거나 “무엇을 팔라”고 말하는 도구가 아니다. 뉴스를 더 빨리 이해하기 위한 정리 도구다. 그래서 브리핑 문장에서도 매수·매도 지시처럼 보이는 표현은 피한다.

세 번째는 일정 기준이다. 장전·장중·장마감 브리핑은 모두 KRX 기준으로 움직여야 한다. 한국장이 쉬는 날에는 브리핑도 쉬어야 한다. 휴장 안내를 보낼 수는 있지만, 일반 시장 브리핑이 나가면 오히려 혼란스럽다.

네 번째는 발송 위치다. 개인 브리핑은 DM으로 가야 한다. 채널에는 실패 알림처럼 운영상 필요한 최소한만 남겨야 한다.

다음에 개선하고 싶은 것

지금 구조에서 더 좋아질 수 있는 부분은 많다.

먼저 KRX 휴장일 판정을 더 안정적으로 만들고 싶다. 정기 휴장일뿐 아니라 대체공휴일, 임시공휴일, 선거일, 연말 휴장 같은 예외를 계속 보강해야 한다.

두 번째는 중요도 필터링이다. 모든 뉴스를 길게 정리하면 결국 다시 정보 과부하가 온다. 중요도 상·중·하를 더 일관되게 매기고, 낮은 중요도는 과감하게 줄이는 기준이 필요하다.

세 번째는 관심 종목이나 관심 테마와 연결하는 것이다. 특정 업종이나 키워드가 반복해서 등장하면, 단순히 한 번의 뉴스로 끝내지 않고 며칠 동안 이어지는 흐름으로 보여줄 수 있다.

마지막으로는 브리핑 로그를 쌓아서 나중에 되돌아보는 기능도 생각 중이다. “그때 어떤 뉴스를 중요하게 봤고, 실제 시장은 어떻게 움직였는지”를 비교할 수 있으면 단순한 알림보다 더 의미 있는 도구가 될 것 같다.

작은 자동화는 운영하면서 완성된다

이번 마켓 뉴스 브리핑 봇을 만들면서 다시 느낀 것은, 자동화는 처음 설계보다 운영 중 발견한 예외를 반영하면서 좋아진다는 점이다.

처음에는 DM 전송만 되면 충분해 보였다. 하지만 실제로 써보니 발송자 분리, 메시지 길이 제한, 하루 세 번의 역할 분리, DM과 채널 구분, KRX 휴장일, 한국장과 미국장의 우선순위 같은 문제가 차례로 드러났다.

이런 문제는 문서상 설계만으로는 잘 보이지 않는다. 실제로 아침에 받아보고, 휴장일에 잘못 나간 것을 보고, 채널에 올라간 메시지가 어색하다는 것을 겪으면서 기준이 선명해진다.

결국 이 봇의 목적은 뉴스를 대신 판단해 주는 것이 아니다. 매일 시장을 보기 전에 책상 위를 정리해 주는 것에 가깝다. 알림은 조용히 개인 DM으로 오고, 일정은 KRX 기준으로 멈추거나 실행되고, 내용은 사실·해석·반응·리스크가 나뉘어 있어야 한다. 그 기준만 제대로 잡아도 하루의 시작은 꽤 가벼워진다.

댓글

불러오는 중