본문 바로가기

파이썬으로 퀀트 프로그램 만들기 project

(Python)국내 주식 가치 지표 계산하기_1

728x90

기본적인 지표에 대해서 소개해 드리겠습니다.

지표 설명 필요한 재무제표 데이터
PER Price to Earnings Ratio 순이익
PBR Price to Book Ratio 순자산
PCR Price to Cash Flow Ratio 영업활동으로 인한 현금흐름
PSR Price to Sales Ratio 매출액
DY Dividend Yield 배당

 

가치지표의 경우 연간 재무제표 기준으로 계산할 경우 다음 재무제표가 발표될 때까지 1년이나 기다려야 합니다.

반면 분기 재무제표는 3개월 마다 발표되므로 최신 정보를 훨씬 빠르게 반영할 수 있다는 장점이 있습니다.

일반적으로 최근 4분기 데이터를 이용해 계산하는 TTM(Trailing Twelve Months) 방법을 많이 사용합니다.

예제로 삼성전자의 가치지표를 계산하는 법을 살펴보겠습니다.

 

먼저 삼성전자 분기 재무제표 데이터를 가져와 봅시다.

#패키지 불러오기
from sqlalchemy import create_engine
import pandas as pd

# DB 연결
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/stock_db')

# 티커 리스트
ticker_list = pd.read_sql( """
select * from kor_ticker
where 기준일 = (select max(기준일) from kor_ticker)
and 종목구분 = '보통주';
""", con=engine)

# 삼성전자 분기 재무제표
sample_fs = pd.read_sql("""
select * from kor_fs
where 공시구분 = 'q'
and 종목코드 = '005930'
and 계정 in ('당기순이익', '자본', '영업활동으로인한현금흐름', '매출액');
""", con=engine)

engine.dispose()

 

 

가져온 데이터를 종목코드, 계정, 기준일로 정렬한 후에 ttm을 계산해보겠습니다.

 

sample_fs = sample_fs.sort_values(['종목코드', '계정', '기준일'])

#ttm 계산하기
sample_fs['ttm'] = sample_fs.groupby(
    ['종목코드', '계정'], as_index=False)['값'].rolling(window=4,
                                                 min_periods=4).sum()['값']

 

sample_fs를 보시면 자본데이터도 4배로 뻥튀기 되어있습니다. 다시 4로 나눠줄 필요가 있습니다.

그리고 다른 데이터들은 가장 최근 분기 데이터만 남겨주면 됩니다.

 

import numpy as np
sample_fs['ttm'] = np.where(sample_fs['계정'] == '자본',
                            sample_fs['ttm'] / 4, sample_fs['ttm'])
sample_fs = sample_fs.groupby(['계정', '종목코드']).tail(1)

 

지금까지 가치지표에서 분모에 해당하는 값을 구했으므로, 이제는 분자에 해당하는 시가총액을 구해야 합니다.

티커리스트에서 시가총액 확인 가능합니다.

sample_fs_merge = sample_fs[['계정', '종목코드', 'ttm']].merge(
    ticker_list[['종목코드', '시가총액', '기준일']], on = '종목코드')
    
#시가총액은 원 단위, 그러나 ttm단위는 억단위
#시가총액을 억으로 나눠서 단위를 맞춰줘야함
sample_fs_merge['시가총액'] = sample_fs_merge['시가총액'] / 100000000

 

이제 가치지표를 계산해보겠습니다.

#가치지표 계산
sample_fs_merge['value'] = sample_fs_merge['시가총액'] / sample_fs_merge['ttm']
sample_fs_merge['지표'] = np.where(
    sample_fs_merge['계정'] == '매출액', 'PSR',
    np.where(
        sample_fs_merge['계정'] == '영업활동으로인한현금흐름', 'PCR',
        np.where(sample_fs_merge['계정'] == '자본', 'PBR',
                 np.where(sample_fs_merge['계정'] == '당기순이익', 'PER', None))))

 

배당 수익률을 계산해보겠습니다.

티커 리스트에서 주당배당금이 있습니다.

주당 배당금 열을 종가 열로 나누면 배당수익률을 계산할 수  있습니다.

#배당수익률 계산
ticker_list_sample = ticker_list[ticker_list['종목코드'] == '005930'].copy()
ticker_list_sample['DY'] = ticker_list_sample['주당배당금'] / ticker_list_sample['종가']

 

다음 포스트에서는 전종목에 대한 가치지표를 계산해보겠습니다.