본문 바로가기
데이터&AI/금융데이터

미국 주식 공시 Edgar 크롤링하기 (w. python)

by 일등박사 2023. 11. 29.
728x90

미국 주식 많이 투자하고계시지요!?

지난 포스팅에서는

미국의 공식 공시사이트 에드가(edgar)에서 공시를 확인하는 방법을 알아보았습니다.

2023.11.28 - [일등박사의 생각/데이터분석] - 미국주식 공시 확인하기!! (feat. 애플 배당공시 확인하기)

 

오늘은 이에 이어서,

에드가의 공시를 파이썬을 통하여 수집하는 방법을 알아보겠습니다!!

 


1. CIK 정보 수집

저희가 미국 상장 기업을 구분할때는 티커(ex. 애플 = AAPL, 테슬라 =TSLA) 로 구분합니다!

하지만 에드가에서는 이 티커가 아닌 CIK 를 key로하여 종목을 구분합니다.

※ CIK(Central Index Key) : EDGAR 시스템 내에서 기업이나 개인을 고유하게 식별하는 번호
CIK는 숫자로 이루어진 10자리의 식별자로, 기업이 SEC에 등록된 경우에는 이 CIK를 사용하여 해당 기업의 다양한 보고서 및 문서를 확인할 수 있습니다

 

이에 CIK와 미국주식 TICKER가 모여있는 데이터를 먼저 수집해야합니다!!

파이썬코드는 아래와 같습니다!

import requests
import pandas as pd
from bs4 import BeautifulSoup
# API 엔드포인트와 매개변수 설정

headers = [
{'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' },

]

tickers_cik = requests.get("https://www.sec.gov/files/company_tickers.json", headers=headers[0])
df_ticker =     pd.json_normalize(pd.json_normalize(tickers_cik.json(),max_level=0).values[0])
df_ticker["cik_str"] = df_ticker["cik_str"].astype(str).str.zfill(10)
# df_ticker.set_index("ticker",inplace=True)
df_ticker

 

위 코드로 수집하게되면 아래 이미지와 같이 TICKER와 CIK 코드를 매칭시킬 수 있습니다!

 

 

2. 공시 리스트 수집

이제 CIK 코드를 바탕으로 한 종목의 공시 리스트가 어떻게 되는지 확인하여야합니다!!

예를 들어 애플 종목의 모든 공시를 보고자할 떄에는 아래 URL을 확인하면 되는데요!

 

https://data.sec.gov/submissions/CIK0000320193.json

 json 형식으로 애플의 모든 공시데이터를 포함하고있습니다!

 

URL형식을 보면  https://data.sec.gov/submissions/{종목CIK번호}.json 로서 다른 종목에 연결할수 있기에

아래와 같이 코드를 만들면 됩니다!!

tic 변수에 필요한 티커를 넣으면 되지요~~

tic = 'AAPL'
cik = df_ticker[df_ticker['ticker']==tic]['cik_str'].iloc[0]
# API에 요청 보내기
url = f"https://data.sec.gov/submissions/CIK{cik}.json"
response = requests.get(url, headers=headers[0])
# 응답 데이터 확인
data = response.json()
df_filing = pd.DataFrame(data['filings']['recent'])
df_filing

 

 

코드를 실행하면 위의 이미지와 같이 애플의 모든 공시 리스트를 볼 수 있습니다!!

 

 

3. 공시데이터에 접근

이제 마지막입니다!! 공시 리스트 중에서 보고싶은 공시를 선정하여

해당 URL로 접근하면 됩니다!!

예시로는 배당정보가 포함된 가장 최근의 10-K의 보고서를 분석해보아요!!

tic = 'AAPL'
cik = df_ticker[df_ticker['ticker']==tic]['cik_str'].iloc[0]
# API에 요청 보내기
url = f"https://data.sec.gov/submissions/CIK{cik}.json"
response = requests.get(url, headers=headers[0])
# 응답 데이터 확인
data = response.json()
df_filing = pd.DataFrame(data['filings']['recent'])
df_10K = df_filing[df_filing['form'] == '10-K'].reset_index(drop=True)
df_10K

위 코드를 동하여 가장 최근에 배포된 10-K 보고서는 23년 9월30일에 나옴을 확인할 수 있습니다

 

 

이제 위 정보를 바탕으로 실제 공시 정보에 접근해봅시다!!

https://www.sec.gov/Archives/edgar/data/320193/000032019323000106/aapl-20230930.htm

 

aapl-20230930

 

www.sec.gov

 

위 주소가 가장 최근의 10-K보고서인데요!~,

아래와 같은 구조로 구성되어있지요~!!

 

recent_10K_url = f"https://www.sec.gov/Archives/edgar/data/{int(cik)}/{df_10K['accessionNumber'].iloc[i].replace('-','')}/{df_10K['primaryDocument'].iloc[i]}"

 

그래서 최종 코드!

i = 0
headers = [
{'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' },

]
recent_10K_url = f"https://www.sec.gov/Archives/edgar/data/{int(cik)}/{df_10K['accessionNumber'].iloc[i].replace('-','')}/{df_10K['primaryDocument'].iloc[i]}"
print(recent_10K_url)
res =requests.get(recent_10K_url,  headers=headers[0]) ## AAPL
res

를 실행하면!! 아래 이미지와 같이 XML 방식으로 데이터가 잘 수집됨을 확인할 수 있습니다!!

 

 

위 방식의 TICKER만 필요 종목으로 바꾸어주면!!

미국 상장된 모든 종목의 공시정보를 받아올 수 있겠지요!?

728x90

댓글