본문 바로가기
미래걱정/주식

EV/EBITA EV/Sales, NCAV(안전마진, 1170%의 수익률), PEG(주가수익성장비율)로 백테스트 해보기 (feat. 핀터스텔라 finterstellar)

by JHistory_ 2023. 4. 2.
반응형

https://jhhistory.tistory.com/entry/%EA%B0%80%EC%B9%98%EC%A7%80%ED%91%9C-%EA%B2%B0%ED%95%A9%ED%95%98%EA%B8%B0-PER-PBR-%EB%93%B1-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Finterstellar-%EB%AA%A8%EB%93%88-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0

 

가치지표 결합하기 (PER , PBR 등) - 파이썬 Finterstellar 모듈 활용하기

미국 주식으로 시작하는 슬기로운 퀀트투자 이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀

jhhistory.tistory.com

위에서 이어지는 시리즈이다. (실습해 보면서 핀터스텔라 님께 무한한 감사를 드린다.)

 

 

● EV/EBITA & EV/Sales

 늘 궁금했던 지표이다. EV는 보통 인수합병 할 때 사용하는 개념인데, 기업을 인수하는데 들어가는 총비용이라고 한다. EV계산은 = 시가총액 + 순차입금 = 시가총액 + (차입금 - 현금성자산) 이런 식으로 계산한다. 

 

 EV를 사용하게 되면 단순 시가총액 이외에도 차입금 규모를 함께 고려할 수 있기 때문에 조금 더 면밀한 분석이 되는 것으로 그럴싸한 이야기가 붙어있지만, 인수합병 시 가치를 측정하기 위해 만든 것이고 다른 시각으로 분석하고자 이용하는 느낌이라고 한다.

 

 EV멀티플 중 가장 유명한 것은 EV/EBITDA인데, Earnings Before Interests, Tax and Depreciation and Amortization이다. 당기순이익에서 이자, 세금, 감가상각비를 제외하기 전 영업이익을 뜻한다.

 

 즉, PER=시가총액/당기순이익인 것에 비해, (EV = 시가총액 + 순 차입금) / (EBITDA = 영업이익 + 감가상각비)라고 보면 된다. 즉, 순 차입금과 감가상각비를 원래 PER지표에서 분자 분모에 더해준 것이기 때문에 순 차입금과 감가상각비를 신경을 안 쓰고 가치를 판단하는 개념이다.

 

 영업이익이 마이너스인 경우에도 EV/EBITDA가 플러스로 나올 수도 있어서 사용 폭이 넓어지는 장점이 될 수도 있고, 이자비용 등을 제외하고 계산하기 때문에 재무 건전성이 나쁜 기업이 좋게 둔갑할 수도 있다.

 

 EV/Sales 지표는 EBITDA대신에 매출액으로 나눈 값이며, PSR과 비슷한 개념이다. EV가 시가총액 + 순 차입금일 뿐 기본적인 PSR = 시가총액 / 매출액 이 개념과 같다.

 

df=fs.fn_single(otp='otp', symbol='NKE',window='T')

#EV/EBITA계산

df['Market Cap']= df['Price'] * df['Shares']
df['EV'] = df['Market Cap']+df['Long Term Debt'] + df['Current Debt'] - df['Cash & Equivalents']
df['EV/EBITA'] = df['EV']/df['EBITDA']

df['PER'] = df['Price'] / df['EPS']
fs.draw_chart(df, left='PER', right='EV/EBITA')

 

 

아래 그래프 보면 추이가 거의 비슷하다.

 

Nike 주식의 10년 간 PER과 EV/EBITA의 추이 비교 파란 선이 PER이고 빨간 선이 EV/EBITA이다.

 

EV sales도 구하면 아래와 같다.

df['EV/Sales'] = df['EV'] / df['Revenue']
df['PSR'] = df['Price'] / (df['Revenue']/df['Shares'])
fs.draw_chart(df, left='PSR', right = 'EV/Sales')

 

이것 또한 추이가 같다. 

 

Nike 주식의 10년 간 PSR과 EV/Sales의 추이 비교 파란 선이 PER이고 빨간 선이 EV/Sales이다.

 

