콘텐츠로 이동
5 posts with the tag “재무제표”

기본적 분석 1장: 재무지표를 주가 데이터와 연결하는 법

재무지표와 가격 데이터를 연결하는 분석 장면

기본적 분석은 “좋은 기업을 찾는 방법”으로 설명되지만, 데이터 분석에서는 질문을 더 정확하게 써야 합니다.

특정 시점에 관측할 수 있었던 재무지표가 이후 수익률과 관련이 있었는가?

이 질문을 바꾸지 않으면 결과가 좋아 보여도 실제 투자 시점에는 사용할 수 없는 정보가 섞일 수 있습니다. 이 시리즈는 2024년 1월 2일부터 2026년 9월 4일까지의 가격·재무 데이터와 거래대금 상위 300개 종목을 사용한 탐색 분석입니다. 표본은 KOSPI 170개, KOSDAQ 130개이며 2025년 연간 재무 데이터를 보유한 종목은 294개입니다.

항목이번 시리즈의 기준
분석 단위종목-거래일 관측치
설명 변수PER, PBR, ROE, ROA, 부채비율, 마진, 성장률, 배당수익률 등
결과 변수관측일 종가 이후 5·20·60거래일 수익률
검증 구간2026-01-01 ~ 2026-09-04

단, 연간 재무지표가 실제 시장에 발표된 날짜까지 완전히 반영된 데이터인지 확인되지 않는다면 이 결과는 시점 누수 가능성이 있는 탐색 결과로 봐야 합니다. 연간 결산 숫자를 1월 1일부터 사용한 것처럼 처리하면 미래 정보를 과거에 미리 알고 투자한 셈이 될 수 있습니다.

import pandas as pd
prices = pd.read_csv("ohlcv.csv", dtype={"code": str})
prices = prices.sort_values(["code", "date"])
for horizon in [5, 20, 60]:
prices[f"forward_{horizon}d"] = (
prices.groupby("code")["close"].shift(-horizon)
/ prices["close"] - 1
)

이 수익률은 수수료, 세금, 슬리피지, 배당을 반영하지 않은 가격 수익률입니다. 신호를 종가 기준으로 계산했다면 체결은 다음 거래일로 미뤄야 하며, 그렇지 않으면 당일 종가를 알고 같은 가격에 매수한 것처럼 계산될 수 있습니다.

재무지표를 붙일 때 생기는 함정

섹션 제목: “재무지표를 붙일 때 생기는 함정”

재무지표를 거래일마다 반복해서 붙이는 것 자체는 편리하지만, 다음 조건이 지켜져야 합니다.

  • 재무지표의 기준일이 아니라 공시·발표일 이후에만 사용합니다.
  • 결측치를 전체 표본 중앙값으로 채우면 종목·섹터별 결측 패턴이 사라지므로 별도 표시합니다.
  • 현재 살아 있는 종목만 모으면 상장폐지·거래정지 종목이 빠지는 생존자 편향이 생깁니다.
  • 같은 기업의 연속된 거래일은 독립 표본이 아니므로 유의확률보다 기간별·종목별 재현성을 봅니다.

이번 시리즈에서 말할 수 있는 것과 없는 것

섹션 제목: “이번 시리즈에서 말할 수 있는 것과 없는 것”

현재 결과는 “어떤 지표가 반드시 주가를 예측한다”는 증명이 아닙니다. 동일한 표본과 제한된 기간에서 분위수별 미래 수익률이 어떻게 달랐는지 보여주는 가설 탐색입니다. 평균수익률 하나만으로 결론을 내리지 않고 중앙값, 양수 비율, 최대낙폭, 섹터별 결과를 함께 보겠습니다.

다음 장에서는 가장 널리 쓰이는 가치 지표인 PER을 보되, 금융업·적자 기업·일회성 이익처럼 PER이 왜곡되는 경우부터 분리해 보겠습니다.

  1. 이 숫자는 시장이 언제 알 수 있었는가?
  2. 미래 수익률의 시작 가격과 체결 시점은 일관적인가?
  3. 표본에서 빠진 종목은 없는가?
  4. 평균과 중앙값이 같은 방향인가?
  5. 다른 기간·섹터에서도 같은 결과가 나오는가?

이 다섯 질문에 답하지 못한 백테스트는 정교한 표보다 먼저 데이터 설계를 다시 봐야 합니다.


