적정주가를 계산하는 공식은 굉장히 다양하게 있다. 

심플하면서 직관적인 공식 중 하나가 "PER X EPS"로 계산한 기대수익률이 아닌가 싶다. 


PER은 시가총액을 당기순이익으로 나눈 값으로, 

만약 PER = 10 이라면,

10년간 당해년도 당기순이익과 동일한 금액의 이익을 지속하게 되면, 이 기업의 가치(시가총액)과 동일해진다는 의미이다. 

PER가 낮다면 저평가 되있다고 판단하기도 하고, 기업 Valuation을 판단하는 기본적인 지표이다. 

물론 PER도 많은 함정이 숨어있고, 다른 업종에 동일한 Value를 부여하기 어려운 점이 있다. 

 

EPS는 주당 순이익이다. 

한 주당 얼마만큼의 순이익이 났는지에 대한 의미이다. 

예를 들어 특정 기업의 주가가 5만원인데, 주당순이익이 1만원이라면 EPS는 1만원이 되는 것이다. 

 

PER는 현재주식가격을 EPS로 나눈 가격과 동일하다. 

그래서 PER과 EPS를 곱한 값은 '주가'를 의미하게 되는데, 

 

평균 5개년의 PER에 EPS를 곱한값과 현재 주가를 비교해보면, 현재가 저평가 되있는지 아닌지를 판단하는 척도가 될 수 있다.

물론 현재 혹은 예상되는 EPS가 장기적으로도 유지되거나 우상향 한다는 가정하에서, 이 적정주가가 유효하다고 생각한다. 

 

7월 23일 크롤링해놓은 주가를 기준으로 

내가 항상 필터거는 (1) 3개년 ROE 15이상을 추가하여

return rate이 0보다 큰 회사를 뽑아보았다. (EPS는 2020년 말 기준이고, PER는 최근 5개년 기준이다.)

PER * EPS 기준 적정주가 

 

총 25개의 기업이 나왔고, 

이것도 등장한 기업에 '해석'을 더해줘야, 좀 더 의미있는 기업발굴이 가능하다. 

시디즈의 경우 예상수익률이 1441%로 엄청난 숫자가 나왔는데,

18년에 가구사업을 양수하면서 17년 EPS가 154원이고 PER가 100~300 수준이었고, 20년 기준 EPS가 8,672원이다. 

조금 더 최근성을 고려한다면 숫자가 달라질 수는 있겠다. 

728x90

한국거래소에서 크롤링을 통해 종목코드, 종목명, 업종에 대한 크롤링을 할 수가 있다. 


그걸 Fnguide에 있는 재무제표, 가치지표와 엮으면,

업종에 속해있는 회사의 수, 평균 PER, 평균 PBR, 평균 ROE, 평균 배당률, 평균 부채비율을 계산할 수 있다. 


PER이 낮고 PBR이 낮으면 회사가 저평가되있다고 말하는 경우가 있지만, 산업별로 그 잣대를 다르게 하는 것이 맞다고 생각하기 때문에, 

실제 한 종목에 대한 기업분석을 할 때, 업종별 정보가 어떤 기준이 되는 잣대가 되면 좋겠다는 생각에서 한번 살펴보았다. 


* 우선 기준은 2019.12월 기준의 재무제표를 크롤링한 것이기 때문에 업종수나, 평균 가치지표는 시점에 따라 상이해질 수는 있다.


과거에 종목정보(code)와 재무제표(data)정보를 크롤링한 글을 작성했었고, 그때 저장해놓은 database를 아래 쿼리를 통해 불러왔다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
select 
industry
, count(distinct code) as company_cnt
, sum(PER)/count(*) as avg_PER
, sum(PBR)/count(*) as avg_PBR
, sum(ROE)/count(*) as avg_ROE
, sum(배당수익률)/count(*) as avg_distri
, sum(부채비율)/count(*) as debt_rate
, sum(매출액) as total_revenue
from (
    select a.industry, b.*
    from code a
    join data b 
    on a.code = b.code
) a 
where year = '2019/12'
 
group by industry
order by avg_PER asc 
cs



우리나라에 얼마나 다양한 업종이 있을까? 매출 그리고 회사수 기준으로 봤을 때 가장 규모가 큰 업종은 무엇일까?



