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

PBR PSR PCR Band 전략 및 백테스트 - 미국주식으로 시작하는 슬기로운 퀀트투자 5장 (2)

by JHistory_ 2023. 3. 5.
반응형
 
미국 주식으로 시작하는 슬기로운 퀀트투자
이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀트투자 전략을 만들기 위해서는 유명한 전략들이 어떻게 만들어졌는지 개념을 이해하고, 어떻게 구현됐는지 기본기를 따라 하며 배워야 한다. 다만 투자 대가들의 전략을 소개한 책은 쉽게 찾아볼 수 있지만, 그 전략을 구현한 기술적인 방법을 담은 책은 매우 찾아보기 어렵다. 또한 퀀트투자 전략을 공부하기 위해서는 코딩이나 수학 등 부가적인 배경지식이 필요하다. 이 책은 이미 잘 알려진 투자 대가들의 전략을 소개하고 자신의 컴퓨터에서 이 전략을 구현해보며 응용하는 방법을 알려준다. 책을 따라 미국 주식 퀀트투자 과정을 배우고 나면 자신만의 투자 전략을 스스로 개발할 수 있을 것이다.
저자
김용환, Yubin Kim
출판
한빛미디어
출판일
2021.09.30

 

 

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

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

jhhistory.tistory.com

 

 

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

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

jhhistory.tistory.com

 

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

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

jhhistory.tistory.com

이어서 가보자. 이번 장에서는 PER Band를 그렸던 것과 비슷하게 PBR, PSR, PCR에 대한 비슷한 전략을 행해본다. 이번 정리에서는 5장(1)에서 했던 것과 비슷한 것들이 많아서 자세한 나의 이해과정은 생략한다.

 

● 지표산출(PBR)

 PBR 밴드차트부터 구해보자. PER, EPS, Price의 관계와 마찬가지로 PBR, BPS, Price의 관계와 같다. Earning의 E가 Book Value의 B로만 바뀌었을 뿐이다. 위 링크 5장의 (1)을 참고하길.

df=fs.fn_single(otp='OTP',symbol='JBLU',window='T')
df['BPS']=df['Shareholders Equity']/df['Shares']
df['PBR']=df['Price']/df['BPS']
fs.draw_chart()df, left='PBR',right='Price')

 저번에도 했듯이 fn_single을 통해 데이터를 부르고 BPS와 PBR을 계산하고 그래프를 그려본다.

 

fs.draw_price_multiple_band(df,multiple='PBR',acct='BPS')

 

엇? 지금 투자 적기인 것 같기도하다? PBR 0.6이라니 단, PBR이 너무 낮아지고 있으면 망해가는 종목일 수 있다. 여기서도 마찬가지로 PBR이 -면 0으로 대체하고 필터링한다. PBR이 0.1인 종목에 대해서 백테스팅 해보자. 

 

 단, 기간은 PER 백테스트 했던 기간과 동일하게 2020Q1부터 2022Q4까지이다.

terms=fs.set_terms(trade_start='2020Q1', trade_end='2022Q4')
data={}
for t in terms :
 data[t] = fs.fn_consolidated(otp='oTP', term=t)
s={}
signal = {}
for t in terms :
  data[t]['BPS']=data[t]['Sharehgolders Equity']/data[t]['Shares']
  data[t]['PBR']=data[t]['Price']/data[t]['BPS']
  s[t]=fs.fn_filter(data[t], by='PBR', floor=0.1, cap=2, n=30, asc=True)
  signal[t]=list(s[t].index)
df=fs.backtest(signal=signal, data=data,m=2,cost=0.001)

 약간의 복습을 해보자면

  • terms로 기간을 설정
  • data로 딕셔너리 생성해줌
  • for로 t가 2020Q1일 때 부터 2022Q4일 때까지 consolidated로 재무 데이터를 받아옴.
  • s로 딕셔너리를 생성해줌 (필터링을 하기 위해)
  • signal로 딕셔너리를 생성해줌 (백테스트를 하기 위해)
  • for로 t가 2020Q1일 때 부터 2022Q4일 때 까지 BPS를 구하고 PBR을 구함
  • 그리고 0.1일때부터 최대 2까지 30개의 종목을 오름차순으로 (낮은거에서 높은걸로) 필터링을함
  • 그리고 그걸 분기별 트레이딩 시그널인 signal에 담아서 백테스팅을 수행한다.
  • 리벨런싱은 2개월이고, 거래비용은 0.1%

와 여태까지 백테스트 했던 것 중에 제일 성과가 좋다. CAGR은 44.14%로 말이 안되는 수준이고 누적수익률은 1.7배? 미쳐다. 샤프 비율도 엄청나게 높다. MDD도 성과에 비해 -30%밖에 안된다.

 

..................?????????????

 

벤치마크 수익률이 약 50%에 불과한데, 포트폴리오 누적수익률이 173%라니 상당히 의미있는 결과로 판단된다. 하지만, 바로 몰빵하는 건 금물이다. 여러기간 테스트도 해봐야하고 MDD와 샤프비율도 고려해야한다. 

● 지표산출(PSR)

  매출액에 대해 시장이 평가하는 프리미엄을 PSR이라고 한다. 아마존 같은 기업은 PER이 엄청 낮다. 매출액 자체가 성장하는 회사여야 알짜라는 주장도 있다. (이익은 조절하기 나름이기 때문)

 

 개념은 비슷하다. 말 나온 김에 아마존으로 해보자. 일단 PSR을 구해보자. 일단 SPS (Sales per Stockes, 주당매출액)을 구하고 (매출 / 주식수), 주식 가격을 SPS로 나누면 PSR이 산출된다.

