☆IT 개발 프로그램☆/Phthon

[파이썬 주식 분석] 매수 적정 PER 구하기 (당기순이익 증감 예상이용)

호기심을 품고사는 중 2020. 6. 4. 15:03

주식 매수 의사결정 모형

 

요즘 주식시장에 푹 빠져있다. 자기 전에 침대에 누워서 결산 보고서를 읽으면서 종목 평가하는 게 큰 즐거움인데, (마침 중간 결산 시즌이다.) 고평가 되어있는지, 저평가 되어있는지 판단하기 위해 간단한 코드를 짜 봤다. 어젯밤에 짜서 오늘 아침에 처음 써 봤는데, 한눈에 결과가 정리되니까 투자 판단이 정확하게 된다. 역시 이런 간단 계산은 컴퓨터를 시켜야 한다..ㅎ

 

물론 코딩 로직과 미래 예측은 전혀 별개의 이야기다. 당기순이익 증가율(여기서는 p)이 예측이 된다면 누구나 벼락부자가 되겠지만... 그걸 모르니까 문제다! 하지만 개중에는 경기의 영향을 덜 받고, 매년 일정 비율만큼 이익이 상승하는 (혹은 유지하는) 업종들이 있다. 그런 종목들은 미래에도 비슷한 추세를 따를 거라고 조심스럽게 예측을 해 볼 수 있다. 그런 업종을 선택하는 것도 리스크를 최대한 줄일 수 있는 방법 중에 하나겠다.


 

 

실행 결과

주식 평가/분석 코드 실행 결과 (3년 투자 가정)

저번 달에 매수한 세븐 & 아이 홀딩즈 주식을 대입해서 실행해보았다.

 

당기순이익이 증가도 감소도 하지 않고 현재의 수준을 꾸준히 유지한다는 가정 시에 3년 후에 이 주식의 자산가치는 119.0%가 된다. 주식 대신 은행에 2.9%의 복리로 예금했을 때에는 자산가치는 108.9%가 된다.

 

내가 목표하는 최소 연간 수익률은 8.5% 이다. 이 수익률을 달성하려면, 3년 동안 순이익이 증가할 것이라는 희망적 가정하에, PER이 최소 13.3일 때에 매수해야 가능하다3년 동안 당기 순이익을 그대로 유지한다는 보수적(혹은 일반적) 가정하에서는, PER이 최소 11.0일 때에 매수해야 8.5%의 목표 수익률을 달성할 수 있다.

 

 

흠... 나는 PER이 15.6일 때 매수했으므로, 당기순이익이 향후 3년간 20%씩 증가한다는 희망적인 가정 시에도 연간 8.5%의 복리 수익률을 채우기에는 조금 모자라다. 증권가 리포트에서 읽은 내년 결산 순이익 증가율 예상치는 10%인데, 이를 대입해서 상수를 바꿔서 다시 실행해보았다.

 

주식 평가/분석 코드 실행 결과 (3년 투자 가정)

그럼 적정 PER이 11.0 ~ 12.1으로 더욱 보수적이 된다. (목표 수익률을 낮춘다면 적정 PER은 조금 더 올라갈 수 있다. 하지만 주식에는 리스크가 있기 때문에, 그 리스크를 감안하여 8.5%로 설정하였다.)

 

 

** 참고로 워랜버핏은 PER이 12 ~ 15이면 저평가되었다고 보고, 30선까지 오르면 고평가 되었다고 본다고 한다. (분식회계 등의 장부조작이 없는 도덕적인 회사이고, 성장가치를 늘 창출해내는 미국 회사에 한정하여) 자신만의 확고한 평가 기준이 있어야 주가 변동 등의 변수에도 멘탈이 흔들리지 않고 오래 투자할 수 있다.


 

구현

수학식이 조금 복잡할 뿐 로직은 간단하므로 설명 없이 복붙 한다. (Python 2.7)

New Script : my_config.py

# -*- coding: utf-8 -*-

# 주식 이름 (지워도 무방)
stock_name = 'Seven Eleven'

# 주식의 현재 PER 입력
per = 15.6

# 당기순이익 증가율 예측치 p
p = 20

# 은행 금리 입력
bank_rate = 2.9

# 투자 기간 입력
year = 3

