18년에 발굴했던 종목이라 팔로업이라고 하기 애매하지만, 

팔로업은 보통 좀 더 가볍게 하기 때문에, 한번 종목발굴 폴더에 작성했던 종목은 여기에 작성하려고 한다. 

 

https://dailyeundongee.tistory.com/14?category=789088

위 글에 정리했듯이, 

코텍은 카지노 모니터를 주력으로 판매하는 회사이다. 

 

그 당시에는 재무도 좋고 매출, 영업이익도 잘 나오는 회사라서 좋게 생각을 했었는데 하필 작년에 '코로나'가 터졌다. 

 

많은 회사들이 코로나에 매출 영향을 받았지만, 오히려 단기에 회복이 되고, 더 높은 수익을 내면서 

코로나 이전보다 코스피 코스닥 지수는 점점 올랐다. 

 

하지만.. 코텍은 아직 코로나 이전을 회복하지 못한 기업 중 하나이다. 

네이버 증권정보 

위에 차트를 보면 21.6월 백신 기대감, 백신으로 코로나를 이겼다는 나라들이 일부 등장하면서, 주가가 약간 올랐다가, 

델타변이 등으로 다시 주춤하는 모습이 보여진다.

 

우리나라는 아직 느리지만, 

일부 선진국들은 백신 접종률이 60%를 상회하면서 마스크를 벗는 일상을 되찾은 곳이 있다. 

 

출처 : 카지노 관련 기사 (연합뉴스)

실제 위에 기사를 보면, 미국의 올해 2분기 카지노업계가 역대 최고 실적을 냈다고 한다.

이제 슬슬 코텍을 매수해도 좋은 시기가 왔다는 생각이 든다. 

 

출처 네이버 증권정보

 

현재 재무제표를 보면 20.12월 기준 당기순이익 적자를 냈고, 올해도 사실 적자가 예상된다. 

하지만, 그런 적자를 감내 할 수 있을만큼 현금이 충분하며,

이전의 실적들을 볼 때, 코로나가 정상화되었을 때, 이전만큼의 당기순이익을 낼 수 있다고 생각한다. 

 

지금 시총이 1589억원으로 19년처럼 308억의 당기순이익을 내게 된다면, 

PER가 5대가 되고, 어느정도 상승여력이 있다고 판단된다. 

728x90

개별 기업에 대한 분석도 중요하지만, 산업에 대한 특징을 이해하는 것도 정말 중요하다는 걸 느끼고 있다. 

 

아래는 정리한 내용들 + 생각 

 

1. 통신업

- 성장성보다는 안정성이 더 강한 업종

- 봐야하는 것은 ARPU와 가입자수. ARPU는 규제가 있기도 함, 알뜰폰 제외 3사 간 경쟁도 치열

- 고정비가 많이 드는 특징을 가지고 있음, 주파수 경매 등 종종 큰 규모의 투자가 필요하나, 매달 들어오는 현금흐름(고객에게 받는 통신비)이 어마무시하기 때문에 또 감당이 가능함.

 

2. 유선방송 산업

- 산업 자체의 성장성이 정체되다보니, 매력적으로 다가오진 않는다 : 젊은 세대들이 TV 앞을 떠나다보니, 유선방송과 홈쇼핑 기업의 실적은 자연스럽게 악화

- 상장된 케이블방송사 모두 본 사업에서 매출 및 가입자, ARPU가 감소 추세 

- 성장이 정체되있어서, PER, PBR도 낮게 측정되지만, 어느 수준을 유지할 수 있는 방법이 '고배당'주로서의 지위를 누리는 것 

- 본업에 충실해서 돈을 잘 버는 게 아닌, 고배당으로 투자자를 유혹하는 것은 현재 내 투자방식에 맞지 않음. 다만 seed가 커지고, 배당주의 포트비중을 싣어야 할 때, 한번 살펴봐도 좋을 것 같음. 

 

3. 엔터테인먼트 산업

[기획사]

- SM, YG, JYP 등이 있고(현재는 BTS가 포함된 빅히트도 있음), 핵심은 소속 연예인의 역량과 회사의 기획력이다. → 이에 좋은 연예인을 비싼 몸값으로 데려옴 (전속계약금) 