이 글은 교육 및 연구 목적의 자료이며 특정 종목의 매수·매도를 권유하지 않습니다. 과거의 분석 결과는 미래 수익을 보장하지 않습니다.

실적은 늘었는데 주가는 왜 못 오를까? 이익의 질과 밸류에이션 변화 분석

이익의 질과 밸류에이션 변화 분석 대표 이미지

실적 발표에서 매출과 영업이익이 모두 증가했는데 주가는 오히려 하락하는 경우가 있습니다. 이것은 시장이 실적을 보지 않아서가 아니라, 이익의 지속 가능성과 이미 가격에 반영된 기대를 함께 평가하기 때문입니다.

이 글에서는 원론적인 설명으로 끝내지 않고, 실제 분석 가능 종목을 같은 기준으로 훑어 “실적은 늘었지만 주가는 못 오른 종목”의 후보군을 추출합니다. 이 후보군은 매수 추천이 아니라, 왜 주가가 실적을 따라가지 못했는지 후속 확인할 출발점입니다.

회계상 이익과 현금이 같은 방향인지 확인하기

섹션 제목: “회계상 이익과 현금이 같은 방향인지 확인하기”

가장 먼저 볼 지표는 순이익 자체가 아니라 영업활동현금흐름입니다. 매출채권이나 재고가 빠르게 늘면서 매출이 증가했다면, 손익계산서의 이익이 아직 현금으로 회수되지 않았을 수 있습니다.

이익의 현금 전환 정도는 다음처럼 계산할 수 있습니다.

현금전환율영업활동현금흐름순이익
import pandas as pd
# df: 연도별 재무 데이터. 금액 단위는 동일하게 맞춥니다.
df = df.sort_values("fiscal_year").copy()
df["sales_growth"] = df["revenue"].pct_change()
df["operating_margin"] = df["operating_profit"] / df["revenue"]
df["cash_conversion"] = df["operating_cash_flow"] / df["net_income"]
df["receivable_growth"] = df["receivables"].pct_change()
print(df[[
"fiscal_year", "sales_growth", "operating_margin",
"cash_conversion", "receivable_growth"
]])

현금전환율이 낮다고 항상 부정적인 것은 아닙니다. 성장기 기업은 재고 확보나 매출채권 증가로 일시적인 차이가 생길 수 있습니다. 다만 이익은 증가하는데 영업활동현금흐름이 반복해서 따라오지 않고, 매출채권 증가율까지 높다면 이익의 질을 더 자세히 확인해야 합니다.

EPS 증가는 주주에게도 돌아가는 성장인가?

섹션 제목: “EPS 증가는 주주에게도 돌아가는 성장인가?”

순이익이 증가해도 유통주식수가 더 빠르게 늘면 주당순이익(EPS)은 줄어들 수 있습니다. 반대로 자사주 매입과 소각이 진행되면 순이익 증가율보다 EPS 증가율이 높아질 수 있습니다.

df["eps_growth"] = df["eps"].pct_change()
df["share_count_growth"] = df["shares_outstanding"].pct_change()
df["eps_gap"] = df["eps_growth"] - df["net_income"].pct_change()

따라서 “순이익이 증가했다”는 문장만으로는 부족합니다. 순이익, EPS, 주식 수의 방향을 함께 비교해야 실제 주주가 얻는 이익의 변화를 파악할 수 있습니다.

좋은 실적도 밸류에이션 하락을 이기지 못할 수 있습니다

섹션 제목: “좋은 실적도 밸류에이션 하락을 이기지 못할 수 있습니다”

주가는 대략 다음 두 요소의 곱으로 이해할 수 있습니다.

주가

EPS가 증가하더라도 시장이 적용하는 PER이 더 큰 폭으로 하락하면 주가는 내려갈 수 있습니다. 예를 들어 기업의 이익 전망이 개선되어도 금리 상승, 산업 성장률 둔화, 경쟁 심화 등으로 투자자가 지불하려는 배수가 낮아질 수 있습니다.

df["per"] = df["close"] / df["eps"]
df["per_change"] = df["per"].pct_change()
df["price_change"] = df["close"].pct_change()
print(df[["fiscal_year", "eps_growth", "per_change", "price_change"]])

이때 실적 증가와 주가 하락은 모순이 아닙니다. 시장의 질문이 “이번 반기 이익이 늘었는가?”에서 “이 성장률이 몇 년 더 유지될 수 있는가?”로 바뀐 결과일 수 있습니다.