EV/EBITDA로 백테스팅을 진행해 보자.

 

terms = fs.set_terms(trade_start='2011Q1', trade_end='2022Q4')
data={}
for t in terms:
  data[t]=fs.fn_consolidated(otp = 'otp', term=t)
  
 
for t in terms : 
  data[t]['Market Cap'] = data[t]['Price_M3']*data[t]['Shares']
  data[t]['EV']=data[t]['Market Cap']+data[t]['Long Term Debt'] + data[t]['Current Debt']- data[t]['Cash & Equivalents']

#이때, EV가 0이하거나 EBITDA가 0이하인 애들은 'nan'으로 걸러준다. 안그러면 EV/EBITDA가 둘다 -인데
#나누기 나누기해서 +처리가 되어서 저평가 우량주가 되는 우를 범할 수 있다.

for t in terms :
  data[t]['EV/EBITDA']=data[t]['EV'] / data[t]['EBITDA']
  data[t].loc[(data[t]['EV']<=0) | (data[t]['EBITDA']<=0), 'EV/EBITDA'] = float('nan')
  
#낮은 것부터 30개 종목 뽑기

s={}
signal = {}
for t in terms : 
 s[t] = fs.fn_filter(data[t], by='EV/EBITDA', floor=0, n=30, asc=True)
 signal[t] = list(s[t].index)
 
 #백테스트 실행
 
 df=fs.backtest(signal=signal, data=data, m=3, cost=0.001)

 

밑에 결과를 보면 이 것도 좋지 않다.

 

CAGR: 4.10%
Accumulated return: 60.47%
Investment period: 11.8yrs
Sharpe ratio: 0.17
MDD: -49.42%

빨간색 선 백 테스트 결과와 벤치마크 리턴 S&P500 수익률

 

EV Sale로 바꾼다면 아래와 같다. EBITDA를 Revenue로 바꾸어주고 EV/EBITDA를 EV/Sales로 변경한다.

 

terms = fs.set_terms(trade_start='2011Q1', trade_end='2022Q4')
data={}
for t in terms:
  data[t]=fs.fn_consolidated(otp = 'otp', term=t)
  
 
for t in terms : 
  data[t]['Market Cap'] = data[t]['Price_M3']*data[t]['Shares']
  data[t]['EV']=data[t]['Market Cap']+data[t]['Long Term Debt'] + data[t]['Current Debt']- data[t]['Cash & Equivalents']

#이때, EV가 0이하거나 Revenue가 0이하인 애들은 'nan'으로 걸러준다. 안그러면 EV/EBITDA가 둘다 -인데
#나누기 나누기해서 +처리가 되어서 저평가 우량주가 되는 우를 범할 수 있다.

for t in terms :
  data[t]['EV/Sales']=data[t]['EV'] / data[t]['Revenue']
  data[t].loc[(data[t]['EV']<=0) | (data[t]['Revenue']<=0), 'EV/Sales'] = float('nan')
  
#낮은 것부터 30개 종목 뽑기

s={}
signal = {}
for t in terms : 
 s[t] = fs.fn_filter(data[t], by='EV/Sales', floor=0, n=30, asc=True)
 signal[t] = list(s[t].index)
 
 #백테스트 실행
 
 df=fs.backtest(signal=signal, data=data, m=3, cost=0.001)

 과연 EV/Sales로 수행하면 어떻게 될까? 책에서는 Sales가 더 좋았다!

 

