Skip to content

블로그

파이썬으로 DART OpenAPI 사용하기

이번 포스트에서는 금융감독원에서 운영하는 전자공시시스템(DART)의 OpenAPI를 사용하는 방법을 다룹니다. DART OpenAPI를 통해 기업의 재무제표 등 주식 투자에 도움이 되는 다양한 정보를 얻을 수 있습니다.

우선 DART 사이트 http://dart.fss.or.kr/에 접속합니다. 그리고 상단의 작은 메뉴에서 오픈API 메뉴를 찾아서 클릭합니다.

DART 메뉴

인증키 신청/관리 메뉴로 가서 인증키 신청을 진행하고 로그인 하면 됩니다. 인증키를 신청할 때 사용자를 개인과 기관으로 구분하는데 기관으로 신청 시 입력할 사항들이 늘어나는 반면 공시목록 및 기업개황 조회를 한도제한 없이 사용할 수 있다고 합니다.

인증키 신청/관리

개발가이드를 보면 DART OpenAPI로 조회할 수 있는 데이터 종류들을 살펴볼 수 있습니다. 다음은 DART에서 제공하는 API들의 개발가이드 링크입니다.

여기서는 간단히 예로 DART OpenAPI 사용법을 알아보겠습니다.

DART API는 HTTP GET Method로 데이터 요청을 보냅니다. API마다 지원하는 출력 포멧(Zip 파일, JSON, XML)이 다릅니다. 대부분 JSON과 XML을 지원하고 요청 URL 마지막이 .json, .xml으로 출력포멧에 따라 다릅니다. 여기서는 JSON 포멧 요청 우선적으로 사용하겠습니다.

먼저 고유번호 API로 공시대상회사의 8자리 고유번호를 획득해 보겠습니다.

고유번호 API는 출력포멧이 Zip 파일입니다. 파이썬으로 다음과 같이 데이터를 확인할 수 있습니다.

여기서는 requests로 HTTP 요청을 수행합니다. API 파라미터로 입력해야 하는 crtfc_key는 위에서 발급했던 인증키를 입력하면 됩니다. 데이터가 binary 형태이기 때문에 ByteIO로 읽어주고 Zip 파일로 생성합니다.

import requests
from io import BytesIO
import zipfile
import xmltodict
api = 'https://opendart.fss.or.kr/api/corpCode.xml'
res = requests.get(api, params={'crtfc_key': crtfc_key})
data_xml = zipfile.ZipFile(BytesIO(res.content))

이렇게 하면 공시대상 기업의 고유번호 데이터를 Zip 압축 포멧으로 받을 수 있습니다. Zip 파일에 담겨있는 파일은 리스트는 다음과 같이 확인할 수 있습니다.

z.namelist()
output: ['CORPCODE.xml']

여기서는 편의상 다음과 같이 XML 파일을 dict로 변환했습니다.

import xmltodict
import json
data_xml = z.read('CORPCODE.xml').decode('utf-8')
data_odict = xmltodict.parse(data_xml)
data_dict = json.loads(json.dumps(data_odict))
data = data_dict.get('result', {}).get('list')

이를 위해 xmltodict 라이브러리를 사용했습니다. xmltodict로 XML을 파싱하고 나면 OrderedDict 형식의 결과를 얻을 수 있습니다. 이를 편의상 dict 형식으로 변환하기 위해 JSON dumps/loads 과정을 거쳤습니다.

data를 확인해 보면 공시대상 기업들의 고유번호와 주식 종목코드를 확인할 수 있습니다.

for item in data:
if item['corp_name'] in ["삼성전자", "SK하이닉스", "NAVER"]:
print(item)
output:
{'corp_code': '00126380', 'corp_name': '삼성전자', 'stock_code': '005930', 'modify_date': '20191209'}
{'corp_code': '00266961', 'corp_name': 'NAVER', 'stock_code': '035420', 'modify_date': '20200512'}
{'corp_code': '00164779', 'corp_name': 'SK하이닉스', 'stock_code': '000660', 'modify_date': '20200512'}

