Skip to content

재무제표

3 posts with the tag “재무제표”

파이썬으로 DART에서 재무제표 수집하기

이번 포스트에서는 전자공시시스템(DART)에서 제공하는 재무제표를 파이썬으로 다운로드하고 파싱하는 방법을 다룹니다.

DART에서 재무제표를 얻어오는 방법은 다양한데 여기서는 두 가지 방법을 다룹니다.

첫 번째로 단일회사 주요계정 API를 활용한 방법입니다.

DART Open API를 사용하려면 인증키가 필요합니다. 인증키 획득 방법은 이 포스트에서 확인하세요.

다음은 단일회사 주요계정 API를 호출하여 재무제표 정보를 획득하는 함수 입니다. 인증키, 회사 고유번호, 사업연도, 보고서 코드를 입력하여 재무제표를 받아올 수 있습니다.

def get_fs(crtfc_key, corp_code, bsns_year, reprt_code):
# 단일회사 주요계정
# crtfc_key API 인증키 STRING(40) Y 발급받은 인증키(40자리)
# corp_code 고유번호 STRING(8) Y 공시대상회사의 고유번호(8자리)
# ※ 개발가이드 > 공시정보 > 고유번호 API조회 가능
# bsns_year 사업연도 STRING(1) Y 사업연도(4자리)
# ※ 2015년 이후 부터 정보제공
# reprt_code 보고서 코드 STRING(5) Y 1분기보고서 : 11013
# 반기보고서 : 11012
# 3분기보고서 : 11014
# 사업보고서 : 11011
api = 'https://opendart.fss.or.kr/api/fnlttSinglAcnt.json'
params = {
'crtfc_key': crtfc_key,
'corp_code': corp_code,
'bsns_year': bsns_year,
}
data = []
reprt_name = REPRT_NAMES.get(reprt_code, "")
params['reprt_code'] = reprt_code
res = self._request(api, params=params)
if res is None:
return None
if res.status_code != 200:
return None
item = json.loads(res.text)
if item.get('status', '') != '000':
return None
for _item in item.get('list'):
_item['corp_code'] = corp_code
_item['reprt_code'] = reprt_code
_item['reprt_name'] = reprt_name
data.append(_item)
return data

get_fs(crtfc_key, '00266961', 2015, '11011')와 같이 호출하면 다음과 같은 결과를 받아올 수 있습니다.

[{'account_nm': '자산총계', 'bfefrmtrm_amount': '9,881,190,909,324', 'bfefrmtrm_dt': '2018.12.31 현재', 'bfefrmtrm_nm': '제 20 기', 'bsns_year': '2020', 'corp_code': '00266961', 'frmtrm_amount': '12,299,527,120,786', 'frmtrm_dt': '2019.12.31 현재', 'frmtrm_nm': '제 21 기', ...}, {'account_nm': '부채총계', 'bfefrmtrm_amount': '3,932,050,396,031', 'bfefrmtrm_dt': '2018.12.31 현재', 'bfefrmtrm_nm': '제 20 기', 'bsns_year': '2020', 'corp_code': '00266961', 'frmtrm_amount': '5,795,601,052,206', 'frmtrm_dt': '2019.12.31 현재', 'frmtrm_nm': '제 21 기', ...}, ...]

DART Open API 재무정보 일괄 다운로드

Section titled “DART Open API 재무정보 일괄 다운로드”

두 번째는 재무정보 일괄 다운로드로 한꺼번에 전체 기업의 재무제표 데이터를 받아오는 방법입니다. Open DART 사이트에서 공시정보 활용마당 / 재무정보 일괄다운로드를 클릭하면 다음과 같은 테이블을 볼 수 있습니다.

재무정보 일괄다운로드

여기서 다운로드 하면 해당 연도와 분기의 네 종류의 재무제표를 압축파일로 다운 받을 수 있습니다. 여기서는 다운로드, 압축해제를 포함하여 파이썬에서 재무제표를 읽어오는 방법을 다룹니다.

다음은 Selenium으로 다운로드 버튼을 클릭하여 파일을 다운로드하고 압축을 해제하는 코드입니다.