● 안전마진이 있는 그레이엄의 NCAV (Net Current Asset Value) 투자법

 NCAV는 청산가치투자법이라고 한다. 벤자민 그레이엄이 제시했는데, (얼른 현명한 투자자를 다 읽어야겠다.) 망하더라도 본전은 건질 수 있어야 한다라는 것이 기본 개념이다.

 

 보통의 청산 가치는 1년 안에 현금화할 수 있는 유동자산 + 1년 안에 현금화할 수 없는 자산인 비유동자산의 합에서 부채를 뺀 금액으로 판단하는데, 그레이엄은 유동자산에서만 부채를 제외하여 청산가치를 매우 보수적으로 판단했다.

 

 그리고 이렇게 계산한 청산가치가 시가총액 1.5 이상인 기업에 투자하는 전략을 제시했다. 이것이 벤자민 그레이엄의 안전마진이다. 

 

 안전마진 = 청산가치 - (시가총액 x 1.5) = (유동자산 - 부채) - (시가총액 x 1.5) 

 

 이렇게 되면 청산가치보다도 시가총액이 작게 되니 PBR이 1 이하인 기업이 걸릴 수밖에 없다. 근데 또 주의할 점은 시가총액이 이렇게나 쪼그라들었으면 기업이 망해가고 있을 수 있다는 것이다. 회복할 수 있는 성질의 것이라면 투자의 기회를 발견한 것이다.

 

  어도비로 한 번 실습해 보자 ADBE이다.

df=fs.fn_single(otp='otp', symbol='ADBE', window='T')

#NCAV 공식대로 유동자산에서 총 부채를 뺀다.
df['NCAV']=df['Current Assets']-df['Total Liabilities']

#시가총액은 가격과 주식수의 곱
df['Market Cap']=df['Price']*df['Shares']

#안전마진을 구하자
df['Safety Margin']= df['NCAV']-df['Market Cap']*1.5

#그래프
fs.draw_chart(df,left='Price',right='Safety Margin')

ADBE의 가격과 안전마진의 그래프

처음부터 안전마진이 마이너스였다. 고평가의 어도비였던 것인가. PBR이랑 비교해 보자.

df['PBR']=df['Price']/df['Shareholders Equity']/df['Shares']
fs.draw_chart(df,left='PBR',right='Safety Margin')

ADBD의 PBR과 안전마진 사이의 그래프

2021년 2022년에 PBR과 안전마진이 많이 벌어졌다. 안전마진을 기반으로 백테스트를 해본다. 10년간 테스트에 리밸런싱은 3개월 후이다. 거래량은 10000주 이상 발생하는 것으로 지정한다.

 

terms = fs.set_terms(trade_start='2011Q1', trade_end='2022Q4')
data={}
for t in terms:
  data[t]=fs.fn_consolidated(otp='otp', term=t, vol=10000)

for t in terms:
  data[t]['NCAV']=data[t]['Current Assets']-data[t]['Total Liabilities']
  data[t]['Market Cap']=data[t]['Price_M3']*data[t]['Shares']
  data[t]['Safety Margin']=data[t]['NCAV']-data[t]['Market Cap']*1.5

s={}
signal={}
for t in terms:
  s[t]=fs.fn_filter(data[t], by='Safety Margin', floor=0, n=30, asc=False)
  signal[t] = list(s[t].index)

df=fs.backtest(singal=signal,data=data, m=3, cost=0.001)

와 복리 수익률 24.14%에 누적수익률이 1172.31%라고?????? 내일부터 바로 실행에 들어가야 할 것 같은 전략이다.

CAGR: 24.14%
Accumulated return: 1172.31%
Investment period: 11.8yrs
Sharpe ratio: 3.22
MDD: -31.47%

안전마진을 활용한 포트폴리오와 S&P500의 수익률과의 관계&#44; 안전마진을 활용한 포트폴리오의 수익률은 1172.31%이다.

미쳤습니까 휴먼? 10년에 1100%면.. 11배라는 것인데.. 복리 24%라니 정말 대단하다. 각 분기에 몇 개의 종목이 선정되어 있는지 조회해 보자. 

for k , v in signal.items():
  print(k, len(v))
2010Q4 0
2011Q1 4
2011Q2 13
2011Q3 13
2011Q4 9
2012Q1 12
2012Q2 9
2012Q3 11
2012Q4 10
2013Q1 9
2013Q2 9
2013Q3 6
2013Q4 6
2014Q1 8
2014Q2 9
2014Q3 7
2014Q4 8
2015Q1 8
2015Q2 10
2015Q3 14
2015Q4 10
2016Q1 16
2016Q2 10
2016Q3 17
2016Q4 7
2017Q1 14
2017Q2 13
2017Q3 9
2017Q4 10
2018Q1 9
2018Q2 11
2018Q3 16
2018Q4 17
2019Q1 17
2019Q2 19
2019Q3 15
2019Q4 30
2020Q1 29
2020Q2 30
2020Q3 17
2020Q4 14
2021Q1 16
2021Q2 29
2021Q3 30
2021Q4 30
2022Q1 30
2022Q2 30
2022Q3 30

 2022Q1이면 2022년 2분기 데이터를 기준으로 2022년 1분기에 선정된 데이터라고 한다. 각 분기에 어떤 종목이 선정되었는지 보려면 signal ['2020 Q1']이라고 명령하면 된다.

 