- 어떻게 돈을 벌 수 있을까? 

   - 연예인이 자신의 수익 배분 몫과 전속계약금상각비를 초과하는 금액 이상으로 벌어오기

   - 수익배분 비율이 비교적 낮은 신인연예인을 잘 잘 발굴하기

   - A급 연예인이 출연하는 프로그램에 소속사의 아이돌급 연예인 같이 출연시키기

[음원 유통사] 

- 멜론, 벅스, 지니뮤직, 엠넷 등이 있다

- 수익구조는 음반제작자 44%, 음원서비스사업자가 40%, 통신사 수수료 제외, 30% 남음

[방송 및 영화제작, 배급] 

- 엔터테인먼트 업종이나 게임산업등은 아무래도 흥행하고 대박나야 실적이 좋아질 수밖에 없는 특징이 있고, 주가 또한 이에 비례함 

- 이런 것에 문외한인 나는 예측 쉽지 않음, 다만 1~2년에 한번은 대작이 나온다는 가정하에, 주가가 바닥일 때 투자하는 것도 방법이 될 수 있다고 함. (회사의 재무가 탄탄하단 전제) 

- 과거 스튜디오 드레곤 분석할 때 이부분을 읽었었는데 선급금 → 판권(무형자산) → 정산 후 매출인식. 흥행 실패하면 무형자산 상각비가 커져서 적자 발생할 수 있는 우려가 있음. 다만 보통 손익분기점 고려해서 실패해도 적자라기 보다 본전 인 경우가 많다고 함.

 

4. 광고산업 

- 광고주 ↔ 광고대행사 ↔ 미디어렙사 ↔ 매체사 

- 미디어어렙이 존재하는 이유는, 광고주와 미디어간의 '불공정'을 차단하기 위한 취지 KOBACO가 독점했었고, 현재는 다양한 미디어렙 생겨남.

- 중간 중개역할을 하는 미디어렙은 매출규모가 작은편, 대행사나 매체사 쪽에 관심을 갖는 것이 좋음.

- 성장성 : 광고주 기업의 광고선전비 집행에 dependency가 있고, 국내 경제 규모의 성장과도 밀접한 연관을 보이고 있음. 기업도 매출액의 일정 비율을 예산에 책정해서 집행함. 

- 전파매체, 인쇄매체를 줄이고 뉴미디어를 증가시키는 것이 시대의 흐름이나 이익률 고려했을 때 회사에 도움이 되는 건 전파매체나 인쇄매체

- 뉴미디어 시대의 중소광고기업들 : 나스미디어, 에코마케팅, 인크로스, 인크로스는 '다윈'이라는 네트워크 플랫폼(영상 시청 앞서 봐야하는 광고 동영상을 노출해주는 플랫폼) 

- 네이버와 카카오 : 기대감으로 주가가 상승하는 경향이 커서 사업보고서로 기업 설명하는 데엔 한계가 있음. 이책이 나온 2016년보다 두 회사는 주가가 정말 많이 올랐다. 

 

5. 게임산업 

- 게임산업은 영업이익률이 높은 경우가 많다. 

- 수익구조 : 퍼블리셔 60%, 개발사 40%. 구글이나 애플에 수수료 30% 내고, 카카오 기반 게임인 경우 51%의 수수료를 낸다. 구글 30%수수료는 국내 뿐만 아니라 외국에서도 말이 많음. 

- 저건 어쩔 수 없다면, 카카오에서라도 탈피해서 수직계열화 시키는 것이 중요!! 물론 카카오에 게임을 론칭하면 더 빠르게 인지도가 올라갈 수 있지만, 수익구조 측면에서는 좋지 않다. 

- 그렇기 때문에 게임 산업 내에서 좋은 기업을 찾으려면, 

   - 개발과 퍼블리싱 능력을 모두 보유하고 있는지 체크

   - 탄탄한 라인업을 갖추고 있는지

   - 자체 플랫폼을 보유했는지

   - 지적재산권(IP)를 가진 회사인지 확인할 필요가 있다.

 

6. 카지노 산업

- 통신업 공식에 대입해보면, 입장객수 X (한 명이 잃고 가는 돈) 으로 매출이 발생한다. 그러니까, 입장객수는 꾸준히 늘 수 있을까?, 한 명이 잃는 돈이 점점 증가할까? 관점

