본문 바로가기
파이썬으로 종목 스크리너 만들기

뇌동매매 금지 - 11. S-RIM을 이용한 목표주가 계산해보기 - 3. S-RIM 기업가치로 스크리닝한 기업들에 대해 목표주가 계산하기

by 유티끌 2022. 11. 27.

저번 포스팅에서는 일부 기업을 제외한 코스피, 코스닥 종목에 대해 S-RIM을 이용한 기업가치를 계산하고, 이것을 별도의 엑셀데이터로 저장하였습니다.

이번 포스팅에서는 기존 스크리너에서 각 종목들에 대해 S-RIM 기업가치를 이용한 적정주가를 계산해봅니다.


11. S-RIM을 이용한 목표주가 계산해보기 - 3. S-RIM 기업가치로 스크리닝한 기업들에 대해 목표주가 계산하기

일단 이전에 크롤링을 통해 기업가치를 계산해놓은 엑셀파일을 다시 읽어들여야합니다. 이 데이터를 어떤 타이밍에 읽어들일 것인지를 판단해야 했는데요, 저는 일단 모든 코스피, 코스닥 종목에 대해 적정주가를 계산해야겠다고 생각했습니다.

저는 시가총액 하위 30~40% 의 종목들을 대상으로 스크리닝을 하는데요, 이 소형주 말고도 대형주에서도 기업가치 대비 저평가된 주식들은 얼마든지 있을 수 있기 때문입니다.

S-RIM 기업가치가 저장되어있는 엑셀파일 읽어오기

일단 엑셀파일을 읽어오는 메소드를 만듭니다.

extract.py

    def __extract_s_rim_data(self):

        return pd.read_excel(
            "crawling_data/net_worth_and_roe_list_for_s_rim.xlsx",
            usecols=["종목코드", "net_worth", "average_roe", "s-rim_value_1", "s-rim_value_2", "s-rim_value_3"],
            converters={"종목코드": str}
        )

엑셀파일을 열어보면, 종목코드는 제대로 문자형태로 저장되어있지만, 읽어들인 후에는 다시 숫자로형태로 바뀌어있더라구요. 읽어들일때 converters 를 이용해서, 명시적으로 종목코드는 문자형이라는 것을 선언합니다.

전체종목에 대해 적정주가 계산하기

같은 파일에서, 엑셀파일의 데이터와, 1차적으로 뽑은 종목들에 대해, 적정주가를 구하는 메소드를 만듭니다. 제가 크롤링하고 계산한 기업가치를 발행주식수 (보통주)로 나누어주어야 적정주가를 산출해낼 수 있습니다.

    def __calculate_s_rim_data_per_marketcap(self, df_kospi_kosdaq: pd.DataFrame):
        for i in range(len(df_kospi_kosdaq.index.values.tolist())):
            df_kospi_kosdaq.loc[i, "S-RIM 적정주가"] = df_kospi_kosdaq.loc[i, "s-rim_value_1"] / df_kospi_kosdaq.loc[
                i, "상장주식수"]
            df_kospi_kosdaq.loc[i, "S-RIM -10%"] = df_kospi_kosdaq.loc[i, "s-rim_value_2"] / df_kospi_kosdaq.loc[
                i, "상장주식수"]
            df_kospi_kosdaq.loc[i, "S-RIM -20%"] = df_kospi_kosdaq.loc[i, "s-rim_value_3"] / df_kospi_kosdaq.loc[
                i, "상장주식수"]

        return df_kospi_kosdaq

저번 포스팅에서도 기재해놓았지만, 아래 컬럼들에 대해 추가로 설명하자면,

  • s-rim_value_1 : 현재 자본총계와 예상 ROE로 계산한 현재의 기업가치
  • s-rim_value_2 : 현재 자본총계와, 예상 ROE가 -10% 하락했을 때의 기업가치
  • s-rim_value_2 : 현재 자본총계와, 예상 ROE가 -20% 하락했을 때의 기업가치

입니다.

이제 위 메소드를 호출해야하는데요, get_data 메소드 내부를 조금 수정해주어야하는데요, 그 전에

일단 extract.py 상단, 생성자 내부에서 컬럼명들을 한 번 선언해줍니다.

        self.basic_columns = [
            "종목코드",
            "종목명",
            "업종",
            "종가",
            "시가총액",
            "거래량",
            "거래대금",
            "상장주식수",
            "BPS",
            "PER",
            "PBR",
            "EPS",
            "DIV",
            "DPS",
            "average_roe",
            "S-RIM 적정주가",
            "S-RIM -10%",
            "S-RIM -20%"
        ]

이 컬럼들이 코스피 코스닥 전체종목들을 뽑아냈을 때, 기본 컬럼들이 됩니다.

그 다음 get_data 를 수정합니다.

extract.py

   def get_data(self):
        print(f"Getting data from KRX")
        pd.set_option('display.max_columns', None)

        df_kospi = self.factor_data.get_kospi_market_data()
        df_kosdaq = self.factor_data.get_kosdaq_market_data()
        s_rim_data = self.__extract_s_rim_data()

        df_kospi_kosdaq = self.__calculate_s_rim_data_per_marketcap(
            pd.merge(
                pd.concat([df_kospi, df_kosdaq]),
                s_rim_data,
                left_on="종목코드",
                right_on="종목코드"
            )
        )

        return df_kospi_kosdaq[self.basic_columns]

코스피, 코스닥 데이터를 각각 불러오고, S-RIM 엑셀파일을 별도로 읽어들입니다.

그 다음줄에, 한 줄로 기재를 해놓아서 조금 알아보기 어려울 수 있을 것 같습니다만..
일단,

  1. 코스피, 코스닥 데이터를 concat 으로 하나로 만든 다음,
  2. 읽어들인 S-RIM 데이터와 합칩니다. 이때 합치는 조건으로는 종목코드가 일치하는 데이터에 대해 하나로 합칩니다.
  3. 그 다음, 합쳐진 데이터에서 S-RIM 적정주가를 계산하여 df_kospi_kosdaq 변수에 저장합니다.

이렇게 한 후에, 현재 데이터상으로는, 나중에 쓰이지 않을 s-rim_value_1 과 같은 컬럼들도 있으므로, 꼭 필요한 컬럼만 걸러서 return 합니다.

이렇게되면 다른 로직들은 수정할 필요가 없어졌습니다.
결과물은 아래와 같습니다.

이렇게 S-RIM 기업가치 데이터를 이용한 기본적인 적정주가 계산을 끝냈습니다.

다음 포스팅에서는 스크리닝 조건식을 추가해봅니다.

반응형

댓글