전자공시(DART)란? 초보자가 먼저 볼 공시 5가지와 보는 법

이미지
전자공시(DART)란 상장회사가 법에 따라 내야 하는 보고서와 중요한 소식을 누구나 무료로 볼 수 있게 모아 둔 금융감독원의 온라인 공시 시스템입니다. 뉴스 기사나 커뮤니티 글은 결국 이 공시를 누군가 한 번 옮겨 적은 것이라, 원문을 직접 볼 줄 알면 정보가 왜곡될 틈이 줄어듭니다. 처음 들어가면 메뉴도 많고 보고서 이름도 낯설어서 막막한데, 초보자는 다섯 가지만 먼저 익히면 충분합니다. 1. 공시는 왜 봐야 할까? 주가는 회사에 대한 정보가 나올 때마다 움직입니다. 그런데 그 정보의 '공식 원본'은 대부분 공시입니다. 기사 제목이 "대규모 계약 체결"이라고 해도, 공시를 열어 보면 계약 금액이 매출액의 몇 퍼센트인지, 계약 기간이 몇 년인지까지 나와 있습니다. 같은 소식이라도 숫자를 직접 보면 판단이 달라지는 경우가 많습니다. 비유하자면 공시는 회사가 직접 쓴 '공식 알림장'이고, 기사는 그 알림장을 읽고 쓴 '후기'입니다. 후기도 도움이 되지만, 중요한 결정을 할 때는 알림장을 직접 읽는 편이 안전합니다. 2. DART 공시 유형 한눈에 보기 DART(dart.fss.or.kr)의 공시 통합검색 화면에서는 공시를 정기공시, 주요사항보고, 발행공시, 지분공시, 기타공시, 외부감사관련, 펀드공시, 자산유동화, 거래소공시, 공정위공시로 나눠 고를 수 있습니다. 초보자가 자주 보게 되는 것만 추리면 아래와 같습니다. 공시 유형 대표 보고서 이럴 때 확인 정기공시 사업보고서, 반기보고서, 분기보고서 회사가 무슨 일로 돈을 버는지, 실적이 어떤지 주요사항보고 주요사항보고서 (유상증자, 자기주식 취득 결정 등) 주식 수나 회사 구조가 바뀌는 큰 결정 발행공시 증권신고서 새 주식이나 채권을 발행할 때 조건 지분공시 주식등의대량보유상황보고서, 임원·주요주주 소유상황보고서 누가 지분을 사고팔았는지 거래소공시 수시공시, 공정공시 계약 체결, 실적 잠정치 등 그때그때 나오는 소식 3. 초보자가 먼저 볼 ...

10편. 실전 자동화 6: 공공데이터 API + 텔레그램으로 관심 종목 종가 매일 받기

관심 종목 종가 텔레그램 알림 봇 - 공공데이터 API + 텔레그램 · 10편


8편에서 텔레그램 봇으로 메시지를 보내는 법을, 9편에서 공공데이터포털 오픈 API로 주식 시세를 받는 법을 배웠습니다. 이번 10편에서는 두 가지를 하나로 합쳐서 관심 종목의 전날 종가와 등락률을 매일 텔레그램으로 받아 보는 봇을 완성합니다. 코드 한 파일이면 됩니다.

1. 완성하면 이런 메시지가 옵니다

📈 관심 종목 종가 (10/29 기준)
삼성전자  71,200원  (+1.42%)
SK하이닉스  185,000원  (-0.54%)
NAVER  198,500원  (+0.25%)

위 숫자는 화면 모양을 보여 주기 위한 예시입니다. 실제로는 API에서 받은 값이 그대로 들어갑니다.

2. 준비물 3가지

준비물어디서참고 글
공공데이터포털 인증키(Decoding)금융위원회_주식시세정보 활용신청9편
텔레그램 봇 토큰텔레그램 BotFather8편
내 채팅방 chat_id봇에게 메시지를 보낸 뒤 getUpdates 주소로 확인-

3. 언제 실행해야 할까? (중요)

9편에서 설명했듯 이 API는 실시간이 아니라 기준일 다음 영업일 오후 1시 이후에 데이터가 갱신됩니다. 그래서 아침 8시에 돌리면 어제 종가가 아니라 그 전 영업일 종가가 옵니다. 매일 저녁(예: 오후 6시)에 실행하면 전날 종가를 안정적으로 받을 수 있습니다. 코드는 날짜를 직접 정하지 않고 “최근 10일 데이터 중 가장 최신 날짜”를 고르도록 만들어서, 주말이나 공휴일에도 오류 없이 돌아갑니다.