우리나라에는 156개의 업종이 있다. 먼저 매출규모 기준으로 정렬해보았을 때, 

통신 및 방송 장비 제조업이 가장 먼저 나오고, 그다음으로 기타금융업, 자동차용 엔진 및 자동차 제조업이 나온다. 

기타 금융업이 역시 평균적인 PER이나 PBR이 낮은 편이고 배당률이 높은 것을 확인할 수 있고, 

고배당주가 많은 석유 정제품 제조업 산업도 보면, 평균배당률이 2.82%나 됨을 바로 확인할 수 있었다.


(은행~ 보험업은 재무제표상 매출액이 아니라 순이자손익같이 다른 표현으로 적혀있어서, 크롤링이 안된거 같은데, 이거는 나중에 보정이 필요해보인다!!)


역시나 쉽게 예측가능하듯이, 1위 업종에는 삼성전자가 포함되어있다. 2019년 12월 매출액이 230조가 넘는다 ㅎㅎ 역시 어마어마한 기업이다. 


그럼 우리나라에 회사 수가 가장 많은 업종 순으로 정렬해보면 어떻게 될까? 



우리나라는 제조업 기반의 회사이기 때문에, 

특수 목적용 기계 '제조업', 전자부품 '제조업', 의약품 '제조업' 등.. 제조업이 참 많음을 확인할 수 있다. 


여기서 내 예상과 달리, 소프트웨어 개발 및 공급업이 2번째로 많은 업종임을 확인할 수 있었다.

(대충 토탈 매출액을 보았을 때, 2번째로 회사 수가 많은 업종인데, 매출액 규모가 작은걸로 봐서 코스닥에 해당 회사가 많이 상장 되어 있을 것 같다는 생각이 들었고, 

나중에는 코스닥과 코스피를 분리해서 보는 것도 재미있겠다는 생각이 들었다.)


그럼 소프트웨어 개발 및 공급업에는 어느 회사들이 있을까? 


넷마블이 가장 먼저 나왔다. 카카오나 네이버가 제일 먼저 나올 줄 알았는데, 또 업종이 오묘하게 다른가보다. 


카카오와 네이버는 '자료처리, 호스팅, 포털 및 기타 인터넷 정보매개 서비스업'으로 분류되어 있었다 ㅎㅎ 

IT기업이라 같은 업종으로 분류될 거라 생각했는데 생각보다 세부적으로 분류되있다는 느낌이 들었고, 나중에는 이것들을 clustering해서 같은 업종 별로 묶어서 지표를 보는 것도 의미가 있을 것 같다는 생각이 들었다.


다음번에는 Heatmap을 통해서 시각화해서 이것저것 인사이트를 줄 만한 게 무엇이 있을지 확인해서 정리해보려고 한다. 

그리고 이후에는 적정주가 계산하는 output에 회사의 지표, 업종 평균 지표를 column으로 추가하면서 다른 업종이라면 다른 기준을 두고 분석할 수 있도록 해야겠다. 

최종적으로는 이런 프로세스가 안정화가 되었을 때, 매주 한번씩 해당 tistory 에 csv파일로 공유하는 것이 목표이다!! 


728x90

* 적정주가를 3가지 방법으로 계산하고, 현재 주가 대비 return rate이 가장 높은 것 순으로 sorting하고 기업을 대략적으로 훑어보며 종목을 탐색한다. 현재 보유중이거나, 매수를 할지 고민하고 있는 종목들을 정리해보려고 한다.

 

Q1. 회사를 살펴보게 된 이유는?


사실 이번에는 적정주가 계산을 통해서 종목을 찾은 것은 아니고, 남자친구가 관심있게 보고 있는 종목이라고 해서, 잠시 살펴봤는데, 배당도 그렇고, 매출액, 영업이익, 당기순이익, 부채비율 등 재무제표가 만족스러워서(실제 가치보다 저렴한지 파악하기 전에) 기업을 살펴보게 되었다.



Q2. 무엇을 하는 회사인가?


국가 및 회사의 신용을 평가하는 회사이다. 크게 신용조회사업, 기업정보사업, 결제형 B2B사업을 하고 있으며, 신용조회사업이 매출에 차지하는 비율이 제일 크다. 


