본문 바로가기
파이썬으로 퀀트투자 포트폴리오 만들기

파이썬으로 퀀트투자 포트폴리오 만들기 - 5. 여러가지 밸류팩터 계산해보기

by 유티끌 2023. 9. 2.

파이썬으로 퀀트투자 포트폴리오 만들기 - 5. 여러가지 밸류팩터 계산해보기

책에서는 PSR, PCR, PBR, PER정도만 계산했었지만, 추가적인 밸류팩터들을 더 계산해볼 수 있습니다.
저는 이전에 제가 만들었던 스크리너에서 추렸던 것을 추가로 계산했습니다.

마침 저번 포스트에서 FCF(잉여현금흐름) 도 계산해보았으니, PFCR도 같이 계산해보겠습니다.

SQL

일단 데이터베이스에서 계산에 이용할 값들을 가져옵니다.

 data = pd.read_sql("""
      select * from kor_fs
      where 공시구분 = 'q'
      and 계정 in ('당기순이익', '자본', '영업활동으로인한현금흐름', '매출액', '매출총이익', '영업이익', 'FCF')
    ;
    """, con=engine)

TTM 계산

그 다음 ttm을 계산합니다.

        fs_data = fs_data.sort_values(['종목코드', '계정', '기준일'])
        # 각 계정의 ttm 값 구하기
        fs_data['ttm'] = fs_data.groupby(['종목코드', '계정'], as_index=False)['값'].rolling(window=4, min_periods=4).sum()[
            '값']

        # 자본의 평균구하기
        fs_data['ttm'] = np.where(fs_data['계정'].isin(['자본', '자산', '부채', '유형자산']), fs_data['ttm'] / 4, fs_data['ttm'])
        fs_data = fs_data.groupby(['계정', '종목코드']).tail(1)

        return fs_data

밸류 팩터 계산


        fs_data = fs_data[['계정', '종목코드', 'ttm']].merge(
            ticker_list[['종목코드', '시가총액', '기준일']], on='종목코드'
        )

        fs_data['시가총액'] = fs_data['시가총액'] / 100000000  # 시가총액 단위를 억 으로 맞춘다.

        fs_data['value'] = fs_data['시가총액'] / fs_data['ttm']
        fs_data['value'] = fs_data['value'].round(4)

        # 지표명을 입력한다.
        fs_data['지표'] = self.__calculate_value_factor_name(fs_data)

        fs_data.rename(columns={'value': '값'}, inplace=True)

        fs_data_merged = fs_data[['종목코드', '기준일', '지표', '값']]
        fs_data_merged = fs_data_merged.replace([np.inf, -np.inf, np.nan], None)

이렇게 하면 계정 컬럼에서 제가 sql을 이용해서 가져온 값들에 대해 ttm이 계산되어져있을 것 입니다.

밸류팩터에 대한 이름 바꾸기

        data = np.where(data['계정'] == '매출액', 'PSR',
                        np.where(data['계정'] == '영업활동으로인한현금흐름', 'PCR',
                                 np.where(data['계정'] == '자본', 'PBR',
                                          np.where(data['계정'] == '당기순이익', 'PER',
                                                   np.where(data['계정'] == "매출총이익", "PGPR",
                                                            np.where(data['계정'] == '영업이익', 'POR',
                                                                     np.where(data['계정'] == 'FCF', 'PFCR', None)
                                                                     )
                                                            )
                                                   )
                                          )
                                 )
                        )

시가총액에 대해 각각의 항목으로 나눈 값들이, ttm에 저장되어있을 것입니다. 그래서 각 계정의 값에 대해 이름을 다시 수정해줍니다.

저의 경우에는 PGPR, POR, PFCR을 추가해주었습니다.

이 추가한 값을 이용해서, 팩터 포트폴리오 구상시에 이용하면 될 것 같습니다.

반응형

댓글