Trading/주식

주식 퀀트 전략 | f-score

알 수 없는 사용자 2022. 1. 16. 20:28
반응형

F-score

1 수익성 전년 당기순이익: 0 이상

2 수익성 전년 영업현금흐름: 0이상

3 수익성 ROA: 전년 대비 증가

4 수익성 전년 영업현금흐름: 순이익보다 높음

5 재무 건정성 부채비율: 전년 대비 감소

6 재무 건정성 유동비율: 전년 대비 증가

7 재무 건정성 신규 주식 발행(유상증자): 전년 없음

8 효율성 매출총이익률: 전년 대비 증가

9 효율성 자산회전율: 전년 대비 증가

 

매매전략

  • PBR 최저 20% 기업에만 투자 (상장폐지된 종목은 제외)
  • F-Score 9개 요소를 검토해 맞으면 1점, 틀리면 0점을 매긴 후, 점수가 높은 20~30개 기업 매수
  • 백테스트기간: 2007.5.25 ~ 2017.5.25
  • 연 1회 리밸런싱

 

Code

    def 순이익양호(self):
        """ 1   수익성 전년 당기순이익: 0 이상
        """
        c = self.column
        s = self.순이익
        순이익sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        selected = self.순이익.loc[순이익sum>0,'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))


    def 영업현금흐름양호(self):
        """ 2   수익성 전년 영업현금흐름: 0이상
        """
        c = self.column
        s = self.영업현금흐름
        영업현금흐름sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        selected = self.영업현금흐름.loc[영업현금흐름sum>0,'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 수익성ROA증가(self):
        """ 3   수익성 ROA: 전년 대비 증가
        ROA = 순이익/총자산 (Return on Assets)
        """
        c = self.column
        pc = self.pcolumn
        s = self.영업현금흐름
        영업현금흐름sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        p영업현금흐름sum = s[pc[0]] + s[pc[1]] + s[pc[2]] + s[pc[3]]
        s = self.순이익
        순이익sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        p순이익sum = s[pc[0]] + s[pc[1]] + s[pc[2]] + s[pc[3]]

        ROA_py = p순이익sum/p영업현금흐름sum
        ROA_ty = 순이익sum/영업현금흐름sum
        selected = self.순이익.loc[ROA_ty > ROA_py, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 영업현금흐름순이익비교(self):
        """ 4   수익성 전년 영업현금흐름: 순이익보다 높음
        """
        c = self.column
        pc = self.pcolumn
        s = self.영업현금흐름
        영업현금흐름sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        s = self.순이익
        순이익sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        diff = 영업현금흐름sum - 순이익sum
        selected = self.순이익.loc[diff>0, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 부채비율감소(self):
        """ 5   재무 건정성  부채비율: 전년 대비 감소
        """
        부채비율_py = self.유동부채[self.pcolumn[3]]/self.총자본[self.pcolumn[3]]
        부채비율_ty = self.유동부채[self.column[3]]/self.총자본[self.column[3]]
        selected = self.순이익.loc[부채비율_py > 부채비율_ty, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 유동비율증가(self):
        """ 6   재무 건정성  유동비율: 전년 대비 증가
        유동비율 = 유동자산/유동부채
        """
        유동비율_py = self.유동자산[self.pcolumn[3]]/self.유동부채[self.pcolumn[3]]
        유동비율_ty = self.유동자산[self.column[3]]/self.유동부채[self.column[3]]
        selected = self.순이익.loc[유동비율_py < 유동비율_ty, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 신규주식발행여부(self):
        """ 7   재무 건정성  신규 주식 발행(유상증자): 전년 없음
        """
        pcolumn = '%4d-04'%(self.year,)
        column = '%4d-04'%(self.year+1,)
        p_stocks = self.시총[pcolumn]/self.수정주가[pcolumn]
        c_stocks = self.시총[column]/self.수정주가[column]
        selected = self.시총.loc[1.01*p_stocks > c_stocks, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 매출총이익률증가(self):
        """ 8   효율성 매출총이익률: 전년 대비 증가
        매출총이익률 = 매출총이익/매출액
        """
        c = self.column
        pc = self.pcolumn
        s = self.매출총이익
        매출총이익sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        p매출총이익sum = s[pc[0]] + s[pc[1]] + s[pc[2]] + s[pc[3]]
        s = self.매출액
        매출액sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        p매출액sum = s[pc[0]] + s[pc[1]] + s[pc[2]] + s[pc[3]]
        매출총이익률_py = p매출총이익sum/p매출액sum
        매출총이익률_ty = 매출총이익sum/매출액sum
        selected = self.순이익.loc[매출총이익률_py<매출총이익률_ty, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def 자산회전율증가(self):
        """ 9   효율성 자산회전율: 전년 대비 증가
        자산회전율 = 매출액/총자산
        """
        c = self.column
        pc = self.pcolumn
        s = self.매출액
        매출액sum = s[c[0]] + s[c[1]] + s[c[2]] + s[c[3]]
        p매출액sum = s[pc[0]] + s[pc[1]] + s[pc[2]] + s[pc[3]]
        자산회전율_py = p매출액sum/self.총자산[self.pcolumn[3]]
        자산회전율_ty = 매출액sum/self.총자산[self.column[3]]
        selected = self.순이익.loc[자산회전율_py<자산회전율_ty, 'Symbol']
        self.fscore.loc[selected] += 1
        #print(self.fscore.head(), len(selected))

    def adapt_fscore(self):
        self.순이익양호()
        self.영업현금흐름양호()
        self.수익성ROA증가()
        self.영업현금흐름순이익비교()
        self.부채비율감소()
        self.유동비율증가()
        self.신규주식발행여부()
        self.매출총이익률증가()
        self.자산회전율증가()

 

Result

ReturnCAGRMDDSR

Return CAGR MDD Sharp Ratio
x6 21% 56% 1.2

https://github.com/didw/quant_trading

 

GitHub - didw/quant_trading: 할수있다 퀀트투자

할수있다 퀀트투자. Contribute to didw/quant_trading development by creating an account on GitHub.

github.com

 

반응형

'Trading > 주식' 카테고리의 다른 글

22년 1분기 주식 손익  (0) 2022.04.06
주식 2021년 12월 손익  (0) 2022.01.11
주식 2021년 11월 손익  (0) 2022.01.11