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

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

파이썬 주식 자동매매 6편: 관심 종목 여러 개를 동시에 감시하는 다중 종목 봇 만들기



지난 5편에서는 삼성전자 한 종목을 계속 지켜보다가 목표가에 오면 알아서 사는 봇을 만들었습니다. 그런데 실제로 써 보면 금방 아쉬운 점이 생깁니다. 관심 있는 종목은 보통 한두 개가 아니라 5개, 10개씩 되기 때문입니다. 종목마다 프로그램을 따로 켜는 건 번거롭고, 키움 API는 프로그램 여러 개가 동시에 접속하는 것도 불편합니다.

그래서 이번 6편에서는 관심 종목 여러 개를 한 프로그램에서 돌아가며 감시하고, 종목마다 다른 목표가에 도달하면 각각 매수하는 봇으로 업그레이드해 보겠습니다. 5편 코드를 거의 그대로 쓰기 때문에 어렵지 않습니다.

1. 핵심 아이디어: 종목 목록을 '사전(dict)'으로 관리하기

5편에서는 종목코드와 목표가를 변수 하나씩으로 적었습니다. 종목이 많아지면 변수를 계속 늘릴 수 없으니, 파이썬의 사전(dict)에 한꺼번에 담습니다. 종목코드를 열쇠로 두고, 그 안에 이름·목표가·수량을 넣는 방식입니다.

watchlist = {
    "005930": {"name": "삼성전자", "target": 70000, "qty": 1},
    "000660": {"name": "SK하이닉스", "target": 180000, "qty": 1},
    "035420": {"name": "NAVER", "target": 190000, "qty": 1},
}

위 종목과 가격은 코드 설명을 위한 예시일 뿐입니다. 실제로 쓸 때는 본인이 관심 있는 종목과 목표가로 바꿔 넣으면 됩니다. 종목을 추가하고 싶으면 한 줄만 더 쓰면 되니, 관리가 훨씬 편해집니다.

2. 돌아가며 감시하기: for 반복문 + 매수 완료 목록

여러 종목을 감시하는 방법은 단순합니다. 5편의 while 무한 루프 안에 for 반복문을 하나 넣어서, 목록에 있는 종목을 한 바퀴씩 돌며 현재가를 확인합니다.

5편에서는 중복 매수를 막으려고 is_bought라는 깃발 변수 하나를 썼습니다. 종목이 여러 개면 깃발도 여러 개가 필요하니, 이번에는 이미 산 종목코드를 모아 두는 집합(set)을 씁니다. 집합에 들어 있는 종목은 건너뛰고, 모든 종목을 다 사면 루프를 끝냅니다.

구분5편 (단일 종목)6편 (다중 종목)
감시 대상변수 1개사전(dict)에 여러 개
중복 매수 방지is_bought 깃발 1개bought 집합(set)
반복 구조while 1개while 안에 for
종료 조건1종목 매수 완료목록 전체 매수 완료 또는 장 마감

3. 꼭 넣어야 할 안전장치 2가지

① 조회 사이에 쉬는 시간 두기

키움 OpenAPI+는 짧은 시간에 조회 요청을 너무 많이 보내면 제한이 걸려 데이터를 받지 못합니다. 종목이 많을수록 요청 횟수가 늘어나니, 종목 하나를 조회할 때마다 잠깐 쉬고, 한 바퀴를 다 돌면 조금 더 길게 쉬도록 time.sleep()을 넣습니다. 정확한 조회 제한 기준은 키움증권 OpenAPI+ 공지사항에서 확인하는 것이 가장 안전합니다.

② 장 시간에만 돌리기

장이 끝난 뒤에도 봇이 계속 돌면 쓸데없는 조회만 쌓입니다. 현재 시각을 확인해서 정규장 시간(오전 9시~오후 3시 20분)이 지나면 스스로 멈추도록 조건을 넣습니다. 3시 20분 이후는 종가를 정하는 동시호가 시간이라 시장가 주문이 바로 체결되지 않으므로, 이 예제에서는 그 전까지만 감시합니다.

4. 다중 종목 자동매수 봇 전체 코드

from pykiwoom.kiwoom import *
from datetime import datetime
import time

# 1. 로그인 및 계좌 준비
kiwoom = Kiwoom()
kiwoom.CommConnect(block=True)
my_account = kiwoom.GetLoginInfo("ACCNO")[0]   # 첫 번째 계좌

# 2. 감시할 종목 목록 (예시 - 본인 기준으로 바꿔서 사용)
watchlist = {
    "005930": {"name": "삼성전자", "target": 70000, "qty": 1},
    "000660": {"name": "SK하이닉스", "target": 180000, "qty": 1},
    "035420": {"name": "NAVER", "target": 190000, "qty": 1},
}
bought = set()   # 이미 매수한 종목코드를 모아 두는 곳