DART API는 대부분 공시대학회사의 고유번호를 요청 파라미터로 입력해줘야 하므로 이 데이터를 잘 관리하고 있는 것이 좋습니다.

기업개황 API는 대표자명, 사업자등록번호 등의 기업의 기본 정보를 제공합니다. JSON 포멧 요청 URL은 https://opendart.fss.or.kr/api/company.json이고 다음 두 파라미터를 입력해야 합니다.

  • crtfc_key: 발급받은 인증키
  • corp_code: 공시대상회사 고유번호

crtfc_key에 발급받은 인증키를 입력하고 corp_code에 삼성전자의 기업번호인 00126380를 입력하면 다음과 같은 결과를 얻을 수 있습니다.

res = requests.get('https://opendart.fss.or.kr/api/company.json?crtfc_key=2ff3dd09bbe0e8140dc1941c86ed08b77597b5e5&corp_code=00126380')
item = json.loads(res.text)
print(item)
output:
{'status': '000',
'message': '정상',
'corp_code': '00126380',
'corp_name': '삼성전자(주)',
'corp_name_eng': 'SAMSUNG ELECTRONICS CO,.LTD',
'stock_name': '삼성전자',
'stock_code': '005930',
'ceo_nm': '김기남, 김현석, 고동진',
'corp_cls': 'Y',
'jurir_no': '1301110006246',
'bizr_no': '1248100998',
'adres': '경기도 수원시 영통구 삼성로 129 (매탄동)',
'hm_url': 'www.sec.co.kr',
'ir_url': '',
'phn_no': '031-200-1114',
'fax_no': '031-200-7538',
'induty_code': '264',
'est_dt': '19690113',
'acc_mt': '12'}

그 외의 API들도 이와 비슷한 방법으로 사용할 수 있으므로 이렇게 마무리하겠습니다. 질문이 있으시면 메일 등으로 문의주시면 됩니다.

  • dart-fss 라이브러리를 사용하면 DART에서 쉽게 재무제표를 추출할 수 있습니다.
  • Insomnia는 간편하게 HTTP API를 사용해 볼 수 있는 클라이언트 입니다.

주식 양도소득세 개정 사항 요점 정리 (수정사항)

이번 포스트에서는 2020년 7월 22일에 발표된 주식 양도소득세 개정 사항들을 정리합니다. 이전에 알려졌던 내용에서 수정된 부분이 있어서 정리하고자 합니다. 대부분 6월 25일에 발표되었던 내용과 비슷한데 비과세 기준액과 손실 공제 년수가 변경되었습니다.

  • 2023년부터 주식으로 얻은 수익에 세금을 부과
  • 5,000만원 까지는 비과세
  • 수익이 5,000만원이 넘으면 세금 발생
  • 수익이 6,000만원이면 1,000만원에 대해 세금 20% 부과
  • 3억 초과분은 세율 25%
  • 손실은 최대 5년 이월공제

10억원 초과 소득자에 대한 소득세 구간이 신설되었습니다. 기존 42%에서 45%로 개정됩니다.

[2020-07-16] 카카오(035720) 종목분석

최근 언택트 대표주로 매섭게 주가가 상승한 카카오(035720) 종목에 대한 기본적, 기술적, 수급, 딥러닝 분석 정보를 공유합니다.

카카오의 재무제표와 대표적인 지표들을 살펴보겠습니다.

kakao_finstate

매출이 가파르게 상승하는 모습입니다. 다만 순이익은 낮았었는데 매출이 더욱 오르면서 이익이 발생할 것으로 예상됩니다. 자산 규모도 자본과 부채 모두 증가하면서 커질 것으로 보입니다. 현금흐름을 보면 영업활동현금흐름이 커지면서 매출이 늘어날 것으로 보입니다. 다만 투자활동은 공격적이지 않은 것 같습니다.