- '워터파크 개장'등 추가로 증설하는 투자가 생기면, → 입장객수가 늘 수 있고, 테이블 회전수가 빨라지면 한 명이 잃는 돈이 많아질 수 있다

- 현재 코로나 시기가 전세계적으로 언제 괜찮아질 지 모르겠어서, 크게 매력적으로 끌리는 산업은 아니다. 강원랜드같은 회사보다 오히려 카지노 모니터를 전세계에 생산하는 코텍이 더 괜찮아보임

 

7. 항공산업

- FSC와 LCC로 분류된다. FSC의 대한항공과 아시아나항공은 현재 합병의 절차를 밟고 있음. 

- FSC는 비행기를 사서 운영하고, LCC는 비행기를 빌려서 운항을 하는 구조

- 연료유류비가 비용의 가장 높은 비용, 그 다음이 인건비>상각비 등의 순이다. 

- FSC는 비행기에 대한 감가상각비가 큰 편이고, LCC는 임차료 및 정비비가 큰 편. 

- 현금흐름측면에서 LCC가 FSC보다 우수할 수밖에 없고, 항공산업에 투자하고자 한다면 LCC 중에서 살펴보는 것도 나쁘지 않겠다. 

 

8. 자동차 렌탈 산업 

- 사업구조 : 자동차를 빌려주는 사업. 자동차 보관해야 하므로 유형자산이 전체 자산 중 많은 비중을 차지함, 차 한대로 대충 61% 수익창출, 중고차 판매로 37% 수익창출. 

- 산업자체는 (공유경제 등) 성장하고 있지만, 영업이익은 줄어들고 있는 편 → 감가상각비와 중고차판매원가가 높아졌다. → 소카 등에 의해 경쟁이 치열해진 시장

- 현금흐름도 별로다. 현금흐름표 작성 방식에 따른 차이가 있음. 렌탈 산업 분석을 위해서는 손익계산서 뿐만 아니라 현금흐름표를 잘 살펴볼 필요가 있다. 

 

9. 여행사 산업

- 사업구조 단순 : P(가격) X Q(수량 - 출국자수 증가), 여기서 P는 선택하는 상품(동남아시아, 유럽 등)에 의에 결정되고, 저유가인 상황에서는 P가 좀 더 싸지고 그렇다. 

- 이익률 하락을 겪고 있다. 왜? 광고선전비, 판매장려금 

- 사드와 같은 외교적 문제의 영향도 받는 산업이다. THAAD에 의해 중국인 여행객 감소는 여행산업에 큰 타격을 줄 수 있다. 

- 현재 코로나로 큰 타격을 받고 있는 산업 

 

10. 지주회사

- 지주회사는 특별한 사업을 영위한다기보다, 다른 회사의 지분을 소유하는 방식으로 그 회사를 지배하는 목적으로 설립된 회사. 

- 재무제표는 상대적으로 단순하다. 

- 왜? → 투명성을 확보할 수 있고, 오너 입장에서도 소규모 자본으로 지주회사 지배가능

- 삼성그룹이나 현대차그룹처럼 너무 커버린 재벌들이 이제와서 지주회사 체제로 바꾸려니 많은 자금이 필요해서 쉽지 않다 

- 지주회사 : 인적분할과 물적분할, 분할 후 재상장, 지주회사의 주식 공개매수 

728x90

Q1. 회사의 개요


[회사의 개요]

Digital X-ray System과 Solution을 개발 및 제조하여 판매하는 전문기업이고,

치과용 Digital x-ray와 CT를 개발/제조 하여 국내와 해외에서 판매법인과 대리점을 통해 판매하고 있다. 


[자본금 변동현황] 

2006년을 마지막으로 유상증자를 한 이력은 없다.


[배당에 관한 사항]

배당성향이 낮은편이고, 현금배당수익률도 1%가 채 안된다. (19년 배당성향 4.38%, 배당수익률 0.34% 수준) 


Q2. 무엇을 하는 회사인가? (사업의 내용) 


주력사업은, 덴탈 이미징 사업과 디지털 엑스레이 디텍터 사업. 즉 의료기기를 제조하여 판매하는 사업이다. 


[의료기기 산업]


(1) 기술발전에 따라 점차 복잡회지고 다양해지는 추세이다.

(2) 다품종 소량생산 산업이다.(품목당 생산 수량도 10만대 초과 품목이 거의 없음) 