# 1년 목표 수익률
ideal_rate = 8.5

 

New Script : per_caculator.py 

컨피그 상수 임포트

# -*- coding: utf-8 -*-

import my_config

stock_name = my_config.stock_name
per = my_config.per
p = my_config.p
bank_rate = my_config.bank_rate
year = my_config.year
ideal_rate = my_config.ideal_rate

 

함수 메소드 정의

# 평균 p 퍼센트의 수익증가가 기대되는 특정 PER의 주식은 n 년후에 현재 가치의 몇 퍼센트의 수익을 올릴 수 있나?
def asset_value_after_n(n, p, per):
    total = 0
    profit_rate = 1 / float(per)
    r = 1 + p / float(100)
    for i in range(0, n):
        total += profit_rate * (r ** i)
    return (1 + round(total, 2)) * 100


# 복리로 n년 후 가치 계산
def compound_interest(rate, year):
    total = pow((1 + rate / 100), year)
    return round(total * 100, 2)


# n년 후 희망 수익률(年복리)을 올리기 위한 구입 적정 PER
def least_per_calculator(n, p, ideal_rate):
    goal_value = compound_interest(float(ideal_rate), n)
    per = 1
    profit = asset_value_after_n(n, p, per)
    while goal_value < profit:
        per += 0.1
        profit = asset_value_after_n(n, p, per)
    return per

 

실행 블록

if __name__ == "__main__":

    print('#-----< ' + stock_name + ' > 주식 예상 가치 계산 -----#')
    
    # 당기 순이익이 변동하지 않는다
    print('#1. 당기순이익이 향후 ' + str(year) + '년간 변동하지 않는다고 가정시 :')
    print(str(asset_value_after_n(year, 0, per)) + '%')

    # 당기 순이익이 감소한다
    print('#2. 당기순이익이 향후 ' + str(year) + '년간 매년 ' + str(p) + '% 씩 감소한다고 가정시 :')
    print(str(asset_value_after_n(year, -p, per)) + '%')

    #  당기 순이익이 증가한다
    print('#2. 당기순이익이 향후 ' + str(year) + '년간 매년 ' + str(p) + '% 씩 증가한다고 가정시 :')
    print(str(asset_value_after_n(year, p, per)) + '%')

    # 이 때 은행 예금시 수익
    print('#3. 은행 예금시 (' + str(bank_rate) + "% 복리) :")
    print(str(compound_interest(float(bank_rate), year)) + "%")

    # 목표 수익률에 의한 예상 가치
    print('#4. ' + str(year) + '년 후 목표 가치 (연간 ' + str(ideal_rate) + '% 복리):')
    profit = compound_interest(float(ideal_rate), year)
    print (str(profit) + '%')

    # 목표 수익률 근접하기 위한 최저 PER
    print('#5. ' + str(year) + '년 후 목표 가치를 달성하기 위한 적정 PER (순이익 증가 실현 가정):')
    print(str(least_per_calculator(year, p, ideal_rate)))

    print('#6. ' + str(year) + '년 후 목표 가치를 달성하기 위한 적정 PER (순이익 변동 없음 가정):')
    print(str(least_per_calculator(year, 0, ideal_rate)))

 


 

 

 

새로 구현할 기능

 

이 스크립트가 의사결정에 꽤 도움이 되는 것 같아서, 앞으로도 계속 사용하기 위해서 다른 기능들도 추가하려고 한다.

 

  • 전 종목의 주가, EPS, PER 등을 실시간으로 제공해주는 API가 있으면 활용하기 : 유저가 PER을 하나하나 입력할 필요 없이, 자동으로 코스닥에 상장된 종목 전체 데이터를 가져올 수 있으면 전체 시장에 대한 가시성이 좋아질 듯. 
  • API가 없을 경우? : CSV 파일로 불러와서 대형 데이터 돌릴 수 있게 하기

  • 매도 PER 계산 메소드 추가할 것 (현재는 매수 PER만 있음)

  • 최근 n년간 EPS 평균 증감률 계산하기

  • 머신러닝을 활용할 수 있을까? (시계열 모형은 과거 데이터를 대상으로 하는 거라 미래 데이터 예측은 어려운데... 어떻게 활용할 수 있을지 생각해봐야겠다)