전체 종목을 먼저 스크리닝했습니다

섹션 제목: “전체 종목을 먼저 스크리닝했습니다”

앞에서 설명한 지표를 실제 시장에 적용했습니다. 분석 기준일은 2026년 9월 4일입니다. 2025년 상반기와 2026년 상반기의 연결 기준 누적 재무 데이터를 비교하고, 주가는 2026년 6월 30일 종가부터 9월 4일 종가까지 측정했습니다.

전체 활성 종목 4,308개 중 재무제표·현금흐름·두 날짜의 주가가 모두 존재한 1,834개를 대상으로 다음 조건을 적용했습니다.

  • 매출액, 영업이익, 순이익이 모두 전년 동기 대비 5% 이상 증가
  • 2026년 6월 30일 이후 주가 수익률이 -10% 이하
  • 시가총액 3,000억 원 이상

그 결과 62개 종목이 남았습니다. 조건을 완화해 시가총액과 5% 성장 기준을 제외하면, 이익 세 항목이 모두 증가했는데 주가가 하락한 종목은 191개이고, 그중 주가가 10% 이상 하락한 종목은 110개였습니다.

아래는 주가 하락률이 큰 순서로 정렬한 상위 후보입니다. 숫자가 클수록 좋아 보인다는 뜻이 아니라, 시장이 실적 개선을 주가에 반영하지 않은 정도가 컸다는 뜻입니다.

종목산업주가 변화매출 증가영업이익 증가순이익 증가현금전환율 변화
브이엠특수 목적용 기계-51.7%+182.2%+696.3%+1,086.3%279.6% → 115.4%
신세계종합 소매업-49.3%+8.0%+75.7%+195.4%362.3% → 224.2%
성호전자전자부품-47.2%+30.6%+245.5%+8,582.5%247.1% → -11.0%
코리아써키트전자부품-46.6%+20.6%+918.7%+2,411.7%954.4% → 79.7%
씨어스의료용 기기-45.6%+406.6%+2,886.6%+2,839.6%-45.5% → 58.7%
로킷헬스케어의료용품·의약 관련-43.6%+67.6%+6,924.6%+742.3%466.4% → 131.4%
LG이노텍전자부품-42.7%+24.1%+296.4%+418.4%1,142.3% → 99.8%
케이씨텍정밀기기-40.8%+53.4%+149.4%+179.9%72.7% → 23.2%
SK하이닉스반도체-37.8%+230.8%+489.4%+788.9%120.4% → 68.3%
DB하이텍반도체-37.7%+21.9%+36.2%+91.2%103.6% → 83.9%
삼성전기전자부품-35.9%+20.7%+74.3%+108.4%241.7% → 182.5%
피에스케이특수 목적용 기계-35.5%+54.0%+125.6%+120.3%108.5% → 95.7%
에스에이엠티기계장비·도매-35.5%+160.1%+1,036.5%+1,207.9%-299.2% → -128.6%
와이지-원금속 가공제품-34.6%+44.0%+251.4%+741.1%-335.1% → -6.8%
SK기타 금융업-31.3%+28.6%+1,320.6%+535.2%60.4% → 15.9%

실적은 증가했지만 주가는 하락한 종목 스크리닝

이 표에서 바로 확인되는 것은 세 가지입니다. 첫째, SK하이닉스·삼성전기처럼 규모가 큰 반도체·전자부품주도 상위 15개에 들어옵니다. 둘째, 신세계처럼 현금전환율이 224.2%로 여전히 높아도 주가가 49.3% 하락할 수 있습니다. 셋째, 성호전자·에스에이엠티·와이지-원처럼 이익은 늘었지만 현금전환율이 음수인 종목도 있습니다. 같은 “실적 증가”라도 후속 확인의 우선순위가 달라지는 이유입니다.

분석에 사용한 파일은 반기 재무 데이터 CSV, 주가 데이터 CSV, 전체 후보군 CSV, 통합 JSONL입니다. 필드 설명과 계산식은 원자료 README에 정리했습니다.

후보군을 세 그룹으로 나눠야 합니다

섹션 제목: “후보군을 세 그룹으로 나눠야 합니다”