성장성은 어떠한가? 

정부기관에 납품하는 기업은, 신용정보회사의 신용등급서 제출 의무가 있다. 민간 영역에서도 신용인증서는 리스크관리 측면의 주요 지표로 널리 활용되고 있다. Q가 증가추세가 아니더라도 꾸준히 발생한다고 판단되었다.


경기변동은? 원재료는? 

새로운 재무정보가 생성되는 시점인 3~6월 매출 집중도가 높으며, 결제형 B2B 서비스도 거래금액에 따라 수수료 금액이 커지는 구조라, 산업 전체 경기변동에 동행하는 특성이 있다고 함. 그리고 원재료같은 건 없음. 신용인증, IT기술인력 즉, 인적자원인 사람으로 굴러가는 회사라 볼 수 있겠다.


조금 더 자세히 살펴보자.

신용인증서비스는, 대기업과 거래를 희망하는 협력업체가, 신용인증서 발급 신청을 하게 되면, 그에 따른 매출이 발생하게 된다. 여기서 포인트는 '유효기간이 1년'이라는 점이다. 매 해 갱신할 때마다 매출이 발생하므로 안정적이다. 그리고, 조회하는 기업의 규모가 늘어날 수록, 매출액 대비 이익이 커지고 변동비가 적게 된다. 


결제형 B2B는 중소기업간 거래의 결제를 중개하는 플랫폼이고, 여기서 발생하는 수수료로 수익을 얻는 사업이다.


결론적으로, 

시장 자체가 크고 있는지는 모르겠지만, 1년마다 고객사의 재무상태 등의 변화에 따라 갱신이 요구되는, 매출이 나름 안정적으로 발생하는 시장이고, 수익의 변동성이 엄청 클 것 같아 보이지는 않는다. 


매출같은 경우는, 신용조회사업 자체가 전체 매출의 92.6%를 차지하고 거의 내수 위주 (매출액 규모는 300중반 수준) 


Cost같은 경우는, 이용 기업 규모에 따라 5~45만원 정도. 왠지 C를 스스로 Control 할 수 있을 것 같았다.



Q3. 재무제표를 봐보자? 


매출액 : 5년간 약 10% 안쪽으로 꾸준히 증가하였고, 

영업이익, 당기순이익도 5년간 매 해에 거쳐서 감소 추세인 적이 없었다. 


영업활동을 통한 현금흐름도 꾸준히 증가/발생 하고 있다. 



부채비율도 20% 미만으로 안정적이고, 유동비율도 계속 500% 이상을 유지하고 있다. 

영업이익률, ROE가 우수하다. 역시 인력이 원재료(?)인 회사라 그런지, 영업이익률 자체가 제조업과 차원이 다르다. 


다만, 5년치로 봤을 때 매출액증가율이나 영업이익증가율은 감소하고 있다. 그래도 절대적인 매출액 규모 자체는 늘고 있고, 그 절대적인 증가량에 대한 비율 자체가 줄고있다는 뜻인데. Dart 사업의 내용에서도 적혀있듯이, 현재 막 성장하는 기업은 아닌 것 같다. 




한 주당 배당금액도 5년간 늘고 있고, 배당성향도 꽤나 높은 편이다. 





주당 순이익도 5년째 증가, PER은 16.37정도, PBR은 4.16정도, 5년간 큰 변화가 없다. 오히려 살짝 올랐음.




같은 업을 하는 회사(?)가 아닌가. 한국기업평가가 67% 지분율을 가지고 있다. 

네이버에 검색해보니, 피치(세계시장점유율15%)가 한국기업평가의 75%지분을 소유하고 있고, 한국기업평가는 67% 지분을 소유하고 있다. 외국이 우리나라에 비해 배당을 많이 주는데, 외국의 지분이 높으니, 여기도 배당이 높은가 하는 생각이 든다. 

그리고, 피터황의 똑똑한 배당주투자에서 보니, 대주주의 비율이 높을 수록 배당을 많이 주는 경향이 있다고 하는데 여기에서도 통하는 말인 것 같다. 


Q4. 그래서 주식 가격이 현재 매력적인가?  