kakao_perpbrroe

PER는 상당히 올라와 있는데 EPS가 증가될 것으로 예상되어 PER는 낮아질 것으로 컨센서스가 맞춰져 있습니다. BPS도 증가할 것으로 보이나 가격 상승에 비해 약할 것으로 보여서 PBR은 높아질 것으로 예상됩니다. ROE는 현재 마이너스인데 다시 플러스 전환 될 것으로 보입니다.

다음은 카카오 일봉 차트를 보여줍니다. 여기에 이동평균선, 볼린저밴드, MACD, RSI를 추가로 보여줍니다. 이 보조지표들에 대한 상세한 설명은 이 포스트를 참고해 주세요.

kakao

카카오 일봉차트의 볼린저밴드 윗부분에서 주가흐름을 보이고 있습니다. 요 며칠 동안은 코로나19 백신 기대로 주가가 하락했습니다. 주가도 높고 언택트 메리트가 약해졌다고 판단한 투자자들이 많았나 봅니다.

이평선들이 많이 벌어져 있어서 당분간은 횡보하지 않을까 조심스럽게 생각해 봅니다.

MACD는 시그널을 아직 하방돌파하지는 않았습니다. 그러나 RSI는 70을 넘기고 있어서 과열 양상을 보입니다.

다음 바차트는 카카오의 일봉 수급 점수입니다. 0보다 크면 매수세가 강했고 0보다 작으면 매도세가 강했음을 의미합니다.

kakao_dem

최근 60일, 20일, 10일 수급점수는 매수세가 점점 강해져왔음을 보이고 있습니다. 그러나 최근 5일의 수급점수는 매도세가 강해져서 수급점수가 점점 낮아질 것 같습니다.

다음 차트는 딥러닝 모델의 점수입니다. 진한 검정색 선은 카카오 종목의 종가이고 연한 회색 선이 딥러닝 모델이 산출한 카카오 종목 점수입니다.

kakao_score

카카오 주가가 상승을 시작한 3월 중순쯤 딥러닝 모델의 점수가 치솟았습니다. 이후 점수가 조금식 떨어졌는데 최근 다시 약상승 중입니다.

위 분석 내용들은 어디까지나 참고사항 입니다. 투자에 있어서 절대적인 것은 없습니다. 항상 본인의 철학을 지키며 투자하시길 바랍니다.

카카오의 성장과 투자자들의 성투를 응원합니다.

[2020-H1] 딥러닝 주식종목 랭킹모델 백테스팅

이번 포스트에서는 최근 구축한 주식종목 랭킹모델의 2020년 상반기 백테스팅 결과를 정리합니다.

백테스팅 환경은 이 포스트에 정리한 것과 같습니다.

비교 대상(baseline)은 코스피 인덱스로 잡았습니다.

백테스팅 결과

진한 선이 포트폴리오 가치(PV)이고 연한 선이 코스피입니다. 변화율을 y축으로 정했습니다. 0.2는 20%라는 뜻입니다.

2020년 상반기 백테스팅 결과를 보면 퀀티랩 PV 수익률은 약 **+20.3%**에 달하고 코스피 수익률은 약 -3.1% 입니다.

Maxium Drawdown(MDD)은 퀀티랩 딥러닝 모델은 약 -23.1%, 코스피는 **-35.7%**로 퀀티랩 딥러닝 모델의 위험이 더 작았습니다.

2020년 상반기 퀀티랩 딥러닝 주식투자 모델의 백테스팅의 매매 내역은 다음과 같습니다.