4. 전체 코드

import requests
from datetime import datetime, timedelta

SERVICE_KEY = "공공데이터포털_Decoding_인증키"
BOT_TOKEN = "텔레그램_봇_토큰"
CHAT_ID = "내_chat_id"

API_URL = "https://apis.data.go.kr/1160100/GetStockSecuritiesInfoService_V2/getStockPriceInfo_V2"
STOCKS = ["삼성전자", "SK하이닉스", "NAVER"]   # 관심 종목 이름 (정확한 종목명)


def get_latest_price(name):
    """최근 10일 안에서 가장 최신 날짜의 시세 1건을 돌려준다."""
    begin = (datetime.now() - timedelta(days=10)).strftime("%Y%m%d")
    params = {
        "serviceKey": SERVICE_KEY,
        "resultType": "json",
        "numOfRows": 20,
        "pageNo": 1,
        "itmsNm": name,
        "beginBasDt": begin,
    }
    res = requests.get(API_URL, params=params, timeout=10)
    items = res.json()["response"]["body"]["items"]["item"]
    if isinstance(items, dict):
        items = [items]
    return max(items, key=lambda x: x["basDt"])   # 가장 최근 날짜


def send_telegram(text):
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    requests.post(url, data={"chat_id": CHAT_ID, "text": text}, timeout=10)


lines = []
base_date = ""
for name in STOCKS:
    try:
        it = get_latest_price(name)
        base_date = f"{it['basDt'][4:6]}/{it['basDt'][6:]}"
        price = int(it["clpr"])
        rate = float(it["fltRt"])
        lines.append(f"{it['itmsNm']}  {price:,}원  ({rate:+.2f}%)")
    except Exception as e:
        lines.append(f"{name}  조회 실패 ({e})")

message = f"📈 관심 종목 종가 ({base_date} 기준)\n" + "\n".join(lines)
send_telegram(message)
print(message)

5. 코드에서 달라진 점 3가지

① 텔레그램은 requests.post로 보냅니다

8편에서는 주소 뒤에 글자를 붙여 requests.get으로 보냈습니다. 짧은 글은 그래도 되지만, 메시지에 줄바꿈이나 +, % 같은 기호가 들어가면 주소가 깨질 수 있습니다. data에 담아 post로 보내면 requests가 알아서 안전하게 바꿔 주기 때문에 여러 줄 메시지에 더 적합합니다.

② 날짜는 “최근 10일 중 최신”으로 고릅니다

beginBasDt로 10일 전부터의 데이터를 받고, max(..., key=basDt)로 가장 최근 날짜 한 건만 고릅니다. 연휴가 길어도 10일 안에는 거래일이 있으니 비어 있을 일이 거의 없습니다.

③ 한 종목이 실패해도 나머지는 보냅니다

try / except로 감싸서, 종목명을 잘못 적었거나 API가 잠시 응답하지 않아도 그 종목만 “조회 실패”로 표시하고 나머지는 정상으로 보냅니다. 자동화 코드는 한 군데 실수로 전체가 멈추지 않게 만드는 것이 중요합니다.

6. 매일 자동으로 돌리려면

코드를 파일(예: stock_alert.py)로 저장한 뒤, 윈도우 ‘작업 스케줄러’에 매일 오후 6시 실행으로 등록하면 컴퓨터가 켜져 있는 한 매일 알림이 옵니다. 작업 스케줄러 등록 방법은 다음 11편에서 단계별로 정리합니다.

한 줄 정리

9편의 시세 API로 숫자를 받고, 8편의 텔레그램 봇으로 보내면 “내 관심 종목 저녁 브리핑”이 완성됩니다. API가 다음 영업일 오후에 갱신된다는 점만 기억해서 저녁에 실행하세요.


※ 이 글은 프로그래밍 학습을 위한 정보 공유이며, 특정 종목의 매수·매도를 권유하지 않습니다. 코드 속 종목은 예시입니다. 

댓글

이 블로그의 인기 게시물

파이썬 주식 자동매매 1편: 키움증권 OpenAPI+ 신청과 개발 환경 세팅

파이썬 주식 자동매매 4편: SendOrder로 매수·매도 주문 넣기

파이썬 주식 자동매매 3편: TR 요청(opt10001)으로 현재가 조회하기