적정주가 계산하기로 돌려보니, 기대수익률이 -16%가 나온다. 

현재 주가가 18,200원. PER*EPS는 17,849원, PBR*BPS는 17,911원, S-rim은 15,190원. 


현재가 저렴한 느낌은 아닌 것 같다. 코로나로 급락했을 때(그 땐 대부분이 가격이 많이 싸졌긴 하지만) 15,000원의 주가였다.

그리고 확실히 좋은 회사이고 탄탄한 회사여서 그런지 거의 브이자 형태로 다시 주가가 급등하였다. 


좋은 회사 같고, 재무상태표도 좋고, Q가 늘고 있는 시장인지는 모르겠지만, 수요도 꾸준히 안정적이고, 경기민감도 아니고, 주가 변동도 커보이지 않는다. 매수에 적정한 상황은 아닌 것같은데, 배당도 잘주니 조금만 지켜보다가 매수 고민을 해도 괜찮겠다 싶었다.

728x90

'재테크 > 종목분석' 카테고리의 다른 글

#11. 디티알오토모티브  (0) 2020.05.23
#10. 코텍 1분기 실적  (0) 2020.05.17
#8. 메리츠증권 (메리츠종금증권)  (0) 2020.04.30
#7 국보디자인  (0) 2020.04.20
#6. 한솔제지  (0) 2018.06.13

이전까지 적정주가를 계산하고, 이를 기반으로 기대수익률을 구해보았다. 


사실 가치지표와 재무지표 숫자들만 가지고 간단하게 적정주가를 계산한 것이기 때문에, 

경영진이나 아니면 시계열적인 회사의 변화나 경영환경의 변화들이 해당 기대수익률에 반영이 되지는 않는다. 


그래서 기대수익률만을 기반으로 투자를 할 생각은 없다.


하지만, 내가 분석을 잘못해서 골랐다고 하더라도, 실제 기대수익률이 높은, 그러니까 저평가된 종목이 실제로도 수익률이 높을 지 궁금해졌다. 


그래서 처음 적정주가를 계산한 4.17일과 4.29일 간의 수익률을 한번 비교해보고자 한다. 


물론 굉장히 짧은 기간이고, 가치투자라는 게 생각보다 장기적인 관점에서 주가가 올라갈 때까지 기다리는 것이지만, 

'코로나'라는 특이한 상황에 의해서 단기간에 주가가 올랐기 때문에, 정말 주가가 급등하는 시기에 기대수익률이 높은 게, 수익을 더 많이 안겨주는지를 확인해 볼 수 있을거라 생각했다. 


코스피가 3.19일이 최저점이어서 해당 주가를 크롤링하려했는데, 시간이 오래걸려서 우선은 4.17과 4.29를 비교해 보려하며,

생각보다 의미있는 결과가 나온것 같아서 틈틈히 주기적으로 확인해봐도 괜찮을 것 같다는 생각이 들었다. 


먼저, 4.19일의 기대수익률과 종가를 불러오고, 4.29일의 종가를 불러왔다. 

그리고 기대수익률에 대한 구간을 나눠서, 해당 구간 내의 평균 수익률을 한번 나타내보았다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
select 
case when return_rate > 100 then '1.기대수익률 100%~' 
     when return_rate > 75 then '2.기대수익률 75%~100%'
     when return_rate > 50 then '3.기대수익률 50%~75%'
     when return_rate > 25 then '4.기대수익률 25%~50%'
     when return_rate > 0 then '5.기대수익률 0%~25%'
     when return_rate > -25 then '6.기대수익률 -25%~0%'
     when return_rate > -50 then '7.기대수익률 -50%~-25%' 
     when return_rate > -75 then '8.기대수익률 -75%~-50%' 
     when return_rate > -100 then '9.기대수익률 -100%~-75%'      
     else '91.기대수익률 ~-100%' end as gubun
 
, round(sum(rate)/count(*),2) as avg_rate
from 
(
    select code, name, industry, main_product, round((end_price_4_29/ end_price - 1 ) * 100,2) as rate, return_rate,
    ntile(100) over (order by return_rate desc) as percentile, row_number() over(order by return_rate desc) as idx 
    from result
) a 
group by gubun
order by gubun asc
 