df=fs.fn_single(otp='OTP', symbol='AMZN',window='T')
df['SPS']=df['Revenue']/df['Shares']
df['PSR']=df['Price']/df['SPS']
fs.draw_chart(df,left='PSR',right='Price')
fs.draw_price_multiple_band(df,multiple='PSR',acct='SPS')

 아니 아마존 PSR을 보면 좀 말이 안되는 것 같긴하다. 자산을 다 팔아서도 아니고, 매출액의 1.5배 수준에서 시가총액이 형성되어 있다니 정말 숫자만 보면 살 수 없는 회사인 것 같기도 하다.

 근데 심지어 지금 매우 저평가 된 구간이기도 하다. 어찌되었든 간에 아마존 같은 성장주는 4.5까지 PSR을 형성하고 있으니, 0.1이상 최대 약 10정도 미만즈음에서 30개를 골라서 백테스팅을 해보자. 

terms=fs.set_terms(trade_start='2020Q1',trade_end='2022Q4')
data = {}
for t in terms : 
  data[t] = fs.fn_consolidated(otp='OPT', term=t)
s={}
signal = {}
for t in terms :
  data[t]['SPS']=data[t]['Revenue']/data[t]['Shares']
  data[t]['PSR']=data[t]['Price_M3']/data[t]['SPS']
  s[t]=fs.fn_filter(data[t],by='PSR',floor=0.1,cap=10,n=30,asc=True)
  signal[t]=list(s[t].index)
df=fs.backtest(signal=signal,data=data,m=3,cost=0.001)

  방법은 같다. PER PBR이 PSR로 바뀐 것일 뿐, 하나 다른 것은 Price_M3으로 진행했다. PSR을 계산할 떄는 3개월 후의 주가를 이용하라고 하는데, finterstellar형님이 자세하게 설명해놓으시진 않았다. 

 

 추측컨데 새로운 매출이 공시되기 직전의 가격으로 반영해야 기업에서 매출이 발표된 이후 3개월은 지나야 제 자리를 적당히 찾아간 상태기 때문에 그렇지 않을까 예측해본다.

  오 이것도 나쁘지 않은 수익률이다. 누적수익률이 3년에 2배? 하... 미쳤다.

 놀라운 건 코로나 유동성 장세일 때, 특히 금융장세를 지나 실적장세 끝물쯤에는 거의 400%를 찍었다. 다만, MDD가 -42.26%라 2021년 4월엔 가즈아를 외치고 있었겠지만, 2022Q4에는 속이 좀 쓰릴 수 있겠다.

● 지표산출 (PCR)

 이번엔 Cash에 대한 주가비율이다. 나는 개인적으로 재무제표를 볼 때, 현금흐름표를 중시하는 편이긴하다. 근데, 애플같이 '우리는 현금을 0으로 만드는 것이 목적이다.'라고 하면 할말은 없긴하다.

 

 그래도 기업이 위험할 때, 가지고 있는 현금으로 재빠르게 위기를 피해나갈 수 있는 민첩한 해결수단이 바로 현금이기에 나는 현금흐름을 굉장히 중시여기는 편이다. 

df=fs.fn_single(otp='otp',symbol='TXN',window='T')
df['OCF']=df['Net Income']+df['Depreciation']
df['CFPS']=df['OCF']/df['Shares']
df['PCR']=df['Price']/df['CFPS']
fs.draw_chart(df,left='PCR',right='Price')
fs.draw_price_multiple_band(df,multiple='PCR',acct='CFPS')

 비중은 좀 낮지만, 내가 끊임없이 사랑하는 주식 TXN에대해서 살펴보면 PCR의 값이 꽤 크다. 그리고 약간의 저평가 구간에 처해있는 것도 알 수 있다.

 

 마찬가지로 하한이 0.1이고 최대 10사이에서 PCR로 백테스트를 수행해보자. Cash에서는 주당영업현금흐름을 CFPS라고 정의한다. 그리고 이를 구하기위한  영업현금흐름을 OCF라고 하는데,

 

 OCF가 산출방법이 기업마다 그리고 사이트마다 다르다. 통상 OCF = 당기순이익 + 비현금지출 - 비현금수입 이렇게 구하는데, 비현금지출과 비현금수입에 포함되는 항목이 조금씩 다르다. 

 

 그래서 PCR은 그렇게 절대적인 지표는 아닌 느낌이다. finterstellear 모듈은 OCF = 당기순이익 + 감가상각비로 산출한다고 한다.

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

for t in terms : 
    data[t]['CFPS']=(data[t]['Net Income']+data[t]['Depreciation']) / data[t]['Shares']
    data[t]['PCR']=data[t]['Price_M3']/data[t]['CFPS']
    s[t]=fs.fn_filter(data[t],by='PCR',floor=0.1,cap=10,n=30,asc=True)
    signal[t]=list(s[t].index)

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

PBR이랑 PSR전략을보다가 이걸 보니까 이제 별로 감흥도 없다. MDD가 제일 적다는게 특징, 역시 현금이 많은 회사는 MDD에도 비교적 강한가보다.

그냥 재미로 2022 Q3에 뭘 갖고 있었나 검색해봤는데, 아는 종목이 정말 단 한개도 없다. 리스크가 있긴 있는 듯 하다. 다양한 기간과 다양한 종목수로 테스트 해볼 필요성이 있다.

 

 

반응형

댓글