options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {
"download.default_directory": self.job_base,
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing.enabled": True
})
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
browser = webdriver.Chrome(executable_path=os.path.join(settings.QUANTYLAB_BASE, 'drivers/chromedriver'), chrome_options=options)
try:
browser.get('https://opendart.fss.or.kr/disclosureinfo/fnltt/dwld/main.do')
elem = browser.find_element_by_css_selector('table.tb01')
for elem_a in elem.find_elements_by_link_text('다운로드'):
filename = re.findall(r'.*\(.*\'(.+)\'\).*', elem_a.get_attribute('onclick'))[0]
# 파일 다운로드
elem_a.click()
time.sleep(10)
# 압축파일 로드
filepath = os.path.join(base, filename)
z = zipfile.ZipFile(filepath)
for info in z.infolist():
# 한글 파일명 인코딩 수정
_filename = info.filename.encode('cp437').decode('euc-kr')
_filepath = os.path.join(base, _filename)
if os.path.exists(_filepath):
continue
info.filename = _filename
# 압축해제
z.extract(info, base)
z.close()
except Exception as e:
print(str(e))
finally:
browser.quit()

이렇게 압축해제까지 하면 2020_1분기보고서_04_현금흐름표_20210211.txt과 같은 파일들이 생성되어 있을 것입니다.

이 텍스트 파일은 다음과 같이 pandas로 쉽게 DataFrame으로 읽어올 수 있습니다. 다만 sepencoding을 다음과 같이 적절하게 정해주는 것이 중요합니다.

df = pd.read_csv(filepath, sep='\t', encoding='cp949')

여기서 당기, 당기 1분기, 당기 반기 등의 다양한 컬럼이 생기는데 저는 이들을 당기로 통합하여 정리했습니다.

다음은 포괄손익계산서의 일부 항목을 나타낸 것입니다.

항목명결산기준일보고서종류당기
영업수익2018-12-31사업보고서5,586,904,533,355
영업이익(손실)2018-12-31사업보고서942,532,561,543
당기순이익(손실)2018-12-31사업보고서627,901,873,332

그런데 재무제표를 볼 때 항목의 흐름을 보는 것이 중요합니다. 예를 들어 영업 이익이 꾸준히 증가하고 있는지를 보고 싶은 것입니다.

그래서 동일 항목에 대해서 결산기준일 순서대로 DataFrame을 재구성하고자 합니다. 이를 위해 DataFramepivot 함수를 사용합니다.

df_pivot = df.pivot(values='value', index='항목명', columns='결산기준일')

동일 항목이지만 항목명이 다르게 적혀있는 경우가 있어서 이를 맞춰주는 처리를 했습니다.

그럼 다음과 같이 동일 항목의 값을 분기 순서대로 볼 수 있습니다.

항목명2015-12-312016-03-312016-06-302016-09-302016-12-312017-03-312017-06-302017-09-302017-12-312018-03-312018-06-302018-09-302018-12-312019-03-312019-06-302019-09-302019-12-312020-03-312020-06-302020-09-30
매출액3,251,157,100,000937,280,220,152987,281,364,2951,013,075,223,7704,022,629,619,9821,082,247,281,1961,129,631,366,8471,200,676,275,2204,678,468,928,0321,309,059,864,2481,363,615,953,3321,397,713,834,6745,586,904,533,3551,510,861,770,2821,630,275,004,3951,664,815,000,0786,593,400,065,2441,732,064,462,0971,902,467,957,4911,360,779,374,259
영업이익762,203,849,000256,827,536,675272,663,961,847282,298,051,5251,102,040,475,792290,797,289,304285,213,522,180312,084,238,4441,179,187,806,331256,980,563,870250,583,189,279221,718,402,565942,532,561,543206,244,504,954128,334,709,480202,086,039,366710,070,173,513221,495,078,328230,597,573,115291,726,798,004
당기순이익516,986,279,000165,036,146,535213,223,506,226198,000,157,034759,072,951,187210,876,050,870171,420,229,303215,798,264,368770,101,670,207153,751,654,038281,758,577,70168,386,763,908627,901,873,33287,585,903,29027,756,852,97585,268,053,088396,821,062,465134,874,581,86590,682,203,810235,342,965,699

[2021-01-15] 고려아연(010130) 종목분석

