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

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

9편. 실전 자동화 5: 공공데이터포털 오픈 API로 주식 시세 데이터 가져오기 (크롤링 대신 공식 데이터)



지난 8편에서는 텔레그램 봇으로 원하는 정보를 휴대폰에 받아 보는 방법을 만들었습니다. 이번 9편에서는 그 알림에 담을 ‘믿을 수 있는 데이터’를 가져오는 방법을 다룹니다. 6편의 웹 크롤링은 편리하지만, 사이트 구조가 바뀌면 코드가 깨지고 사이트마다 수집 허용 범위도 달라서 조심해야 합니다. 그래서 공공기관이 공식으로 열어 둔 오픈 API를 쓰는 방법을 알아 두면 훨씬 안정적입니다.

예제로는 공공데이터포털(data.go.kr)의 금융위원회_주식시세정보 API를 사용해, 종목 이름만 넣으면 날짜별 종가·등락률·거래량을 엑셀 표로 저장하는 코드를 만들어 보겠습니다.

1. 크롤링과 오픈 API의 차이

구분웹 크롤링 (6편)오픈 API (9편)
데이터 출처웹페이지 화면을 읽어 옴기관이 제공하는 공식 데이터
안정성사이트 디자인이 바뀌면 코드 수정 필요정해진 형식(JSON/XML)으로 응답
허용 여부사이트마다 확인 필요신청 후 받은 인증키로 정식 이용
준비물없음회원가입 + 활용신청 + 인증키

2. 인증키 발급받기

  1. 공공데이터포털(data.go.kr)에 회원가입 후 로그인합니다.
  2. 검색창에 금융위원회_주식시세정보를 검색해 ‘오픈API’ 항목으로 들어갑니다.
  3. 활용신청 버튼을 누르고 활용 목적(예: 개인 학습)을 적어 신청합니다.
  4. 마이페이지의 개발계정에서 승인 상태와 일반 인증키를 확인합니다. 인증키는 Encoding과 Decoding 두 가지가 보이는데, 아래처럼 파이썬 requests의 params로 넘길 때는 Decoding 키를 쓰면 됩니다.

신청 직후에는 키가 실제로 동작하기까지 시간이 조금 걸릴 수 있습니다. 바로 오류가 나면 잠시 뒤에 다시 시도해 보세요.

3. 주식 시세 가져와서 엑셀로 저장하기

7편에서 쓴 Pandas를 그대로 활용합니다. requests와 pandas, openpyxl이 설치되어 있어야 합니다.

import requests
import pandas as pd

SERVICE_KEY = "여기에_Decoding_인증키를_넣으세요"
URL = "https://apis.data.go.kr/1160100/GetStockSecuritiesInfoService_V2/getStockPriceInfo_V2"

params = {
    "serviceKey": SERVICE_KEY,
    "resultType": "json",      # 응답 형식 (기본값은 xml)
    "numOfRows": 30,           # 한 번에 받을 개수
    "pageNo": 1,
    "itmsNm": "삼성전자",       # 종목명이 정확히 일치하는 데이터
    "beginBasDt": "20261001",  # 이 날짜 이후 데이터
}

res = requests.get(URL, params=params, timeout=10)
data = res.json()

items = data["response"]["body"]["items"]["item"]
if isinstance(items, dict):    # 결과가 1건이면 리스트가 아닐 수 있음
    items = [items]

df = pd.DataFrame(items)[["basDt", "itmsNm", "clpr", "vs", "fltRt", "trqu"]]
df.columns = ["기준일", "종목명", "종가", "전일대비", "등락률(%)", "거래량"]
df = df.sort_values("기준일")

print(df)
df.to_excel("주식시세.xlsx", index=False)
print("✅ 주식시세.xlsx 저장 완료")

코드 설명

  • params: 요청 조건을 사전(dict)으로 넘기면 requests가 주소 뒤에 알아서 붙여 줍니다. itmsNm은 종목명이 정확히 같은 것, likeItmsNm은 종목명에 그 글자가 들어간 것을 찾습니다.
  • basDt·clpr·vs·fltRt·trqu: 각각 기준일자, 종가, 전일 대비, 등락률, 거래량입니다. 이 밖에도 시가(mkp), 고가(hipr), 저가(lopr), 시가총액(mrktTotAmt) 같은 항목이 함께 옵니다.
  • isinstance(items, dict): 결과가 한 건뿐이면 목록이 아니라 사전 하나로 오는 경우가 있어, 같은 방식으로 처리하도록 맞춰 줍니다.

4. 꼭 알아 둘 점

  • 실시간 데이터가 아닙니다. 이 API는 하루 한 번, 기준일 다음 영업일 오후 1시 이후에 갱신됩니다. 장중 가격 확인용이 아니라 지난 시세를 모으고 정리하는 용도로 쓰세요.
  • 이용 조건을 확인하세요. 데이터마다 공공누리 유형이 정해져 있고, 이 API 안내 페이지에는 재배포 제한 조건이 적혀 있습니다. 개인 분석용으로 쓰고, 받은 데이터를 그대로 다시 공개하지 않는 것이 안전합니다.
  • 인증키는 코드에 그대로 두고 공유하지 마세요. 블로그나 깃허브에 코드를 올릴 때는 키 부분을 반드시 지우세요.

5. 8편 텔레그램 봇과 연결하기

위 코드에서 마지막 줄의 결과(예: 가장 최근 날짜의 종가와 등락률)를 문자열로 만든 뒤, 8편에서 만든 텔레그램 메시지 보내기 코드에 넣으면 매일 아침 어제 종가를 휴대폰으로 받는 알림이 완성됩니다. 윈도우 ‘작업 스케줄러’에 이 파이썬 파일을 매일 아침 실행하도록 등록해 두면 사람이 손대지 않아도 매일 돌아갑니다.

한 줄 정리

크롤링이 ‘화면을 읽는 방법’이라면 오픈 API는 ‘공식 창구에서 데이터를 받는 방법’입니다. 인증키 하나만 받아 두면 같은 코드 구조로 다른 공공데이터도 똑같이 가져올 수 있습니다.


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

댓글

이 블로그의 인기 게시물

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

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

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