현금흐름도 따라오는 종목은 실적 증가와 현금 유입이 함께 나타난 경우입니다. 신세계의 현금전환율은 362.3%에서 224.2%로 낮아졌지만 여전히 100%를 크게 웃돕니다. 삼성전기도 241.7%에서 182.5%로 하락했지만 영업활동현금흐름의 절대 금액은 늘었습니다. 이 그룹은 “왜 주가가 이렇게까지 하락했는가”를 산업 전망과 밸류에이션에서 찾아야 합니다.

이익은 늘었지만 현금전환이 약해진 종목은 더 엄격하게 봐야 합니다. SK하이닉스는 상반기 영업이익이 489.4% 증가했지만 현금전환율은 120.4%에서 68.3%로 낮아졌습니다. LG이노텍도 1,142.3%에서 99.8%로 하락했습니다. 재고, 매출채권, 선급금, 세금 납부 시점 등 운전자본 변동을 사업보고서에서 확인해야 합니다.

기저효과가 큰 종목도 따로 분류해야 합니다. 성호전자처럼 순이익 증가율이 수천 퍼센트에 달하는 경우에는 전년 기준값이 작았거나 일회성 손익이 있었을 수 있습니다. 이때는 증가율 자체보다 올해 상반기 이익의 절대 규모, 다음 분기에도 유지되는지, 영업활동현금흐름이 플러스로 전환됐는지를 확인해야 합니다.

  • 매출 증가가 영업이익률 개선과 함께 나타났는가
  • 순이익 증가가 영업활동현금흐름 증가로 이어졌는가
  • EPS가 증가했으며 희석 주식 수는 어떻게 변했는가
  • PER·PBR이 과거와 업종 평균 대비 어느 수준인가

네 지표가 모두 긍정적이어도 주가가 즉시 상승한다는 뜻은 아닙니다. 이미 높은 기대가 주가에 반영되어 있거나, 산업 전체의 밸류에이션이 낮아지는 국면일 수 있기 때문입니다. 반대로 단기 이익이 둔화되어도 현금흐름과 수주, 재투자 효율이 개선된다면 시장이 미래 성장을 먼저 평가할 가능성도 있습니다.

이번 분석의 결론은 “실적이 좋아도 주가는 오를 수 있다”는 원론이 아닙니다. 실적이 개선된 종목을 실제로 쭉 뽑아보면, 1,834개 중 191개가 주가 하락 상태였고, 엄격한 기준에서도 62개가 남았습니다. 따라서 다음 질문은 ‘실적이 좋아졌나?’가 아니라 ‘이 62개 중 어떤 종목의 이익이 현금으로 이어지고, 어떤 종목이 기저효과나 운전자본 때문에 착시를 보이는가?’가 되어야 합니다.

후속 분석의 우선순위도 분명합니다.

  • SK하이닉스·삼성전기처럼 규모가 큰 종목: 산업 사이클과 기대 밸류에이션이 얼마나 낮아졌는지 확인합니다.
  • 신세계처럼 현금전환율이 100%를 웃도는 종목: 실적 대비 주가 하락의 원인이 소비 경기, 유통 업황, 배수 축소인지 확인합니다.
  • 성호전자·에스에이엠티·와이지-원처럼 현금전환율이 음수인 종목: 매출채권·재고·일회성 이익을 먼저 확인합니다.

즉, 이 글의 스크리닝 결과는 매수 목록이 아니라 검증 순서가 붙은 후보 목록입니다. 다음 분기에도 영업현금흐름과 이익이 함께 유지되는지, EPS와 주식 수가 같은 방향인지, PER이 실적 개선을 이미 반영했는지를 다시 대조해야 합니다.

이 글은 투자 판단을 위한 분석 방법을 설명하며, 특정 종목의 매수·매도를 권유하지 않습니다.

파이썬으로 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 재무정보 일괄 다운로드

섹션 제목: “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으로 읽어올 수 있습니다. 다만 sep과 encoding을 다음과 같이 적절하게 정해주는 것이 중요합니다.

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을 재구성하고자 합니다. 이를 위해 DataFrame의 pivot 함수를 사용합니다.

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

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

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

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

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

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

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

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

재무상태표

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

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

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

손익계산서

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

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

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

현금흐름표

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

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

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

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

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

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

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

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

[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)

섹션 제목: “재무상태표(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 모델 상에서는 주가가 우상향할 것으로 예측되고 있습니다.

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

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