이번 포스트에서는 비철금속 제련 국내 1위 회사인 고려아연에 대해서 다양한 측면으로 분석한 자료를 공유합니다. 재무제표 참고 기준은 2020.11.16 분기보고서 입니다.

고려아연은 아연, 연, 금, 은을 생산 판매하고 있습니다. 아연의 경우 국내 시장 점유율이 90% 수준에 달하고 연시장에서도 30% 수준으로 매우 높은 국내 시장점유율을 가지고 있습니다.

다음 순서로 고려아연 종목분석을 다루겠습니다.

  • 기술적분석
  • 수급분석
  • 기본적분석
  • 재무제표 주요항목
  • 상관관계분석
  • 시계열분석

고려아연의 최근 240 거래일 일봉차트를 살펴보면 다음과 같습니다.

고려아연 기술적분석

  • 고가: 467,000
  • 저가: 276,500
  • 고가-저가: 68.9%
  • 현재가-저가: 49.2%
  • 현재가-고가: -11.7%
  • MDD: -36.3%

코로나19에 의해 큰 하락을 보인 이후 우상향하는 주가를 보이고 있습니다.

MACD와 RSI 지표를 봤을 때 매수 기회가 몇번 있었는데 MACD 차트에서 회색선(Signal)을 검정선이 상향돌파하면서 RSI가 30 부근으로 낮을 때로 볼 수 있습니다. 물론 MACD와 RSI만으로 투자 결정을 내리는 것은 매우 위험하므로 참고만 하는 것이 좋습니다. 기술적분석 보조지표에서 MACD, RSI 등의 상세 내용을 확인할 수 있습니다.

최근 개인, 기관, 외국인의 수급을 보면 개인은 매도, 기관은 매수, 외국인은 매도 포지션을 취하고 있습니다. 외국인은 2020년 8월 쯤에 많이 매집한 것으로 보입니다. 특히 최근 개인의 매도세와 기관의 매수세가 강한 상황입니다.

고려아연 개인기관외국인 수급

수급 점수를 보면 최근 5일 동안은 매도세가 강했으며 최근 20일 평균 매수세가 컸습니다. 매수세가 강하다가 매도세로 돌아선 상황입니다. 고려아연은 배당률이 높은 편이라 배당기준일 이후에 배당락이 꽤 큰 상황으로 보입니다.

고려아연 수급점수

고려아연의 다음 6가지 기본적분석 지표를 살펴보겠습니다. 2015년 부터의 최근까지 발표된 수치를 다룹니다.

  • 주당순자산 BPS(Book-value Per Share)
  • 주당순이익 EPS(Earning Per Share)
  • 주가순자산비율 PBR(Price Book-value Ratio)
  • 주가수익비율 PER(Price Earning Ratio)
  • 주당배당금 DPS(Dividend Per Share)
  • 배당수익률 DYR(Dividend Yield Ratio)

고려아연 기본적분석

PBR과 PER는 꽤 낮고 ROE는 10% 수준을 유지하고 있습니다. 주당배당금이 지속적으로 늘고 있는 모습입니다. 주가 상승 여력이 있어 보입니다.

이제 고려아연의 재무상태표, 손익계산서, 현금흐름표의 주요 항목을 살펴보겠습니다. 재무제표 보는 법에 대한 블로그 포스트가 있으니 관심있으시면 확인해 보시기 바랍니다.

재무상태표(Statement of Financial Position)

Section titled “재무상태표(Statement of Financial Position)”

먼저 재무상태표에서 자산, 유동자산, 비유동자산, 자본, 지배기업자본, 비지배기업자본, 부채, 유동부채를 차트로 그렸습니다. 꾸준히 자산이 늘고있고 부채도 적당하게 유지되고 있습니다. 재무 상태가 탄탄해 보입니다.

고려아연 재무상태표

손익계산서에서 매출액, 매출원가, 영업이익, 당기순이익을 살펴보겠습니다. 영업이익과 당기순이익이 꾸준하게 있기는 하지만 크게 상승하지는 못하는 모습입니다. 매출액과 매출원가를 보면 마진이 거의 일정하다고 볼 수 있습니다.

고려아연 손익계산서

현금흐름표에서는 영업활동현금흐름, 투자활동현금흐름, 재무활동현금흐름을 살펴보겠습니다.

고려아연 현금흐름표

