저번 포스팅에서는 일부 기업을 제외한 코스피, 코스닥 종목에 대해 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 엑셀파일을 별도로 읽어들입니다.
그 다음줄에, 한 줄로 기재를 해놓아서 조금 알아보기 어려울 수 있을 것 같습니다만..
일단,
- 코스피, 코스닥 데이터를
concat
으로 하나로 만든 다음, - 읽어들인 S-RIM 데이터와 합칩니다. 이때 합치는 조건으로는 종목코드가 일치하는 데이터에 대해 하나로 합칩니다.
- 그 다음, 합쳐진 데이터에서 S-RIM 적정주가를 계산하여
df_kospi_kosdaq
변수에 저장합니다.
이렇게 한 후에, 현재 데이터상으로는, 나중에 쓰이지 않을 s-rim_value_1
과 같은 컬럼들도 있으므로, 꼭 필요한 컬럼만 걸러서 return
합니다.
이렇게되면 다른 로직들은 수정할 필요가 없어졌습니다.
결과물은 아래와 같습니다.
이렇게 S-RIM 기업가치 데이터를 이용한 기본적인 적정주가 계산을 끝냈습니다.
다음 포스팅에서는 스크리닝 조건식을 추가해봅니다.
'파이썬으로 종목 스크리너 만들기' 카테고리의 다른 글
뇌동매매 금지 - 11. S-RIM을 이용한 목표주가 계산해보기 - 4. S-RIM 적정주가를 이용한 스크리닝 필터 만들기 (0) | 2022.11.27 |
---|---|
뇌동매매 금지 - 11. S-RIM을 이용한 목표주가 계산해보기 - 2. S-RIM 데이터 크롤링하기 (0) | 2022.11.26 |
뇌동매매 금지 - 11. S-RIM을 이용한 목표주가 계산해보기 - 1. S-RIM 개념 알아보기 (0) | 2022.11.26 |
뇌동매매 금지 - 10. Bug fix와 이것저것 추가하기 - 3 (1) | 2022.09.12 |
뇌동매매 금지 - 10. Bug fix와 이것저것 추가하기 - 2 (0) | 2022.09.12 |
댓글