(3) 정부의 의료정책 및 관리제도에 밀접하게 관련이 있다.

 - 바텍은 해외에서도 제품을 판매하고 있는데, 정부의 인허가 규제가 필요하고, 미국의 경우 7.2개월, 중국은 13개월이 소요되고 있다. 

(4) 수요가 한정적이다. 

 - 건강, 보건과 관련되므로, 제품의 안전성 및 신뢰성을 우선적으로 고려하여, 기존 유명제품을 계속 사용하려는 경향이 강해, 

진입장벽이 높고, 가격 탄력성이 낮다. 마케팅 장벽이나 충성도가 매우 높아, 경기 민감도가 상대적으로 낮다.

(5) 연구개발에 대한 지속적인 투자가 필요하다.


[덴탈이미징 산업]


임플란트, 교정 등 고수익을 창출하는 고급진료에 대한 수요가 증가하면서, CT와 같은 고가 진단 진료 장비 도입이 지속 증대되고 있다.


[시장 여건] 


(1) 세계 치과진료 시장 환경 

 - 저 연령층의 치과 진료 수요 증가

 - 인구 고령화 (임플란트 시장의 주된 수요자) 

(2) 국내 치과 진료 시장 환경 

 - 2016.7.1 부터 보험급여 적용연령 확대됨에 따라 임플란트 시장 규모 확대 가능 

 - 17년 기준 한국 치과용 임플란트 시장규모는 약 3,000억원 수준, 2020년까지 연평균 7% 성장 가능 추정 


[제약 요인] 

유럽 및 북미시장에서 가격 경쟁이 가속화 되고 있으며, 아시아 등 신흥 시장에서 제품 품질경쟁이 치열함 


[경기변동] 

경기변동과는 상관성이 낮음 


[자원조달] 

센서, 튜브, 컬럼의 주요 원재료는 국내 조달비율이 약 93%, 핵심 구성요소인 디텍터는 종속회사 (주)레이언스를 통해 공급 받음


[생산 및 설비] 

공장이 쉬고 있지는 않음, 평균 가동률이 100%보다 크다. 

생산라인 증설 관련 투자를 하고 있다. (투자기간 17.01~ 20.12) 


[매출에 관한 사항] 


국내 매출액은 매년 비슷하나, 수출을 통한 매출액이 증가하고 있다. 지역별로 보면, 

북아메리카, 유럽을 합치면 거의 50% 정도이다. 

치과치료에 대한 수요가 높은 선진국 시장에 매출액이 몰려있는 느낌이 든다. 



올해 1분기 실적을 보면, 두드러진 부분은, 

중동, 남아메리카 쪽의 매출 비중이 확대되고 있는 점이다. 분기 매출액이 일정한지 모르겠지만, 중동의 경우, 1분기에만 3,000억원의 매출을 냈다. 

(작년 1~4분기간 총 8,800억원의 매출을 낸 걸 보면 증가 추세로 보여진다.)



정리해보면, 치과 관련 의료기기(주력상품은 덴탈이미징)를 개발/제조하여 판매하는 회사이고, 

국내보다는 해외시장 특히 북미와 유럽에 집중된 시장이고, 신흥국이 많이 분포되있는 중동, 남아메리카에 매출 증가폭이 꽤나 괜찮은 부분이 두드러진다. 


Q3. 재무제표는 어떠한가? 



3개년간 봤을 때 매출액, 영업이익은 지속상승하였다. 당기순이익이 17.12월에 837억원인데, 

이건 17.2월 바텍이우홀딩스와 지분교환을 통해, 디지털 엑스레이 디텍터 사업부문인 (주)레이언스 지분을 매각하고, 미국 판매법인 VATECH America Inc.를 취득한, 

일시적인 이벤트에 따른 금액이다. 


잉여현금흐름을 꾸준히 창출하고 있는 회사인가? 



모닝스타 책에 따르면, 영업활동으로 인한 현금흐름에서 자본적지출을 제외한 값이라고 하는데, 

자본적지출의 정확한 정의를 파악하지 못했다. 대충 예상되는 것은 당기 유형자산과 전기 유형자산의 차이이거나, 

영업활동으로인한자산부채변동(운전자본변동)인 것 같은데, 우선 그 값을 제외하더라도 꾸준하게 현금을 창출하고 있는 회사라 볼 수 있다. 



