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

 

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

 

적정주가를 계산하고 return rate이 높은 순으로 정렬했을 때, 상위에 있었던 종목이다.

 

적정주가를 계산할 때 PER이나 PBR을 5개년 평균치로 보는데, 

갑자기 작년에 PER이 높았다던가, 아니면 과거에 영업이익이 높았는데 점점 낮아지면서, 저평가된 것처럼 보여지는 종목이 많았다.

숫자만 믿으면 안되고 기업을 분석해야 하는 필요를 다시한번 느꼈다.

 

아무튼, 그래서 최근 3년간 영업이익과 ROE가 꾸준히 증가한 것으로 필터조건을 추가하니, 위에 메리츠증권이 나왔다. 

 

내가 원래 알고 있던 것은 고배당주라는 것이었고, 증권/은행/보험은 제재를 많이 받는 산업이어서 애초에 가치지표가 낮다는 정도였다. 

차트를 잠깐 보니 작년 말부터 주가가 정말 많이 내렸었다. 코로나 영향 탓도 있었겠지만 말이다. 

 

나중에 알고보니 부동산 PF 규제에 따른 Risk가 있다는 것이었고, 그것은 아래에서 좀 더 다루도록 하겠다.

 

Q2. 어떤 점이 매력적이었는가?

 

상대적으로 저평가된 가격에, 매년 높은 영업이익을 내고 있고 배당도 3년간 200원씩 줬었다. 

내가 처음 살펴보게 된 시점이 메리츠증권이 2900원이었는데, 만약 내년에도 200원의 배당금을 줄 수 있게 된다면, 배당수익률이 무려 6.8%나 되었다. 주가가 떨어져도 안전마진이 충분히 있다고 판단되었고, 

 

재무제표만 봐도 실적을 꾸준히 내고 있었기 때문에, 겉으로만 봐서는 안살 이유가 없는 종목이었다.

 

Q3. 조금 더 살펴봐야 할 게 어떤 게 있나? 

 

역시나 가격에는 시장에서 느끼는 Risk가 다 반영된 것임을 다시한번 느꼈다. 

아래 기사를 확인해보자. 

 

출처 : 비즈조선 뉴스

 

메리츠증권은 수익의 60%이상이 부동산 PF에서 발생하고 있는데, 정부의 '부동산PF 건전성 관리방안'에 따라, 

증권사가 부동산PF를 할 수 있는 규모를 자기자본의 100% 밑으로 낮추도록 한 것이다. 

 

메리츠증권의 부동산 보증규모는 자기자본의 187%에 달하기 때문에, 자기자본을 늘리거나, 아니면 점진적으로 보증규모를 줄여야한다는 것으로 해석할 수 있다. 

 

메리츠증권의 자기자본은 20년 3월 기준 3조 7843억원이다. 그러니까 이 규모를 늘려서, 보증규모가 자기자본의 100%가 되도록 만들려면,, 어마어마한 자기자본이 필요하고, 이에 한편에서는 유상증자를 해야할 수도 있겠다는 우려가 있기도 하다. 

 

물론, 바로 적용을 하는 것은 아니고, 대부분의 정책이 유예기간을 두듯이, 100% 적용은 21년 7월에 시작한다는 것. 약 1년이 조금 넘게 남았는데, 그때까지 다른 부분에서 수익을 창출할 수 있는지가 관건인 느낌이었다. 

 

뭐 그럼 다른 증권사들도 비슷한 거 아니냐, 유독 메리츠증권만 많이 빠진 건 아닌가 라는 생각을 할 수 있지만, 

메리츠증권이 공격적으로 부동산 PF를 했기 때문에, 비율이 높고, 다른 증권사들은 100% 미만인, 그러니까 정부의 규제에 크게 지장이 없는 수준이다. 그래서 유난히 작년 말 메리츠증권의 주가가 많이 떨어졌던 것이었다.

 

이런 우려들이 현실화가 된다면(수익의 60%나 내던 게 없어지니까, 다른 것으로 돈을 벌더라도 영업이익이 많이 줄것이라는 판단), 해당 주가가 적정하다고 생각할 수 있는 것이고, 메리츠증권이 해결책을 잘 내고, 다른 방법으로 수익을 잘 낸다면 현재 주가가 저평가 되어있다고도 판단할 수 있는 것이라 생각된다. 그리고 그것을 판단하는 것은 어렵고, + 개인의 몫이다.

 

종목을 분석하기 시작하고 + 주식을 조금 샀을 때가 2900원 언저리었는데, 어제 갑자기 약 6%가 올랐다. 어제 1분기 잠정실적을 공개했는데, 이런 우려보다 실적이 잘 나왔기 때문이 아닌가 싶다. 결국 주가는 실적에 좌지우지된다.

 

 

-------- 

부동산 PF란?

PF는 Project Financing의 약자로, 부동산 개발에는 많은 자본이 필요하고, 그래서 다른 것들보다 타인자본의 비율이 높은데. 

부동산 개발 프로젝트로 부터 발생하는 미래 현금흐름을 상환재원으로 생각하고 자금을 조달하는 기법을 의미한다.

 

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

 

사람마다 판단하기에 따라 다르겠지만, 나는 그럼에도 매력적이라고 생각한다. 

다만, 부동산 규제에 따른 Risk가 있기 때문에, 메리츠증권은 특히 매분기 실적을 + 그리고 그 실적이 어디서 발생하는지를 꾸준히 탐색해볼 필요가 있겠다. 

728x90

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

#10. 코텍 1분기 실적  (0) 2020.05.17
#9. 이크레더블  (0) 2020.05.05
#7 국보디자인  (0) 2020.04.20
#6. 한솔제지  (0) 2018.06.13
#5. 대한약품  (0) 2018.03.12

(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

+ Recent posts