- 저자
- 김용환, 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에 뭘 갖고 있었나 검색해봤는데, 아는 종목이 정말 단 한개도 없다. 리스크가 있긴 있는 듯 하다. 다양한 기간과 다양한 종목수로 테스트 해볼 필요성이 있다.
'미래걱정 > 주식' 카테고리의 다른 글
EV/EBITA EV/Sales, NCAV(안전마진, 1170%의 수익률), PEG(주가수익성장비율)로 백테스트 해보기 (feat. 핀터스텔라 finterstellar) (0) | 2023.04.02 |
---|---|
가치지표 결합하기 (PER , PBR 등) - 파이썬 Finterstellar 모듈 활용하기 (0) | 2023.03.31 |
가치주를 찾는 기술 (feat. PER Band Chart 핀터스텔라) - 미국주식으로 시작하는 슬기로운 퀀트투자 5장(1) (2) | 2023.02.27 |
Finterstellar (핀터스텔라)를 활용한 3년간 S&P500에 대한 단기투자 백테스팅 (4) | 2023.02.13 |
단기 투자의 기술 편 (보조지표를 통한 백테스팅) - 슬기로운 퀀트투자 3장 (0) | 2023.02.12 |
댓글