● 성장주 투자를 하고 싶을 때 써먹는 PEG(주가수익성장비율)

 여태까지 보았던 가치주를 찾는 기술은 성장주를 찾을 때 써먹을 수가 없다. 성장주는 이익이 적거나 시가총액이 매우 높아 프리미엄이 잔뜩 붙어있기 때문이다. PEG는 Price Earning Growth Rate로 주가수익성장비율을 말한다.

 

 이익의 성장률을 함께 고려해서 만든 식인데, 현재의 이익뿐만 아니라 이익의 성장률을 함께 고려한다면 그다지 고평가는 아니다.라고 판단할 수 있는 지표이다.

 

PEG = PER / EPS Growth

 

 PER을 EPS의 성장으로 나누는 개념인데, 시장이 전반적으로 고평가 되었을 경우에도 주목 받는다. 엔비디아로 평가해보자. EPS성장률을 구하는 것을 처음해볼텐데, New- Old / Old * 100%로 구했을 때, EPS가 -$1고, 올해 $1이면 2/-1 *100% = -200%해서 굉장히 이상해진다.

 

 그래서 분모 Old에는 절대값을 씌워야한다. 전년도 EPS는 df.shift()함수를 이용해 df['EPS'].shift(4)로 구한다. shift(1)은 1분기 shift(2) 2분기 shift(3) 3분기 이런 것이다.

 

 

df=fs.fn_single(otp='otp', symbol = 'NVDA',window='T')
df['PER']=df['Price']/df['EPS']

#EPS성장과 PEG구하고
df['EPS Growth'] = (df['EPS']  - df['EPS'].shift(4) ) / abs(df['EPS'].shift(4))*100
df['PEG'] = ( df['Price'] / df['EPS'] ) /df['EPS Growth']

#최근 10개 분기에 대한 PEG 확인
df[['EPS','EPS Growth','PER','PEG']].tail(10)

 

 PEG가 2022년 10월 31일에 -로 꺾였다. 결과론 적이긴해도 그래프를 보면, 2021년 7월 31일 즈음에 PEG가 1.19에서 0.64로 줄었을 때즈음 털고 나왔으면 큰 손실을 면할 수 있었던 느낌이다.

 

 거꾸로 그래프는 피크를 쳤는데, 2022년 1월 31일에 PEG는 매우 저평가 당해있다. 즉 이말은 상승장에서는 저평가 툴로 괜찮지만, 시장이 하락 빔을 맞으면 쓰레기 지표일 수 있다는 것이다.

 

	EPS	EPS Growth	PER	PEG
2020-10-31	1.55	56.82	80.73	1.42
2021-01-31	1.75	53.06	74.12	1.40
2021-04-30	2.15	58.67	69.81	1.19
2021-07-31	2.85	106.34	68.48	0.64
2021-10-31	3.30	112.40	77.53	0.69
2022-01-31	3.91	123.11	62.62	0.51
2022-04-30	3.79	76.28	48.94	0.64
2022-07-31	3.10	8.87	58.59	6.61
2022-10-31	2.38	-27.82	56.71	-2.04
2023-01-31	1.75	-55.24	111.64	-2.02

NVDA 주가 그래프

 

 저 PEG 기업 상위 30개에 투자하는 전략을 써본다. 백테스트 시작!

 

#from finterstellar.financials import fn_consolidated

#기간설정 + 재무데이터 불러오기
terms = fs.set_terms(trade_start='2011Q1', trade_end='2022Q4')
data={}
for t in terms :
  data[t]=fs.fn_consolidated(otp='otp', term = t)
  