재무비율을 봤을 때, 우선 18.12월 이후 항목으로 보면, 

부채비율이 52.5%, 영업이익률 15.8%, ROE는 14% 수준이다. 



배당성향은 위에서 본 것처럼 매우 낮고, 

PER은 12, PBR은 1.75 수준이다. 위에서 언급한 잉여현금흐름이, 이걸 봐도 되는 것 같은데, 우선 2019.12년에 현금흐름이 418억 정도이다. 


회사의 매출액이 19.12기준 2717억원이고, 시총이 3500정도규모인데, 현금흐름이 418억으로 현금을 잘 쌓고 있다. 



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


우선 적정주가를 계산해보았을 때, 현재보다 50%이상의 수익률을 낼 수 있어보이지만,
애초에 산업규모가 크지 않다는 점, 북미/유럽 시장의 가격경쟁이 치열해졌을 때의 리스크가 있다는 점이 아쉽고, 
경제적해자 관점에서 봤을때, 어느 부분이 경제적혜자가 있는지가 명확히 그려지지 않아, 좀 더 살펴봐야겠다. 
선진국뿐만 아니라, 신흥국 시장에도 진출을 하고, 거기에서도 안정적인 매출을 달성해낸다면, 그게 좋은 경제적 해자로 보여지는데, 확신이 크게 들진 않는다.


그럼에도 국내 점유율이 70%수준이고, 세계시장에서도 1위를 달성하고 있는 좋은 회사이다.

728x90

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

#14. 코웰패션 로젠택배 인수에 대한 생각  (0) 2021.07.18
#13. 코웰패션  (0) 2021.07.17
#11. 디티알오토모티브  (0) 2020.05.23
#10. 코텍 1분기 실적  (0) 2020.05.17
#9. 이크레더블  (0) 2020.05.05

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


그걸 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