최근 고려아연은 신사업을 위해 투자를 크게 늘려 투자활동현금흐름이 마이너스를 기록하고 있습니다. 여기서 영업활동 현금흐름과 재무활동 현금흐름을 보면 패턴이 보입니다 4년 정도의 주기로 영업활동현금흐름과 재무활동현금흐름이 큰 등락을 보이고 있습니다. 패턴대로라면 내년도 영업활동현금흐름이 좋지 않을것 같습니다. 비철금속의 거래 가격에 따라서 현금흐름의 패턴이 발생하는 것으로 보입니다. 원자재 가격이 하락해도 헤지를 잘 하고 있다는 것은 긍정적입니다.

이제 고려아연 주가와 주요 원자재, 코스피, 달러 환율과의 상관관계 살펴보겠습니다. 상관관계 수치로는 금, 아연, USD/KRW, WTI, 은, 코스피 순으로 나왔습니다. 여기서 정관계는 아연, WTI, 코스피로 나왔고 역관계로 금, USD/KRW, 은으로 분석되었습니다.

고려아연 금

2019년을 기점으로 전과 후의 관계성이 달라 보입니다. 여기서 상관계수가 -0.5 정도가 나왔는데 이는 2019년 이후 크게 상승한 금값 대비 고려아연의 주가가 하락해서 그런 것으로 보입니다.

고려아연 아연

고려아연 주가와 아연 가격과의 상관관계는 눈으로 보기에도 정관계로 매우 뚜렷합니다.

고려아연 USD/KRW

원달러 환율과 고려아연 주가는 역관계가 뚜렷합니다. 이 관계에 따르면 최근 원달러 환율이 크게 하락하여 주가에는 긍정적일 것 같습니다.

2020.11.16 분기보고서에서 환율 10% 변동시 자산ㆍ부채의 환산 변동금액이 법인세비용차감전순이익에 미치는 영향을 살펴보면 다음처럼 환율 변동이 이익에 영향이 생깁니다.

고려아연 환율 리스크

여기서 USD 환율이 가장 큰 변수이며 원달러 환율 하락시 이익에 긍정적임을 알 수 있습니다.

다음으로 고려아연 주가와 WTI, 은, 코스피와의 상관관계 차트인데 특별한 상관성이 보이지는 않습니다.

고려아연 WTI

고려아연 은

고려아연 코스피

마지막으로 ARIMA 시계열 분석을 참고삼아 살펴보겠습니다.

고려아연 ARIMA

주가 시계열을 모델링하는것은 불가능에 가깝습니다만 재미삼아 참고삼아 ARIMA 시계열 모델을 고려아연 주가에 적용해 보았습니다. ARIMA 모델 상에서는 주가가 우상향할 것으로 예측되고 있습니다.

어디까지나 투자는 본인의 분석과 결단으로 하는 것이므로 본 분석 내용은 참고만 하시길 당부드립니다.

그럼 이번 포스트는 여기서 마치겠습니다.

주식투자를 위한 재무제표 보는 법

재무제표(Financial Statements)는 어떠한 기업의 재무 관련 사항들의 기록입니다. 재무제표는 다음 네 가지 종류의 보고서와 주석으로 구성됩니다.

  • 재무상태표(Statement of Financial Position, SoFP) 또는 대차대조표(Balance Sheet)
  • 손익계산서(Income Statement)
  • 현금흐름표(Cash Flow Statement)
  • 자본변동표(Changes in Equity)
  • 주석(Notes)

많은 개인들은 물론이고 전문 투자자들도 재무제표를 제대로 보지않고 주식투자를 하는 경우가 많습니다. 사실 재무제표를 본다고 무조건적인 투자 수익을 볼 수 있는 것은 전혀 아닙니다. 그러나 주식투자에서 재무제표를 꼭 보는 것이 좋습니다. 그 이유를 몇 가지 들어보겠습니다.

  • 첫째. 위험한 종목을 피할 수 있다. 재무제표를 통해 재무 상태가 안좋거나 앞으로도 좋아지기 어려운 기업들을 확인할 수 있다.
  • 둘째. 현재 주가가 고평가인지 저평가인지 어느정도 감을 잡을 수 있다.
  • 셋째. 기업에 대한 이해도를 높임으로써 흔들림 없이 자신의 투자 철학을 지킬 수 있다.