dateactioncodenamepriceamountprofitlosseval
20200102buy028300에이치엘비101,3159899,998,511
20200102buy005930삼성전자55,20018199,997,012
20200102buy140410메지온193,8005199,995,529
20200102buy196170알테오젠69,80014399,994,032
20200102buy032500케이엠더블유57,30017499,992,537
20200103buy000660SK하이닉스94,50010598,904,030
20200103buy068270셀트리온177,5005698,902,539
20200103buy002360SH에너지화학1,1258,88898,901,039
20200103buy053800안랩76,00013198,899,546
20200103buy005380현대자동차116,0008698,898,050
20200108sell002360SH에너지화학1,6208,88844.00%99,729,899
20200108buy078130국일제지5,3501,86999,728,400
20200219sell196170알테오젠98,50014341.12%107,025,215
20200219buy096530씨젠34,900286107,023,718
20200306sell096530씨젠48,35028638.54%104,062,865
20200313sell053800안랩49,750131-34.54%92,553,090
20200316buy140410메지온112,900191,114,960
20200318buy000660SK하이닉스73,100188,061,293
20200423buy196170알테오젠97,900102106,097,159
20200511sell196170알테오젠168,40010272.01%115,562,596
20200615sell078130국일제지5,4201,8691.31%116,858,954
20200619buy053800안랩51,400194119,638,858
20200625buy229000젠큐릭스21,650461120,262,761

코스피200 선물과 현물

이번 포스트에서는 코스피200 현물과 선물의 상관관계 분석 결과를 다룹니다.

코스피200 선물은 코스피200 현물 지수가 앞으로 어떻게 될지 예상하여 거래하는 가격입니다. 앞으로 코스피200이 상승할 것 같다고 판단한 투자자가 우세하면 선물 가격은 상승하고 코스피200이 하락할 것 같다고 판단한 투자자가 우세하면 선물 가격은 하락합니다.

즉, 선물 가격이 현물 가격을 선행한다고 할 수 있는데 정말 그런지 확인해보고자 합니다. 그렇다면 선물의 움직임을 보고 현물 투자에 참고하면 될테니 말입니다.

코스피200 선물과 현물의 상관관계

Section titled “코스피200 선물과 현물의 상관관계”

다음 관계가 통계적으로 만족하는지 확인하고자 합니다.

  • 선물 가격 상승 -> 현물 가격 상승
  • 선물 가격 하락 -> 현물 가격 하락

선물과 현물의 증감을 시계열로 구한 뒤 상관관계(correlation)을 확인해봅니다.

코스피200 선물과 현물 값의 차이(basis)

Section titled “코스피200 선물과 현물 값의 차이(basis)”

선물과 현물의 가격 차이를 베이시스(basis)라고 합니다. 코스피200의 베이시스를 구해보면 다음과 같습니다.

BASIS = KOSPI200F – KOSPI200
  • KOSPI200F: 코스피200선물 가격
  • KOSPI200: 코스피200현물 가격

1

베이시스가 양수일 때는 현물보다 선물의 가격이 높다는 뜻으로 현물이 앞으로 상승할 것 같다는 의견이 우세한 것입니다. 반대로 베이시스가 음수이면 현물이 떨어질 것 같다는 의견이 우세한 것입니다.

코스피200 현물 지표와 코스피200의 베이시스를 그려보면 다음과 같습니다.

2

대체적으로 베이시스는 양수인 경우가 많은 것을 알 수 있습니다.

종종 큰 값의 베이시스가 발생하는 부분을 살펴보며 현물의 움직임을 보면 그다지 밀접한 상관성이 보이지는 않습니다.

코스피200 현물과 베이시스의 상관관계 분석

Section titled “코스피200 현물과 베이시스의 상관관계 분석”

다양한 해석이 가능하므로 참고만 하시기 바랍니다.

이견이 있으시면 자유롭게 댓글이나 메일 주시면 감사하겠습니다.

Correlation 분석 결과를 그려보면 다음과 같습니다.

3

이 결과를 다음과 같이 해석해 볼 수 있습니다.

  • 3일 뒤의 선물이 현재 현물과 가장 비슷하다.
  • 선물 가격 변화 다음날은 오히려 현물이 반대로 움직인 경우가 많다.
  • 확률적으로 선물 가격 변화 방향으로 2, 3일 뒤 현물 가격이 따라 가는 경우가 많다.