cs


대충 이렇게 쿼리를 작성하였다. 

기대수익률이 100%가 넘었던 종목, 75%~100% 사이인 종목 등으로 구분을 하였고, 그 구분에 따른 평균 수익률을 계산해보았다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
= test['quantile']
= test['cnt']
 
fig, ax = plt.subplots(figsize=(20,6))  
plt.plot(
    x, y, c="orange", ls = '-', marker = 'o', ms = 6
)
 
fig.suptitle("구간 별 수익률", size = 15, weight = 'bold', color='#3D2E2A')
fig.subplots_adjust(top=0.92# adjust the placing of subplot, adjust top, bottom, left and right spacing  
 
ax.set_xticks(x)
ax.tick_params(axis='y', which='both', labelsize=14, labelcolor = '#9B8C8E', color='#9B8C8E')
 
 
cs


seaborn을 통해서 간단하게 그래프를 그려보았고, 결과는 아래와 같다. 





우선 해당 기간동안 장이 좋았기 때문에 (물론 오늘 코스피는 2%넘게 하락하였지만) 구간별 수익률이 다 +이고, 중간에 업다운은 있지만, 

기대수익률이 낮을 수록, 실제 수익률이 낮아지는 경향성을 보임을 확인할 수 있었다.  


해당 수익률은 종목 2,000여개 전체에 대해서 한것이지만, 


실제 일반적으로 나는 '5개년간 ROE>0, 영업이익 >0, 배당수익률 > 0, 직전년도 배당수익률 >3%' 조건을 하나 더 걸어서 본다. 그렇게 조건을 두니, 

현재기준으로 139개의 종목이 나왔고, 그것을 바탕으고 구간 별 수익률을 구해보았다. 



우선 위의 조건을 걸게 되니, 기대수익률이 -75% 미만인 경우는 없나보다. 

여기서는 위에서보다, 기대수익률이 낮을수록 실제 수익률이 낮아지는 경향이 조금 더 뚜렷하게 보여진다. 


생각보다 적정주가가 저평가되있다면, 위로 올라갈 상승여력이 있고, 하방이 낮기 때문에, 적정주가 계산하는 것은 괜찮은 방법이라는 생각이 다시한번 들었다!


나중에 1월과 3.19일 급락때도, 저평가되있는 종목이 하락률이 더 낮았는지도 확인을 해봐야겠다. 

주가 크롤링이 page가 넘어가면 잘 안되는 경향이 있는데, 한번 확인해보면 재밌을 것 같다.

728x90

(1) 5개년치 재무제표 불러오기 (fnguide)

(2) 종목 별 주가(가장 최근) 불러오기

(3) Database에 저장하기

(4) PER&EPS, PBR&BPS, S-RIM으로 적정주가 산출 및 기대수익률 구하기

(5) 기대수익률 순으로 Sorting하기

(6) Hyper Parameter 기반으로, 조건 정교화하기

위의 순서대로 적정주가 계산하는 간단한 프로그램을 만들려고 한다. (파이썬을 이용하였다.)

 

-----------------------------------------------------------

 

제목을 자동화라고 거창하게 적었지만 사실 별게 있진 않다. 

 

기존에는 주가 날짜를 '날짜 = '2020.04.17'' 과 같은식으로 직접 입력해서 ipynb를 통해 수동으로 돌렸다. 

하지만, 이제는 어느정도 체계가 잡혔기 때문에, stock.py 파이썬 파일을 만들고, 쉘스크립트에서 돌릴 수 있도록 수정하였다.

 

3시30분에 한국주식장이 종료되니까, 그날 종가를 기준으로 적정주가를 계산할 수도 있겠지만, 

하루의 변동폭이 엄청나게 큰 것은 아니기 때문에, '어제' 날짜를 불러와서 적정주가를 계산하도록 만들어놓았다. 

1
2
3
4
5
from datetime import date, timedelta
 
yesterday = date.today() - timedelta(1)
date = yesterday.strftime('%Y.%m.%d'
 
cs

이렇게 어제 날짜를 불러오고, 이를 print해보면 현재 글을 쓴 기준인 5.1일의 하루전인 '2020.4.30'이 print되는 것을 확인할 수 있다. 

물론... 이날은 공휴일이기 때문에 주식장이 열리지 않는다. 그래서 Test는 다른날짜로 임의로 수정해서 돌려보았다. 

이렇게 date를 만들어놓고, 하드코딩으로 넣었던 날짜를 date로 수정하고, stock.py파일을 만들면 기본적인 것은 완성이다. 

 

이런식으로 stock.py 파일이 생성이 되었고, 이걸 돌리는 run.sh 을 만들었다. 

사실 매개변수를 python파일 안에서 설정해주기 때문에, 그냥 그대로 돌려도 괜찮을 것 같긴 하지만, 우선은 쉘에서 돌리는 것으로 해놓았다.

 

너무 단순하지만, 우선 stock.py가 있는 경로를 설정해서 python을 돌리도록 만들어놓았다. 

그다음 sh.run을 하게 되면 실행이 된다! 다행히 한방에 되었다.

 

이렇게 종목 하나하나에 대해서 크롤링이 되고, 완성이 되면, csv파일로 해당일자에 대한 적정주가가 떨궈진다. 

 

어제 날짜가 공휴일이어서, 우선 임의로 4.17일로 만들었는데, 다행히 잘 생성이 되었다. 

이제 종목분석을 시작하기 전에 이 python 스크립트를 실행시킨 후, 어떤 게 기대수익률이 높은지를 확인할 수 있게 되었다. 

 

내가 원하는 기본적인 틀은 완성이 되었고,

나중에 조금 더 필터조건을 정교하게 하는 것,

그리고 왜 이게 기대수익률이 높은 것으로 계산되었는지에 대한 설명변수(shap)를 추가할 수 있도록 하려한다.

그리고 나중에는 word2vec을 통해서 기업간의 유사도를 확인해보거나, nlp를 활용해서 업종 / 주요상품 데이터를 활용해서 동종업종을 군집화하고, 동종업종간의 기대수익률을 비교해보려고 한다. 아직 지식이 짧아 언제 하게 될지 모르겠지만, 찬찬히 시도해봐야지. 

728x90

(1) 5개년치 재무제표 불러오기 (fnguide)

(2) 종목 별 주가(가장 최근) 불러오기

(3) Database에 저장하기

(4) PER&EPS, PBR&BPS, S-RIM으로 적정주가 산출 및 기대수익률 구하기

(5) 기대수익률 순으로 Sorting하기

(6) Hyper Parameter 기반으로, 조건 정교화하기

위의 순서대로 적정주가 계산하는 간단한 프로그램을 만들려고 한다. (파이썬을 이용하였다.)

 

-----------------------------------------------------------

 

재무제표 불러왔고, 주가도 불러왔다. 

 

이걸 활용해서, 적정주가를 산출하고, 그걸 통해 기대수익률을 계산하고자 한다. 

적정주가를 계산하는 방법은 다양하게 있는데 비교적 단순하게 계산가능하고 의미가 직관적인 PER*EPS, PBR&BPS를 활용하였고,

사경인 회계사가 쓴 책에 나오는 S-RIM을 활용하였다. 

 

우선 아래와 같은 산식으로 계산을 하였고, 기대수익률은 보수적으로 저 3가지 적정주가 중에 가장 비싼것과 비교를 하였다.

 

PER&EPS : EPS * (5개년 PER평균) 

PBR&BPS : BPS * (5개년 PBR평균) 

S-RIM : BPS * (ROE 가중평균)/기대수익률 

 

작성한 쿼리는 아래와 같다.

여기서 몇가지 조건을 더 추가하였는데, 

5년간 당기순이익, 영업이익, ROE, 배당수익률이 > 0 인 종목만 가져오도록 하였다. 

 

나는 배당을 잘주고, 이익이 꾸준히 나는 회사를 선호한다. 좀 더 조건을 보수적으로 줄 수도 있지만,

우선은 정말 최소한의 조건으로 filter를 걸었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
select 
code
, name
, industry
, main_product
, end_price
, per_eps
, pbr_bps
, bps * ((3*roe_1 + 2*roe_2 + 1*roe_3)/6)/8 as srim
, case when per_eps > pbr_bps and  bps * ((3*roe_1 + 2*roe_2 + 1*roe_3)/6)/8 > pbr_bps 
        then (pbr_bps-end_price)*100/end_price 
       when pbr_bps > per_eps and  bps * ((3*roe_1 + 2*roe_2 + 1*roe_3)/6)/8 > per_eps 
        then (per_eps-end_price)*100/end_price
  else (bps * ((3*roe_1 + 2*roe_2 + 1*roe_3)/6)/8 - end_price)*100/end_price end as return_rate
from
(
    select
    a.code
    , c.name
    , c.industry
    , c.main_product
    , b.종가 as end_price
    , (sum(PER) / count(*)) * sum(case when inx = 1 then EPS else 0 end) as per_eps
    , (sum(PBR) / count(*)) * sum(case when inx = 1 then BPS else 0 end) as pbr_bps
    , sum(case when inx = 1 then BPS else 0 end) as bps
    , sum(case when inx = 1 then ROE else 0 end) as roe_1
    , sum(case when inx = 2 then ROE else 0 end) as roe_2
    , sum(case when inx = 3 then ROE else 0 end) as roe_3
    , sum(case when 당기순이익 > 0 then 1 else 0 end) as earn 
    , sum(case when ROE > 0 then 1 else 0 end) as roe 
    , sum(case when 영업이익 > 0 then 1 else 0 end) as earning
    , sum(case when 배당수익률 > 0 then 1 else 0 end) as distribution
from 
(   select * , row_number() over(partition by code order by year desc) as inx
    from data
) a
join 
(
    select code, 종가
    from price
    where 날짜 = '2020.04.17'
) b
on a.code = b.code
join
(
select code, name, industry, main_product
from code
) c 
on a.code = c.code
group by a.code
) x
where 
earn = 5 and roe = 5 and earning = 5 and distribution = 5
order by return_rate desc
 
cs

드디어 거의 끝이 보인다. 

1
2
3
4
5
cur.execute(query)
test = DataFrame(cur.fetchall())
test = test.rename(columns={0 : 'code'1 : 'name'
                            , 2 : 'industry'3 : 'main_product'
                            , 4 : 'end_price'5 : 'per_eps'6 : 'pbr_bps'7'srim'8 : 'return_rate'})
 
cs

위에서 정의한 query를 실행하고, dataframe에 넣었다.

쿼리에서 return_rate이 높은 순으로 정리를 하였으니, 기대수익이 높다고 보여지는 것부터 추출이 될 것이다. 

이런식으로 종목명, 산업, 주요제품, 현재주가, 적정주가, 기대수익률 순으로 값이 나온다. 참 깔끔하다. 

참좋은여행은 코로나 때문에 주가가 많이 떨어져서인지, 다른 이유가 있는것인지 굉장히 상위에 올라와있다.

return_rate이 0보다 큰 것을 세보았을 때 4.17일 기준으로 274개가 나온다.

 

여기에 industry와 main_product를 적은 이유는, 단순히 기대수익률이 높다고 무턱대고 사지 않기 위함이다.

산업의 구조적인 특성상 PER, PBR이 낮게 나오는 경우가 있기도 하고, 이에 따라 굉장히 값이 싸다고 비춰지는 경우도 있다.

또한 PER, PBR을 5개년 평균으로 썼기 때문에, 해당 가치지표에 대한 변동성이 큰 종목이라면 또 왜곡되서 비춰질수도 있다.

 

그렇기 때문에, 무조건적으로 여기서 기계적으로 나온 값을 믿고 매수하는 것은 위험할 수 있다.

 

처음에 적정주가를 계산하는 것을 만들기 위한 목적도,

종목을 바로 고르기 위함이 아니라, 내가 탐색할 종목의 우선순위를 정하기 위함이었다.

 

여기서 이제 눈으로 차차 살펴보면서, 괜찮아보이는 종목의 사업보고서를 읽고 재무제표를 보고서 종목선정을 판단하려고 한다.

 

그 다음글에서는 쉘 스크립트를 짜서, 주식 장이 끝난 후 쉘을 돌리면, 해당일 기준으로 csv파일을 떨궈주도록 하는 과정을 적어보려 한다.

728x90

+ Recent posts