이 포스트에서는 재무상태표, 손익계산서, 현금흐름표를 살펴보겠습니다.

재무상태표는 기업의 자산, 자본, 부채를 기록하는 재무제표입니다.

재무상태표

자산 = 자본 + 부채 등식이 성립됩니다. 통장에 1억의 현금이 있고 추가로 1억을 은행으로부터 대출받았다면 자산은 2억이 되는 식입니다. 언듯 보기에도 자본은 높은게 좋겠고 부채는 낮은게 좋겠습니다. 즉, 자산이 높다고 해서 안정적인 회사구나 하고 넘어가면 안된다는 것입니다.

자본은 다시 자본 = 자본금 + 자본잉여금 + 이익잉여금으로 나누어서 볼 필요가 있습니다. 자본잉여금은 주식과 관련된 경우가 많습니다. 자본을 충당하기 위해 유상증자를 할 경우 자본잉여금이 커지게 됩니다. 이익잉여금은 영업활동 등으로 발생하는 이익에 쌓여서 생기는 것입니다. 주식 투자 관점에서 일반적으로 자본잉여금은 적고 이익잉여금은 높은 것이 좋습니다.

손익계산서는 기업의 수익, 이익, 비용을 보여주는 재무제표입니다. 여기서 수익과 이익이 헷갈릴 수 있는데 이익 = 수익 - 비용으로 생각하면 편합니다. 즉 주식투자를 할 때 이익을 관심있게 보는 것이 좋습니다.

손익계산서

  • 매출총이익 = 매출액 - 매출원가
  • 영업이익 = 매출액 - 영업비용
    • 영업비용 = 매출원가 + 판매비와일반관리비
  • 영업외이익 = 영업외수익 - 영업외비용
  • 법인세비용차감전순이익 = 영업이익 + 영업외이익
  • 당기순이익 = 법인세비용차감전순이익 - 법인세비용

손익계산서에서 영업이익당기순이익을 꼭 확인하는 것이 좋습니다. 두 항목에서 연속으로 적자를 기록하년 종목은 웬만하면 피하는 것이 좋습니다.

현금흐름표는 영업활동, 투자활동, 재무활동을 통해 발생하는 현금성 자산의 변동을 기록하는 재무제표 입니다. 각 항목에서 현금이 유입되면 양수(+)가 되고 현금이 유출되면 음수(-)가 됩니다. 그런데 항목마다 양수일때 긍정적인게 있고 음수일 때 긍정적인게 다릅니다.

현금흐름표

영업활동에서는 현금이 유입되는 것이 당연히 긍정적입니다. 영업으로 인해 적자가 발생하면 영업활동 현금흐름은 음수(-)가 될 것입니다.

투자활동 현금흐름은 적당한 음수인 것이 좋습니다. 예를 들어, 사업 확장을 위해 시설을 늘린다면 투자비용이 발생할 것입니다. 반대로 사업을 축소하여 가지고 있던 시설을 처분한다면 투자활동에서 현금이 유입될 것입니다.

재무활동에서도 현금흐름이 음수인 것이 좋습니다. 은행에서 대출을 받았다면 재무활동 현금흐름은 양수이고 받았던 대출을 갚았다면 음수가 된다고 생각하면 됩니다.

전체적으로 봤을 때 영업활동(+), 투자활동(-), 재무활동(-)인 기업이 좋으며 반대로 영업활동(-), 투자활동(+), 재무활동(+)인 기업은 위험하다고 볼 수 있습니다.

다만 영업활동 > -(투자활동 + 재무활동)인 것이 좋습니다. 영업이익이 좋지 않은 상황에서 무리하게 사업을 확장하는 상황이 있을 수 있으니 각 현금흐름의 크기 또한 짚어봐야 합니다.

DART 오픈API를 통해 공시 정보를 코딩으로 획득할 수 있습니다. 공시정보 활용마당 > 재무정보일괄다운로드 메뉴에서 금융업제외 상장법인의 재무제표를 일괄로 다운받을 수도 있습니다.

퀀티랩을 통해 각 재무제표의 주요 정보를 차트로 제공하려고 준비중이니 관심가져주세요.

그럼 이번 포스트는 여기서 마치겠습니다.