print(f"🤖 다중 종목 감시 시작! 대상 {len(watchlist)}개")

# 3. 전 종목 매수가 끝날 때까지 반복
while len(bought) < len(watchlist):

    # 3-1. 장 시간이 지나면 종료
    now = datetime.now().strftime("%H%M")
    if now >= "1520":
        print("⏰ 정규장 감시 시간이 끝나 봇을 종료합니다.")
        break

    # 3-2. 관심 종목을 한 바퀴 돌며 확인
    for code, info in watchlist.items():
        if code in bought:
            continue   # 이미 산 종목은 건너뛰기

        df = kiwoom.block_request("opt10001",
                                  종목코드=code,
                                  output="주식기본정보",
                                  next=0)
        price = abs(int(df['현재가'][0]))
        print(f"{info['name']} 현재가 {price:,}원 / 목표가 {info['target']:,}원")

        # 3-3. 목표가 이하이면 시장가 매수
        if price <= info['target']:
            kiwoom.SendOrder("다중종목자동매수", "0101", my_account,
                             1, code, info['qty'], 0, "03", "")
            bought.add(code)
            print(f"🚨 {info['name']} 목표가 도달! {info['qty']}주 매수 주문 완료")

        time.sleep(0.5)   # 종목 사이 쉬는 시간

    time.sleep(3)   # 한 바퀴 돈 뒤 쉬는 시간

print(f"✅ 감시 종료. 매수한 종목: {[watchlist[c]['name'] for c in bought]}")

코드 설명

  • GetLoginInfo("ACCNO")[0]: pykiwoom에서는 계좌번호가 목록 형태로 돌아오기 때문에, 첫 번째 계좌를 [0]으로 꺼냅니다. 계좌가 여러 개라면 원하는 순서의 번호를 넣으세요.
  • for code, info in watchlist.items(): 사전에 담긴 종목을 하나씩 꺼내며, code에는 종목코드, info에는 이름·목표가·수량이 들어옵니다.
  • bought.add(code): 매수 주문을 넣은 종목을 집합에 기록해서 다음 바퀴부터는 건너뜁니다. 5편의 깃발 변수를 종목별로 늘린 것과 같은 역할입니다.
  • SendOrder의 1, "03": 4편에서 설명한 것처럼 1은 신규매수, "03"은 시장가 주문입니다. 시장가라 가격 자리에는 0을 넣습니다.

5. 실행 전 체크리스트

  • 반드시 모의투자 서버로 먼저 돌려 보세요. 1편에서 신청한 모의투자 계좌로 로그인하면 실제 돈이 나가지 않습니다.
  • 목표가를 현재가보다 높게 잘못 적으면 실행하자마자 바로 매수됩니다. 숫자를 한 번 더 확인하세요.
  • 수량(qty)은 처음엔 1주로 두고, 동작이 확인된 뒤에 늘리는 것이 안전합니다.
  • 주문을 넣었다고 바로 체결되는 것은 아닙니다. 체결 여부는 영웅문이나 KOA Studio에서 따로 확인하세요.

연재를 마치며

여기까지가 파이썬 주식 자동매매 기초 연재입니다. 지금까지 만든 흐름을 정리하면 이렇습니다.

  • 1편: 키움 OpenAPI+ 신청과 32비트 파이썬 개발 환경
  • 2편: 자동 로그인과 계좌 정보 불러오기
  • 3편: TR 요청으로 현재가 조회하기
  • 4편: 매수·매도 주문(SendOrder) 넣기
  • 5편: 목표가 도달 시 자동 매수하는 단일 종목 봇
  • 6편(이 글): 여러 종목을 동시에 감시하는 다중 종목 봇

여기에 매수 알림을 휴대폰으로 받고 싶다면 파이썬으로 텔레그램 알림 봇 만들기 글의 코드를 매수 주문 바로 아래에 붙이면 됩니다. 봇이 일을 했을 때 바로 알 수 있어 훨씬 마음이 편해집니다.

한 줄 정리

관심 종목은 사전(dict)에 담고, for 반복문으로 돌아가며 확인하고, 산 종목은 집합(set)에 기록하면 단일 종목 봇이 다중 종목 봇이 됩니다. 조회 간격과 장 시간 체크, 두 가지 안전장치는 꼭 넣어 두세요.


※ 이 글은 프로그래밍 학습을 위한 정보 공유이며, 특정 종목의 매수·매도를 권유하지 않습니다. 자동매매 프로그램 사용과 투자 판단에 따른 책임은 사용자 본인에게 있습니다.

댓글

이 블로그의 인기 게시물

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

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

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