(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파일을 떨궈주도록 하는 과정을 적어보려 한다.
'재테크 > 토이프로젝트' 카테고리의 다른 글
#6. 기대수익률이 높은 종목이 실제 수익률도 높을까? (0) | 2020.05.04 |
---|---|
#5. 적정주가 계산하기 자동화 (0) | 2020.05.01 |
#3. 종목 별 주가 불러온 후 DB에 저장하기 (0) | 2020.04.24 |
#2. 5개년치 재무제표 불러오기 (fnguide) (4) | 2020.04.23 |
#1. 적정주가 계산하기 (0) | 2020.04.21 |