풍문 또는 보도에 대한 해명
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20210108800176
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20210208800102
현대차 애플카 관련 뉴스
https://news.kbs.co.kr/news/view.do?ncd=5090587
https://www.hankyung.com/finance/article/2021010805206
https://www.hankyung.com/finance/article/2021011992501
https://www.mk.co.kr/news/stock/view/2021/02/112468/
FinanceDataReader, OpenDartReader 설치
!pip -q install finance-datareader
!pip -q install opendartreader
개별 종목의 가격데이터(Close, 종가)를 가져옵니다
import FinanceDataReader as fdr
start, end = '2020-12-01', '2021-02-10'
hmc = fdr.DataReader('005380', start, end) # 현대차(005380)
kia = fdr.DataReader('000270', start, end) # 기아차(000270)
import pandas as pd
data = {}
data['HMC'] = hmc.Close
data['KIA'] = kia.Close
price = pd.DataFrame(data)
price.plot(secondary_y='HMC', figsize=(12, 6), grid=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7f30107af6d8>
major_shareholders_exec() 함수는 과거 약 2년간의 임원ㆍ주요주주 소유보고 공시 목록을 가져옵니다.
import OpenDartReader
api_key = '9104998c53032be6e408f26f7********************'
dart = OpenDartReader(api_key)
# 임원ㆍ주요주주 소유보고 (종목코드, 종목명, 고유번호 모두 지정 가능)
reports = dart.major_shareholders_exec('005380') # 현대차(005380)
reports
rcept_no | rcept_dt | corp_code | corp_name | repror | isu_exctv_rgist_at | isu_exctv_ofcps | isu_main_shrholdr | sp_stock_lmp_cnt | sp_stock_lmp_irds_cnt | sp_stock_lmp_rate | sp_stock_lmp_irds_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20190405002372 | 2019-04-05 | 00164742 | 현대자동차 | 가석현 | 비등기임원 | 상무 | - | 75 | 75 | 0.00 | 0.00 |
1 | 20190405002401 | 2019-04-05 | 00164742 | 현대자동차 | 강문종 | 비등기임원 | 상무 | - | 180 | 180 | 0.00 | 0.00 |
2 | 20190405002434 | 2019-04-05 | 00164742 | 현대자동차 | 강범석 | 비등기임원 | 상무 | - | 20 | 20 | 0.00 | 0.00 |
3 | 20190405002488 | 2019-04-05 | 00164742 | 현대자동차 | 강점기 | 비등기임원 | 상무 | - | 20 | 20 | 0.00 | 0.00 |
4 | 20190405002656 | 2019-04-05 | 00164742 | 현대자동차 | 김동섭 | 비등기임원 | 상무 | - | 80 | 80 | 0.00 | 0.00 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
414 | 20210120000507 | 2021-01-20 | 00164742 | 현대자동차 | 최서호 | 비등기임원 | 상무 | - | 50 | -410 | 0.00 | 0.00 |
415 | 20210120000533 | 2021-01-20 | 00164742 | 현대자동차 | 석동빈 | 비등기임원 | 상무 | - | 200 | -500 | 0.00 | 0.00 |
416 | 20210127000509 | 2021-01-27 | 00164742 | 현대자동차 | 김철 | 비등기임원 | 상무 | - | 0 | -585 | 0.00 | 0.00 |
417 | 20210201000135 | 2021-02-01 | 00164742 | 현대자동차 | 윤일헌 | 비등기임원 | 상무 | - | 0 | -408 | 0.00 | 0.00 |
418 | 20210201000301 | 2021-02-01 | 00164742 | 현대자동차 | 박진호 | 비등기임원 | 상무 | - | 415 | 250 | 0.00 | 0.00 |
419 rows × 12 columns
reports = reports.query("rcept_dt >= '2021-01-01'")
reports
rcept_no | rcept_dt | corp_code | corp_name | repror | isu_exctv_rgist_at | isu_exctv_ofcps | isu_main_shrholdr | sp_stock_lmp_cnt | sp_stock_lmp_irds_cnt | sp_stock_lmp_rate | sp_stock_lmp_irds_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
375 | 20210107000280 | 2021-01-07 | 00164742 | 현대자동차 | 국민연금공단 | - | - | 10%이상주주 | 27,800,627 | -508,200 | 10.04 | -0.18 |
376 | 20210108000250 | 2021-01-08 | 00164742 | 현대자동차 | 서강현 | 비등기임원 | 부사장 | - | 400 | 400 | 0.00 | 0.00 |
377 | 20210108000504 | 2021-01-08 | 00164742 | 현대자동차 | 현동진 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
378 | 20210108000495 | 2021-01-08 | 00164742 | 현대자동차 | 최종인 | 비등기임원 | 상무 | - | 74 | 74 | 0.00 | 0.00 |
379 | 20210108000488 | 2021-01-08 | 00164742 | 현대자동차 | 최영태 | 비등기임원 | 상무 | - | 167 | 167 | 0.00 | 0.00 |
380 | 20210108000480 | 2021-01-08 | 00164742 | 현대자동차 | 정대석 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
381 | 20210108000478 | 2021-01-08 | 00164742 | 현대자동차 | 장현구 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
382 | 20210108000462 | 2021-01-08 | 00164742 | 현대자동차 | 이승민 | 비등기임원 | 상무 | - | 10 | 10 | 0.00 | 0.00 |
383 | 20210108000449 | 2021-01-08 | 00164742 | 현대자동차 | 윤홍만 | 비등기임원 | 상무 | - | 70 | 70 | 0.00 | 0.00 |
384 | 20210108000436 | 2021-01-08 | 00164742 | 현대자동차 | 윤태종 | 비등기임원 | 상무 | - | 160 | 160 | 0.00 | 0.00 |
385 | 20210108000411 | 2021-01-08 | 00164742 | 현대자동차 | 윤광민 | 비등기임원 | 상무 | - | 1,934 | 1,934 | 0.00 | 0.00 |
386 | 20210108000397 | 2021-01-08 | 00164742 | 현대자동차 | 오세민 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
387 | 20210108000378 | 2021-01-08 | 00164742 | 현대자동차 | 여창기 | 비등기임원 | 상무 | - | 42 | 42 | 0.00 | 0.00 |
388 | 20210108000363 | 2021-01-08 | 00164742 | 현대자동차 | 박종태 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
389 | 20210108000347 | 2021-01-08 | 00164742 | 현대자동차 | 박인환 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
390 | 20210108000342 | 2021-01-08 | 00164742 | 현대자동차 | 박세혁 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
391 | 20210108000337 | 2021-01-08 | 00164742 | 현대자동차 | 남성우 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
392 | 20210108000255 | 2021-01-08 | 00164742 | 현대자동차 | 김상수 | 비등기임원 | 상무 | - | 209 | 209 | 0.00 | 0.00 |
393 | 20210108000257 | 2021-01-08 | 00164742 | 현대자동차 | 강동훈 | 비등기임원 | 상무 | - | 80 | 80 | 0.00 | 0.00 |
394 | 20210108000261 | 2021-01-08 | 00164742 | 현대자동차 | 김광현 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
395 | 20210108000271 | 2021-01-08 | 00164742 | 현대자동차 | 김석종 | 비등기임원 | 상무 | - | 69 | 69 | 0.00 | 0.00 |
396 | 20210108000282 | 2021-01-08 | 00164742 | 현대자동차 | 김석준 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
397 | 20210108000287 | 2021-01-08 | 00164742 | 현대자동차 | 김준수 | 비등기임원 | 상무 | - | 300 | 300 | 0.00 | 0.00 |
398 | 20210108000297 | 2021-01-08 | 00164742 | 현대자동차 | 김지훈 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
399 | 20210108000306 | 2021-01-08 | 00164742 | 현대자동차 | 김태연 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
400 | 20210108000313 | 2021-01-08 | 00164742 | 현대자동차 | 김판규 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
401 | 20210108000319 | 2021-01-08 | 00164742 | 현대자동차 | 김회일 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
402 | 20210108000329 | 2021-01-08 | 00164742 | 현대자동차 | 김훈 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
403 | 20210111000132 | 2021-01-11 | 00164742 | 현대자동차 | 이인철 | 비등기임원 | 부사장 | - | 600 | 100 | 0.00 | 0.00 |
404 | 20210113000120 | 2021-01-13 | 00164742 | 현대자동차 | 박상현 | 비등기임원 | 상무 | - | 75 | -50 | 0.00 | 0.00 |
405 | 20210113000088 | 2021-01-13 | 00164742 | 현대자동차 | 백익진 | 비등기임원 | 상무 | - | 0 | -30 | 0.00 | 0.00 |
406 | 20210113000072 | 2021-01-13 | 00164742 | 현대자동차 | 김훈 | 비등기임원 | 상무 | - | 0 | -135 | 0.00 | 0.00 |
407 | 20210118000146 | 2021-01-18 | 00164742 | 현대자동차 | 국민연금공단 | - | - | 10%이상주주 | 27,171,973 | -628,654 | 9.81 | -0.23 |
408 | 20210118000313 | 2021-01-18 | 00164742 | 현대자동차 | 이청휴 | 비등기임원 | 전무 | - | 313 | -200 | 0.00 | 0.00 |
409 | 20210119000379 | 2021-01-19 | 00164742 | 현대자동차 | 정홍범 | 비등기임원 | 전무 | - | 0 | -150 | 0.00 | 0.00 |
410 | 20210119000363 | 2021-01-19 | 00164742 | 현대자동차 | 서정국 | 비등기임원 | 전무 | - | 300 | -200 | 0.00 | 0.00 |
411 | 20210119000372 | 2021-01-19 | 00164742 | 현대자동차 | 권순태 | 비등기임원 | 상무 | - | 0 | -300 | 0.00 | 0.00 |
412 | 20210119000396 | 2021-01-19 | 00164742 | 현대자동차 | 지영식 | 비등기임원 | 상무 | - | 0 | -304 | 0.00 | 0.00 |
413 | 20210120000498 | 2021-01-20 | 00164742 | 현대자동차 | 류준성 | 비등기임원 | 상무 | - | 0 | -265 | 0.00 | 0.00 |
414 | 20210120000507 | 2021-01-20 | 00164742 | 현대자동차 | 최서호 | 비등기임원 | 상무 | - | 50 | -410 | 0.00 | 0.00 |
415 | 20210120000533 | 2021-01-20 | 00164742 | 현대자동차 | 석동빈 | 비등기임원 | 상무 | - | 200 | -500 | 0.00 | 0.00 |
416 | 20210127000509 | 2021-01-27 | 00164742 | 현대자동차 | 김철 | 비등기임원 | 상무 | - | 0 | -585 | 0.00 | 0.00 |
417 | 20210201000135 | 2021-02-01 | 00164742 | 현대자동차 | 윤일헌 | 비등기임원 | 상무 | - | 0 | -408 | 0.00 | 0.00 |
418 | 20210201000301 | 2021-02-01 | 00164742 | 현대자동차 | 박진호 | 비등기임원 | 상무 | - | 415 | 250 | 0.00 | 0.00 |
reports.query("rcept_dt >= '2021-01-01'")['repror'].value_counts().head()
국민연금공단 2 김훈 2 박진호 1 김석준 1 이승민 1 Name: repror, dtype: int64
dart.sub_docs('20210108000250', match='소유상황')
title | url | |
---|---|---|
3 | 3. 특정증권등의 소유상황 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
0 | 임원ㆍ주요주주 특정증권등 소유상황보고서 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
1 | 1. 발행회사에 관한 사항 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
2 | 2. 보고자에 관한 사항 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
subdocs = dart.sub_docs('20210108000250', match='소유상황')
print(subdocs.iloc[0].title)
print(subdocs.iloc[0].url)
3. 특정증권등의 소유상황 http://dart.fss.or.kr/report/viewer.do?rcpNo=20210108000250&dcmNo=7752013&eleId=4&offset=9077&length=13025&dtd=dart3.xsd
import pandas as pd
dfs = pd.read_html(subdocs.iloc[0].url)
dfs[-1]
보고사유 | 변동일* | 특정증권등의종류 | 소 유 주 식 수 (주) | 취득/처분단가(원)** | 비 고 | |||
---|---|---|---|---|---|---|---|---|
보고사유 | 변동일* | 특정증권등의종류 | 변동전 | 증감 | 변동후 | 취득/처분단가(원)** | 비 고 | |
0 | 신규선임(+) | 2021.01.01 | 보통주 | - | 400 | 400 | - | 기보유분 |
1 | 합 계 | 합 계 | 합 계 | - | 400 | 400 | - | - |
dfs[-1].iloc[0,0] # 보고사유
'신규선임(+)'
dfs[-1].iloc[0,1] # 변동일
'2021.01.01'
dfs[-1].iloc[0,2] # 특정증권등의종류
'보통주'
dfs[-1].iloc[0,4] # 증감
400
특정 날짜 보소서의 보고사유를 모두 확인합니다.
reports.query("rcept_dt == '2021-01-08'")
rcept_no | rcept_dt | corp_code | corp_name | repror | isu_exctv_rgist_at | isu_exctv_ofcps | isu_main_shrholdr | sp_stock_lmp_cnt | sp_stock_lmp_irds_cnt | sp_stock_lmp_rate | sp_stock_lmp_irds_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
376 | 20210108000250 | 2021-01-08 | 00164742 | 현대자동차 | 서강현 | 비등기임원 | 부사장 | - | 400 | 400 | 0.00 | 0.00 |
377 | 20210108000504 | 2021-01-08 | 00164742 | 현대자동차 | 현동진 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
378 | 20210108000495 | 2021-01-08 | 00164742 | 현대자동차 | 최종인 | 비등기임원 | 상무 | - | 74 | 74 | 0.00 | 0.00 |
379 | 20210108000488 | 2021-01-08 | 00164742 | 현대자동차 | 최영태 | 비등기임원 | 상무 | - | 167 | 167 | 0.00 | 0.00 |
380 | 20210108000480 | 2021-01-08 | 00164742 | 현대자동차 | 정대석 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
381 | 20210108000478 | 2021-01-08 | 00164742 | 현대자동차 | 장현구 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
382 | 20210108000462 | 2021-01-08 | 00164742 | 현대자동차 | 이승민 | 비등기임원 | 상무 | - | 10 | 10 | 0.00 | 0.00 |
383 | 20210108000449 | 2021-01-08 | 00164742 | 현대자동차 | 윤홍만 | 비등기임원 | 상무 | - | 70 | 70 | 0.00 | 0.00 |
384 | 20210108000436 | 2021-01-08 | 00164742 | 현대자동차 | 윤태종 | 비등기임원 | 상무 | - | 160 | 160 | 0.00 | 0.00 |
385 | 20210108000411 | 2021-01-08 | 00164742 | 현대자동차 | 윤광민 | 비등기임원 | 상무 | - | 1,934 | 1,934 | 0.00 | 0.00 |
386 | 20210108000397 | 2021-01-08 | 00164742 | 현대자동차 | 오세민 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
387 | 20210108000378 | 2021-01-08 | 00164742 | 현대자동차 | 여창기 | 비등기임원 | 상무 | - | 42 | 42 | 0.00 | 0.00 |
388 | 20210108000363 | 2021-01-08 | 00164742 | 현대자동차 | 박종태 | 비등기임원 | 상무 | - | 60 | 60 | 0.00 | 0.00 |
389 | 20210108000347 | 2021-01-08 | 00164742 | 현대자동차 | 박인환 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
390 | 20210108000342 | 2021-01-08 | 00164742 | 현대자동차 | 박세혁 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
391 | 20210108000337 | 2021-01-08 | 00164742 | 현대자동차 | 남성우 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
392 | 20210108000255 | 2021-01-08 | 00164742 | 현대자동차 | 김상수 | 비등기임원 | 상무 | - | 209 | 209 | 0.00 | 0.00 |
393 | 20210108000257 | 2021-01-08 | 00164742 | 현대자동차 | 강동훈 | 비등기임원 | 상무 | - | 80 | 80 | 0.00 | 0.00 |
394 | 20210108000261 | 2021-01-08 | 00164742 | 현대자동차 | 김광현 | 비등기임원 | 상무 | - | 30 | 30 | 0.00 | 0.00 |
395 | 20210108000271 | 2021-01-08 | 00164742 | 현대자동차 | 김석종 | 비등기임원 | 상무 | - | 69 | 69 | 0.00 | 0.00 |
396 | 20210108000282 | 2021-01-08 | 00164742 | 현대자동차 | 김석준 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
397 | 20210108000287 | 2021-01-08 | 00164742 | 현대자동차 | 김준수 | 비등기임원 | 상무 | - | 300 | 300 | 0.00 | 0.00 |
398 | 20210108000297 | 2021-01-08 | 00164742 | 현대자동차 | 김지훈 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
399 | 20210108000306 | 2021-01-08 | 00164742 | 현대자동차 | 김태연 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
400 | 20210108000313 | 2021-01-08 | 00164742 | 현대자동차 | 김판규 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
401 | 20210108000319 | 2021-01-08 | 00164742 | 현대자동차 | 김회일 | 비등기임원 | 상무 | - | 165 | 165 | 0.00 | 0.00 |
402 | 20210108000329 | 2021-01-08 | 00164742 | 현대자동차 | 김훈 | 비등기임원 | 상무 | - | 135 | 135 | 0.00 | 0.00 |
import pandas as pd
data = []
for ix, row in reports.query("rcept_dt == '2021-01-08'").iterrows():
subdocs = dart.sub_docs(row['rcept_no'], match='소유상황')
dfs = pd.read_html(subdocs.iloc[0].url)
data_row = [row['repror'], row['isu_exctv_ofcps'], dfs[-1].iloc[0,0], dfs[-1].iloc[0,1], dfs[-1].iloc[0,2], dfs[-1].iloc[0,4]]
print(data_row)
data.append(data_row)
['서강현', '부사장', '신규선임(+)', '2021.01.01', '보통주', 400] ['현동진', '상무', '신규선임(+)', '2021.01.01', '보통주', 30] ['최종인', '상무', '신규선임(+)', '2021.01.01', '보통주', 74] ['최영태', '상무', '신규선임(+)', '2021.01.01', '보통주', 167] ['정대석', '상무', '신규선임(+)', '2021.01.01', '보통주', 60] ['장현구', '상무', '신규선임(+)', '2021.01.01', '보통주', 165] ['이승민', '상무', '신규선임(+)', '2021.01.01', '보통주', 10] ['윤홍만', '상무', '신규선임(+)', '2021.01.01', '보통주', 70] ['윤태종', '상무', '신규선임(+)', '2021.01.01', '보통주', 160] ['윤광민', '상무', '신규선임(+)', '2021.01.01', '보통주', 1105] ['오세민', '상무', '신규선임(+)', '2021.01.01', '보통주', 60] ['여창기', '상무', '신규선임(+)', '2021.01.01', '보통주', 42] ['박종태', '상무', '신규선임(+)', '2021.01.01', '보통주', 60] ['박인환', '상무', '신규선임(+)', '2021.01.01', '보통주', 30] ['박세혁', '상무', '신규선임(+)', '2021.01.01', '보통주', 30] ['남성우', '상무', '신규선임(+)', '2021.01.01', '보통주', 135] ['김상수', '상무', '신규선임(+)', '2021.01.01', '보통주', 209] ['강동훈', '상무', '신규선임(+)', '2021.01.01', '보통주', 80] ['김광현', '상무', '신규선임(+)', '2021.01.01', '보통주', 30] ['김석종', '상무', '신규선임(+)', '2021.01.01', '우선주', 69] ['김석준', '상무', '신규선임(+)', '2021.01.01', '보통주', 165] ['김준수', '상무', '신규선임(+)', '2021.01.01', '우선주', 300] ['김지훈', '상무', '신규선임(+)', '2021.01.01', '보통주', 165] ['김태연', '상무', '신규선임(+)', '2021.01.01', '보통주', 165] ['김판규', '상무', '신규선임(+)', '2021.01.01', '보통주', 135] ['김회일', '상무', '신규선임(+)', '2021.01.01', '보통주', 165] ['김훈', '상무', '신규선임(+)', '2021.01.01', '보통주', 135]
pd.DataFrame(data, columns=['보고자', '직책', '보고사유', '변동일', '종류', '증감'])
보고자 | 직책 | 보고사유 | 변동일 | 종류 | 증감 | |
---|---|---|---|---|---|---|
0 | 서강현 | 부사장 | 신규선임(+) | 2021.01.01 | 보통주 | 400 |
1 | 현동진 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 30 |
2 | 최종인 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 74 |
3 | 최영태 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 167 |
4 | 정대석 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 60 |
5 | 장현구 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 165 |
6 | 이승민 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 10 |
7 | 윤홍만 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 70 |
8 | 윤태종 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 160 |
9 | 윤광민 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 1105 |
10 | 오세민 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 60 |
11 | 여창기 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 42 |
12 | 박종태 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 60 |
13 | 박인환 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 30 |
14 | 박세혁 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 30 |
15 | 남성우 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 135 |
16 | 김상수 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 209 |
17 | 강동훈 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 80 |
18 | 김광현 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 30 |
19 | 김석종 | 상무 | 신규선임(+) | 2021.01.01 | 우선주 | 69 |
20 | 김석준 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 165 |
21 | 김준수 | 상무 | 신규선임(+) | 2021.01.01 | 우선주 | 300 |
22 | 김지훈 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 165 |
23 | 김태연 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 165 |
24 | 김판규 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 135 |
25 | 김회일 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 165 |
26 | 김훈 | 상무 | 신규선임(+) | 2021.01.01 | 보통주 | 135 |
2021-01-13 ~ 2021-02-01 사이의 모든 지분공시
import pandas as pd
data = []
# 2021-01-13 ~ 2021-02-01, 국민연금공단 제외
qry = "'2021-01-13' <= rcept_dt <= '2021-02-01' and repror != '국민연금공단'"
for ix, row in reports.query(qry).iterrows():
subdocs = dart.sub_docs(row['rcept_no'], match='소유상황')
dfs = pd.read_html(subdocs.iloc[0].url)
df = dfs[-1]
data_row = [row['repror'], row['isu_exctv_ofcps'],
df.iloc[0,0], df.iloc[0,1], df.iloc[0,2], df.iloc[0,4]]
data.append(data_row)
cols = ['보고자', '직책', '보고사유', '변동일', '종류', '증감']
share_reports = pd.DataFrame(data, columns=cols)
share_reports['변동일'] = pd.to_datetime(share_reports['변동일'])
share_reports
보고자 | 직책 | 보고사유 | 변동일 | 종류 | 증감 | |
---|---|---|---|---|---|---|
0 | 박상현 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -50 |
1 | 백익진 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -30 |
2 | 김훈 | 상무 | 장내매도(-) | 2021-01-06 | 보통주 | -135 |
3 | 이청휴 | 전무 | 장내매도(-) | 2021-01-11 | 보통주 | -200 |
4 | 정홍범 | 전무 | 장내매도(-) | 2021-01-14 | 보통주 | -150 |
5 | 서정국 | 전무 | 장내매도(-) | 2021-01-12 | 우선주 | -200 |
6 | 권순태 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -300 |
7 | 지영식 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -304 |
8 | 류준성 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -265 |
9 | 최서호 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -410 |
10 | 석동빈 | 상무 | 장내매도(-) | 2021-01-18 | 보통주 | -500 |
11 | 김철 | 상무 | 장내매도(-) | 2021-01-27 | 보통주 | -585 |
12 | 윤일헌 | 상무 | 장내매도(-) | 2021-01-26 | 보통주 | -408 |
13 | 박진호 | 상무 | 장내매수(+) | 2021-01-26 | 보통주 | 250 |
merged = pd.merge(share_reports, hmc['Close'], left_on='변동일', right_on=hmc.index)
merged
보고자 | 직책 | 보고사유 | 변동일 | 종류 | 증감 | Close | |
---|---|---|---|---|---|---|---|
0 | 박상현 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -50 | 261000 |
1 | 백익진 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -30 | 261000 |
2 | 서정국 | 전무 | 장내매도(-) | 2021-01-12 | 우선주 | -200 | 261000 |
3 | 김훈 | 상무 | 장내매도(-) | 2021-01-06 | 보통주 | -135 | 203000 |
4 | 이청휴 | 전무 | 장내매도(-) | 2021-01-11 | 보통주 | -200 | 267500 |
5 | 정홍범 | 전무 | 장내매도(-) | 2021-01-14 | 보통주 | -150 | 250500 |
6 | 권순태 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -300 | 250500 |
7 | 지영식 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -304 | 250500 |
8 | 류준성 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -265 | 240000 |
9 | 최서호 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -410 | 240000 |
10 | 석동빈 | 상무 | 장내매도(-) | 2021-01-18 | 보통주 | -500 | 241000 |
11 | 김철 | 상무 | 장내매도(-) | 2021-01-27 | 보통주 | -585 | 245500 |
12 | 윤일헌 | 상무 | 장내매도(-) | 2021-01-26 | 보통주 | -408 | 251500 |
13 | 박진호 | 상무 | 장내매수(+) | 2021-01-26 | 보통주 | 250 | 251500 |
merged['Amount'] = merged['증감'] * merged['Close']
merged
보고자 | 직책 | 보고사유 | 변동일 | 종류 | 증감 | Close | Amount | |
---|---|---|---|---|---|---|---|---|
0 | 박상현 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -50 | 261000 | -13050000 |
1 | 백익진 | 상무 | 장내매도(-) | 2021-01-12 | 보통주 | -30 | 261000 | -7830000 |
2 | 서정국 | 전무 | 장내매도(-) | 2021-01-12 | 우선주 | -200 | 261000 | -52200000 |
3 | 김훈 | 상무 | 장내매도(-) | 2021-01-06 | 보통주 | -135 | 203000 | -27405000 |
4 | 이청휴 | 전무 | 장내매도(-) | 2021-01-11 | 보통주 | -200 | 267500 | -53500000 |
5 | 정홍범 | 전무 | 장내매도(-) | 2021-01-14 | 보통주 | -150 | 250500 | -37575000 |
6 | 권순태 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -300 | 250500 | -75150000 |
7 | 지영식 | 상무 | 장내매도(-) | 2021-01-14 | 보통주 | -304 | 250500 | -76152000 |
8 | 류준성 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -265 | 240000 | -63600000 |
9 | 최서호 | 상무 | 장내매도(-) | 2021-01-15 | 보통주 | -410 | 240000 | -98400000 |
10 | 석동빈 | 상무 | 장내매도(-) | 2021-01-18 | 보통주 | -500 | 241000 | -120500000 |
11 | 김철 | 상무 | 장내매도(-) | 2021-01-27 | 보통주 | -585 | 245500 | -143617500 |
12 | 윤일헌 | 상무 | 장내매도(-) | 2021-01-26 | 보통주 | -408 | 251500 | -102612000 |
13 | 박진호 | 상무 | 장내매수(+) | 2021-01-26 | 보통주 | 250 | 251500 | 62875000 |
merged.groupby('보고사유').sum()[['증감', 'Amount']]
증감 | Amount | |
---|---|---|
보고사유 | ||
장내매도(-) | -3537 | -871591500 |
장내매수(+) | 250 | 62875000 |
reports.query('repror=="국민연금공단"')
rcept_no | rcept_dt | corp_code | corp_name | repror | isu_exctv_rgist_at | isu_exctv_ofcps | isu_main_shrholdr | sp_stock_lmp_cnt | sp_stock_lmp_irds_cnt | sp_stock_lmp_rate | sp_stock_lmp_irds_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
375 | 20210107000280 | 2021-01-07 | 00164742 | 현대자동차 | 국민연금공단 | - | - | 10%이상주주 | 27,800,627 | -508,200 | 10.04 | -0.18 |
407 | 20210118000146 | 2021-01-18 | 00164742 | 현대자동차 | 국민연금공단 | - | - | 10%이상주주 | 27,171,973 | -628,654 | 9.81 | -0.23 |
for ix, row in reports.query('repror=="국민연금공단"').iterrows():
url = f'http://dart.fss.or.kr/dsaf001/main.do?rcpNo={row["rcept_no"]}'
print(url)
http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20210107000280 http://dart.fss.or.kr/dsaf001/main.do?rcpNo=20210118000146
dart.sub_docs('20210118000146', match='소유상황')
title | url | |
---|---|---|
3 | 3. 특정증권등의 소유상황 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
0 | 임원ㆍ주요주주 특정증권등 소유상황보고서 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
1 | 1. 발행회사에 관한 사항 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
2 | 2. 보고자에 관한 사항 | http://dart.fss.or.kr/report/viewer.do?rcpNo=2... |
url = dart.sub_docs('20210118000146', match='소유상황').iloc[0]['url']
print(url)
http://dart.fss.or.kr/report/viewer.do?rcpNo=20210118000146&dcmNo=7764348&eleId=4&offset=9120&length=36400&dtd=dart3.xsd
nps = pd.read_html(url)[-1]
nps.head(10)
보고사유 | 변동일* | 특정증권등의종류 | 소 유 주 식 수 (주) | 취득/처분단가(원)** | 비 고 | |||
---|---|---|---|---|---|---|---|---|
보고사유 | 변동일* | 특정증권등의종류 | 변동전 | 증감 | 변동후 | 취득/처분단가(원)** | 비 고 | |
0 | 장내매수(+) | 2021년 01월 04일 | 보통주 | 21935679 | 1485 | 21937164 | 189420 | - |
1 | 장내매도(-) | 2021년 01월 04일 | 보통주 | 21937164 | -28419 | 21908745 | 189191 | - |
2 | 장내매수(+) | 2021년 01월 05일 | 우선주 | 5864948 | 4000 | 5868948 | 88466 | - |
3 | 장내매도(-) | 2021년 01월 05일 | 보통주 | 21908745 | -26793 | 21881952 | 192024 | - |
4 | 장내매수(+) | 2021년 01월 06일 | 보통주 | 21881952 | 11977 | 21893929 | 207852 | - |
5 | 장내매수(+) | 2021년 01월 06일 | 우선주 | 5868948 | 23720 | 5892668 | 92734 | - |
6 | 장내매도(-) | 2021년 01월 06일 | 보통주 | 21893929 | -49035 | 21844894 | 207631 | - |
7 | 장내매도(-) | 2021년 01월 06일 | 우선주 | 5892668 | -3685 | 5888983 | 92092 | - |
8 | 장내매수(+) | 2021년 01월 07일 | 보통주 | 21844894 | 2649 | 21847543 | 208680 | - |
9 | 장내매수(+) | 2021년 01월 07일 | 우선주 | 5888983 | 25211 | 5914194 | 92058 | - |
nps.columns = ['보고사유', '변동일', '종류', '변동전', '증감', '변동후', '취득단가', '비고']
nps['변동일'] = pd.to_datetime(nps['변동일'], format="%Y년 %m월 %d일", errors='coerce')
nps['취득단가'] = pd.to_numeric(nps['취득단가'], errors='coerce')
nps.head()
보고사유 | 변동일 | 종류 | 변동전 | 증감 | 변동후 | 취득단가 | 비고 | |
---|---|---|---|---|---|---|---|---|
0 | 장내매수(+) | 2021-01-04 | 보통주 | 21935679 | 1485 | 21937164 | 189420.0 | - |
1 | 장내매도(-) | 2021-01-04 | 보통주 | 21937164 | -28419 | 21908745 | 189191.0 | - |
2 | 장내매수(+) | 2021-01-05 | 우선주 | 5864948 | 4000 | 5868948 | 88466.0 | - |
3 | 장내매도(-) | 2021-01-05 | 보통주 | 21908745 | -26793 | 21881952 | 192024.0 | - |
4 | 장내매수(+) | 2021-01-06 | 보통주 | 21881952 | 11977 | 21893929 | 207852.0 | - |
nps.dtypes
보고사유 object 변동일 datetime64[ns] 종류 object 변동전 int64 증감 int64 변동후 int64 취득단가 float64 비고 object dtype: object
nps.tail()
보고사유 | 변동일 | 종류 | 변동전 | 증감 | 변동후 | 취득단가 | 비고 | |
---|---|---|---|---|---|---|---|---|
26 | 장내매수(+) | 2021-01-14 | 보통주 | 21374423 | 4703 | 21379126 | 253520.0 | - |
27 | 장내매수(+) | 2021-01-14 | 우선주 | 5912220 | 68684 | 5980904 | 112695.0 | - |
28 | 장내매도(-) | 2021-01-14 | 보통주 | 21379126 | -127396 | 21251730 | 259313.0 | 10%미만 |
29 | 장내매도(-) | 2021-01-14 | 우선주 | 5980904 | -60661 | 5920243 | 122982.0 | - |
30 | 합 계 | NaT | 합 계 | 27800627 | -628654 | 27171973 | NaN | - |
nps2 = nps.query('종류 == "보통주"')[['변동일', '증감', '변동후', '취득단가']]
nps2
변동일 | 증감 | 변동후 | 취득단가 | |
---|---|---|---|---|
0 | 2021-01-04 | 1485 | 21937164 | 189420.0 |
1 | 2021-01-04 | -28419 | 21908745 | 189191.0 |
3 | 2021-01-05 | -26793 | 21881952 | 192024.0 |
4 | 2021-01-06 | 11977 | 21893929 | 207852.0 |
6 | 2021-01-06 | -49035 | 21844894 | 207631.0 |
8 | 2021-01-07 | 2649 | 21847543 | 208680.0 |
10 | 2021-01-07 | -64277 | 21783266 | 208390.0 |
13 | 2021-01-08 | -118726 | 21664540 | 204853.0 |
16 | 2021-01-11 | -89002 | 21575538 | 207586.0 |
18 | 2021-01-12 | 33622 | 21609160 | 240412.0 |
20 | 2021-01-12 | -115290 | 21493870 | 244015.0 |
22 | 2021-01-13 | 71168 | 21565038 | 270972.0 |
24 | 2021-01-13 | -190615 | 21374423 | 269075.0 |
26 | 2021-01-14 | 4703 | 21379126 | 253520.0 |
28 | 2021-01-14 | -127396 | 21251730 | 259313.0 |
nps2['거래대금'] = nps2['증감'] * nps2['취득단가'] / 1e8
nps2
변동일 | 증감 | 변동후 | 취득단가 | 거래대금 | |
---|---|---|---|---|---|
0 | 2021-01-04 | 1485 | 21937164 | 189420.0 | 2.812887 |
1 | 2021-01-04 | -28419 | 21908745 | 189191.0 | -53.766190 |
3 | 2021-01-05 | -26793 | 21881952 | 192024.0 | -51.448990 |
4 | 2021-01-06 | 11977 | 21893929 | 207852.0 | 24.894434 |
6 | 2021-01-06 | -49035 | 21844894 | 207631.0 | -101.811861 |
8 | 2021-01-07 | 2649 | 21847543 | 208680.0 | 5.527933 |
10 | 2021-01-07 | -64277 | 21783266 | 208390.0 | -133.946840 |
13 | 2021-01-08 | -118726 | 21664540 | 204853.0 | -243.213773 |
16 | 2021-01-11 | -89002 | 21575538 | 207586.0 | -184.755692 |
18 | 2021-01-12 | 33622 | 21609160 | 240412.0 | 80.831323 |
20 | 2021-01-12 | -115290 | 21493870 | 244015.0 | -281.324893 |
22 | 2021-01-13 | 71168 | 21565038 | 270972.0 | 192.845353 |
24 | 2021-01-13 | -190615 | 21374423 | 269075.0 | -512.897311 |
26 | 2021-01-14 | 4703 | 21379126 | 253520.0 | 11.923046 |
28 | 2021-01-14 | -127396 | 21251730 | 259313.0 | -330.354389 |
# 누적 거래 대금
nps2['거래대금'].cumsum().plot(figsize=(12, 6), grid=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7f300db98eb8>
국민연금이 보유한 지분가치 5.5조에 비하면 약 1600억을 한달 동안 순매도 한 것이 크다고 볼 수 는 없지만 지속적으로 매도했다는 점은 눈여겨 볼 필요가 있습니다.
nps2 = nps.query('종류 == "우선주"')[['변동일', '증감', '변동후', '취득단가']]
nps2['거래대금'] = nps2['증감'] * nps2['취득단가'] / 1e8
# 누적 거래 대금
nps2['거래대금'].cumsum().plot(figsize=(12, 6), grid=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7f300dad1978>
2021 FinanceData.KR