#t_4는 4분기 전의 데이터, t인 지금 분기 데이터와 비교 PEG 구하고, 0이하 예외처리

s={}
signal={}
for t in terms : 
  t_4=fs.quarters_before(terms, t, 4)
  data[t]['PER']=data[t]['Price_M3']/data[t]['EPS']
  data[t]['EPS Growth'] = ( data[t]['EPS']-data[t_4]['EPS'])/abs(data[t_4]['EPS'])*100
  data[t]['PEG']=data[t]['PER'] / data[t]['EPS Growth']
  data[t].loc[(data[t]['PER']<=0) | (data[t]['EPS Growth']<=0),'PEG']=float('nan')

#30개 예외처리, signal에 리스트된 것 처리 해줌
  s[t] = fs.fn_filter(data[t], by='PEG',floor=0.1, cap=1, n=30, asc=True)
  signal[t]=list(s[t].index)

#백테스트 돌린다 
df=fs.backtest(signal=signal, data=data, m=3, cost=0.001)

 

결과가 그닥 그렇다. 10년간 119%.. 

 

CAGR: 6.93%
Accumulated return: 119.88%
Investment period: 11.8yrs
Sharpe ratio: 0.50
MDD: -40.67%

 

실제 PEG이용 시에는 미래 예측치인 추정 EPS를 주로 이용한다고 한다. PEG를 쓰기로 했다는 것 자체가 실적보다 성장에 더 중심을 둔다는 의미이기 때문이다. 하지만, 이건 보통 추정치라 데이터가 안 정확할 수 있다. 믿을 수 없는 추정치 vs 확실한 과거의 싸움이라고도 할 수 있다.

 

붉은 선은 PEG 백테스트 결과이다. S&P500은 파란선이다. S&P500의 성과 수익률이 압도한다.

 


 

https://jhhistory.tistory.com/entry/%EC%8A%AC%EA%B8%B0%EB%A1%9C%EC%9A%B4-%ED%80%80%ED%8A%B8%ED%88%AC%EC%9E%90-2%EC%9E%A5-%EC%9D%BC%EB%8B%A8-%ED%95%B4%EB%B3%B4%EC%9E%90-%ED%8E%B8

 

슬기로운 퀀트투자 - 2장 일단 해보자 편

미국 주식으로 시작하는 슬기로운 퀀트투자 이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀

jhhistory.tistory.com

 

https://jhhistory.tistory.com/entry/%EC%8A%AC%EA%B8%B0%EB%A1%9C%EC%9A%B4-%ED%80%80%ED%8A%B8%ED%88%AC%EC%9E%90-3%EC%9E%A5-%EB%8B%A8%EA%B8%B0-%ED%88%AC%EC%9E%90%EC%9D%98-%EA%B8%B0%EC%88%A0-%ED%8E%B8-%EB%B3%B4%EC%A1%B0%EC%A7%80%ED%91%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%B0%B1%ED%85%8C%EC%8A%A4%ED%8C%85

 

슬기로운 퀀트투자 3장 - 단기 투자의 기술 편 (보조지표를 통한 백테스팅)

미국 주식으로 시작하는 슬기로운 퀀트투자 이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀

jhhistory.tistory.com

 

 

https://jhhistory.tistory.com/entry/%EB%AF%B8%EA%B5%AD%EC%A3%BC%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EC%8A%AC%EA%B8%B0%EB%A1%9C%EC%9A%B4-%ED%80%80%ED%8A%B8%ED%88%AC%EC%9E%90-5%EC%9E%A51-%EA%B0%80%EC%B9%98%EC%A3%BC%EB%A5%BC-%EC%B0%BE%EB%8A%94-%EA%B8%B0%EC%88%A0-feat-PER-Band-Chart-%ED%95%80%ED%84%B0%EC%8A%A4%ED%85%94%EB%9D%BC

 

미국주식으로 시작하는 슬기로운 퀀트투자 5장(1) - 가치주를 찾는 기술 (feat. PER Band Chart 핀터스

미국 주식으로 시작하는 슬기로운 퀀트투자 이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀

jhhistory.tistory.com

 

반응형

댓글