(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

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

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

(3) Database에 저장하기

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

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

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

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

 

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

 

지난번 글에서는 fnguide를 크롤링하여, 종목별로 재무제표를 불러왔다.

이번에는 종목 별 주가를 불러온 후, DB에 저장하려고 하며, 종목 별 주가는 naver를 통해 크롤링하였다. 

 

네이버금융에서 주가를 불러오는 것은 아래와 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_price(item_name, code_new):
    code = code_new.query("name=='{}'".format(item_name))['code'].to_string(index=False)
    code = code[-6:]
    print(code)
    url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code)
    print("요청 URL = {}".format(url))
    df = DataFrame()
    for page in range(121): 
        pg_url = '{url}&page={page}'.format(url=url, page=page) 
        df = df.append(pd.read_html(pg_url, header=0)[0], ignore_index=True)
        df = df.dropna()
        df['code'= code
        df = df[df.날짜 == '2020.04.17'### 원하는 날짜 입력하기 ### 
    return df
cs

예를 들어 위와같이 대한약품을 입력하면, 이렇게 날짜, 종가, 시가, 고가, 저가, 거래량에 대한 정보가 나온다. 

 

원하는 날짜를 입력해서 함수를 정의하였고, 이제 이걸 이용해서 전종목에 대한 현재 주가를 불러와보자.

1
2
3
4
5
6
item_name = code_df['name'].values.tolist()
 
price = pd.DataFrame(columns = [])
 
for i in item_name:
    price = price.append(get_price(i, code_df))
cs

이번에는 종목 별 주가를 불러온 후, DB에 저장하려고 하며, 종목 별 주가는 naver를 통해 크롤링하였다. 

이렇게 for문을 돌려서 전체 종목에 대한 종가를 price라는 Datafram에 넣었다. 

나중에 조금 보완을 하면 좋을 것 같은게, url을 호출해서, 종목코드 하나 하나씩 append를 하기 때문에, 시간이 오래 걸린다.

원하는 code를 추린 후 for문을 돌리거나, 아니면 나중에 다른 방식을 찾아봐야겠다. (아직은 초보라 이게 최선이다.)

 

그 다음으로 data라는 db를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
import sqlite3
from pandas import Series, DataFrame
 
con = sqlite3.connect('data.db')
cur = con.cursor()
 
code_df.to_sql('code',con)
df.to_sql('data', con)
price.to_sql('price', con)
 
# 종가 업데이트
price.to_sql('price', con, if_exists = 'append', index = False ) ## 새로운 날짜 있으면 여기에서 추가하면 됨 
cs

지난번에 정의한 재무제표를 담은 df, 종목코드별 설명을 담은 code, 특정 날짜의 주가를 담은 price에 대한 테이블을 생성한다.

code, df 테이블은 값의 변동이 거의 없지만, 주가같은 경우는 영업일에는 매일 달라지기 때문에,

예를 들어 4.24일 날짜로 추가로 넣을 때에는 값을 append한다. 그리고 con.commit()을 실행하면 db저장 끝!

 

이제는 이렇게 적재된 것을 기반으로 종목 별 적정주가를 계산하는 산식을 넣어서, 기대 수익률 순으로 sorting하려고 한다. 

프로그래밍이 아직 완벽히 익숙치 않아서, 최선으로 짠 코드인지는 모르겠지만, 우선 내가 원하는 결과를 잘 만들어준다. 

728x90

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

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

(3) Database에 저장하기

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

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

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

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

 

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

 

먼저, 증권거래소에서 회사명/업종/주요제품에 대한 정보를 크롤링하였다.

적정주가를 계산하는 것도 중요하지만, 어떤 산업인지도 종목선정할 때 기준이 되기 때문에 함께 긁어왔다.

(예를 들어 자동차부품산업이나, Cost를 통제하기 어려운 산업, 사이클 경기를 타는 산업은 내기준에서 투자하기 어려운 종목들이다)

 

1
2
3
4
5
6
7
8
9
import pandas as pd
from pandas import DataFrame
from pandas import ExcelWriter
 
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
 
code_df.종목코드 = code_df.종목코드.map("{:06d}".format)
code_df = code_df[['종목코드''회사명''업종''주요제품']]
code_df = code_df.rename(columns={'종목코드''code''회사명':'name''업종' : 'industry''주요제품' : 'main_product'})
cs

 

우선 pandas의 read_html을 활용해서, 종목코드, 회사이름, 업종, 주요제품에 대한 정보를 가져왔다. 

 

이런식으로 각 code에 대한 회사명, 업종, 주요제품을 가져올 수 있다.

 

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

 

두 번째로는 Fnguide에 있는 재무제표를 크롤링 하는 것으로, 파이썬에서는 일반적으로 BeautifulSoup를 많이 사용한다.

일반적인 코드는 인터넷 검색으로 참고를 하였고, 일부 Error에 대해서 예외 처리를 하였다.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def get_fnguide_table(code):
    
    try
 
        ''' 경로 탐색'''
        url = re.get('http://comp.fnguide.com/SVO2/ASP/SVD_main.asp?pGB=1&gicode=A%s'%(code))
        url = url.content
 
        html = BeautifulSoup(url,'html.parser')
        body = html.find('body')
 
        fn_body = body.find('div',{'class':'fng_body asp_body'})
        ur_table = fn_body.find('div',{'id':'div15'})
        table = ur_table.find('div',{'id':'highlight_D_Y'})
 
        tbody = table.find('tbody')
        tr = tbody.find_all('tr')
        Table = DataFrame()
 
        for i in tr:
 
            ''' 항목 가져오기'''
            category = i.find('span',{'class':'txt_acd'})
 
            if category == None:
                category = i.find('th')   
 
            category = category.text.strip()
 
 
            '''값 가져오기'''
            value_list =[]
 
            j = i.find_all('td',{'class':'r'})
 
            for value in j:
                temp = value.text.replace(',','').strip()
 
                try:
                    temp = float(temp)
                    value_list.append(temp)
                except:
                    value_list.append(0)
 
            Table['%s'%(category)] = value_list
 
            ''' 기간 가져오기 '''    
 
            thead = table.find('thead')
            tr_2 = thead.find('tr',{'class':'td_gapcolor2'}).find_all('th')
            year_list = []
 
            for i in tr_2:
                try:
                    temp_year = i.find('span',{'class':'txt_acd'}).text
                except:
                    temp_year = i.text
                year_list.append(temp_year)
            Table.index = year_list
 
        #Table = Table.T
        Table.reset_index(level=0, inplace=True)
        Table = Table.rename(columns={'index''year'}) 
        Table['code'= code
        
            #Table = Table.append(Table)
        Table = Table.loc[Table.year.isin(['2014/12''2015/12''2016/12''2017/12''2018/12''2019/12'])]
        return Table
    
    except
        print('error detection!')
cs

이렇게 get_fnguide_table라는 code를 입력하면, 그 코드에 대한 5년치 재무제표를 반환해주는 함수가 생겼다. 

 

예를들어 가장 흔한 삼성전자를 해당함수에 대입해본다면,

삼성전자 재무제표 크롤링

위와 같이, 2015년~ 2019년 5개년간의 기본적인 재무정보가 나온다. 

(삼성전자의 2018년 영업이익이 무려 58조가 넘는다. 정말 거대한 기업이다.)

 

하지만, 내가 원하는 것은 내가 아는 종목을 검색해서 재무제표를 찾는 것이 아니라, 

전체 종목에 대한 재무제표 정보를 크롤링 하는 것이다.

1
2
3
4
5
code_list = code_df['code'].values.tolist()
df = pd.DataFrame(columns = [])
 
for i in code_list:
    df = df.append(get_fnguide_table(i))
cs

이렇게 아까 생성한 code_df를 list화 시킨 후, for문으로 전체 크롤링 정보를 df라는 데이터프레임에 담아놓았다. 

2000개가 넘는 종목에 대해서 for문을 돌리는 것이라 시간이 조금 소요되기는 한다. 

 

df에 전종목에 대한 재무정보가 다 적재가 되었다. 내가 관심을 두고 있는 대한약품(023910)으로,

데이터가 잘 생성되었는지 검증을 해보았고, 다행히 잘 적재가 된 것 같다.

이렇게 5년치 재무제표를 불러오는 것은 성공하였다.

 

그 다음 글에서는, 종목 별 주가 데이터까지 불러온 뒤, data base에 적재하는 것까지 해보려고 한다.

728x90

'삼성전자를 분석해봐야지!' 라고 시작을 하게 되면, 정보를 찾는 방법은 꽤나 순조롭다.

 

dart 사이트에서 삼성전자의 사업보고서를 보면서, 

사업의 내용과 재무제표 등을 확인할 수 있다. 

 

약간 사업보고서가 어렵게 느껴진다면, fnguide나 증권사 앱을 통해서 다양한 정보들을 확인할 수 있다. 

가치 지표들이 어떠하고, 성장성, 수익성 등 보기 쉽게 만들어 놓은 자료들이 많다. 

 

하지만, 상장 되어있는 2,000여개의 회사들 중, 머리에 떠오르는 기업은 많지 않을 것이다.

삼성, 현대, SK등 일부 대기업들이 떠오를 수 있지만, 상대적으로 중소형 기업은 찾기가 어렵다. 

 

좋은 기업, 매출액이 큰, 시가총액이 큰 기업을 찾는 것이 목적이 아니라, 

작은 기업이라도, 저평가 되어있는 기업을 찾는 것이 나의 목적이기 때문에,

 

내 머릿 속에 떠오르는 회사 pool만을 가지고는, 원하는 기업을 찾지 못할 수가 있다. 

 

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

 

물론, 스크리너 tool도 잘 되있는 것들이 있다. 

영업이익이 1000억 이상이면서, 배당률이 2% 이상이고, ROE가 10% 이상인 기업! 

으로 필터를 걸고 조회를 하게 되면, 그 조건에 해당하는 기업들이 등장할 것이다. 

 

조건을 정교화하게 걸면 걸수록, 등장하는 기업이 줄어들게 되지만, 

러프하게 조건을 걸어버리면, 거기서 등장하는, 100개가 넘는 회사들에 대한 우선순위를 파악하기가 쉽지 않다. 

 

그리고

    1) 5년간 당기순이익과, 영업이익이 0보다 큰 회사이면서

    2) 5년간 한번도 빠짐없이 배당을 준 회사

 

를 찾고 싶다고 했을 때, 그걸 찾아줄 수 있는 사이트를 찾지 못했다. 

 

내가 원하는 대로, 자유자재로 필터를 걸고 + 그렇게 해서 나온 기업들 중에 먼저 탐색할 수 있는 우선순위를 정하기 위해서, 

이런 토이프로젝트를 시작해보려고 한다.

 

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

 

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

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

(3) Database에 저장하기 

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

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

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

 

728x90

+ Recent posts