삶의 공유

[Python활용]종목별 Valuation 및 저평가 주식 Search 자동화 Project[3] 본문

Data Scientist/Python

[Python활용]종목별 Valuation 및 저평가 주식 Search 자동화 Project[3]

dkrehd 2022. 1. 30. 21:38
728x90
반응형

안녕하세요 ~~~

 

지난번 포스팅에 이어서 3번째 시간으로 크롤링한 삼성전자의 재무제표에서 주요 정보만 산출하고 그 데이터의 컬럼명을 선정 후 데이터프레임형태로 만들어보겠습니다. 우선 필요한 컬럼명 입니다.

 

  • 최근 3년 평균 성장률(매출, 영업이익, 순이익, EPS)
  • 직전 연도 부채 비율 
  • EPS, PER, PBR, BPS, PEG, PSR, 적정주가

의 컬럼이 필요합니다.

 

 

위에 해당하는 각각의 값들을 하나씩 구해보겠습니다.

 

1) 최근 3년 평균 성장률(매출, 영업이익, 순이익, EPS)

 

- 매출액 성장률

revenue_growth_rate = 0
temp = 0
for i in range(len(df_semi['매출액'])):
    if i < 3:
        temp += (df_semi['매출액'][i+1] - df_semi['매출액'][i]) / df_semi['매출액'][i]
revenue_growth_rate = (temp / (len(df_semi['매출액'])-1)) *100
revenue_growth_rate

 

- 영업이익 성장률

semiincome_growth_rate = 0
temp = 0
for i in range(len(df_semi['영업이익'])):
    if i < 3:
        temp += (df_semi['영업이익'][i+1] - df_semi['영업이익'][i]) / df_semi['영업이익'][i]
semiincome_growth_rate = (temp / (len(df_semi['영업이익'])-1)) *100
semiincome_growth_rate

 

- 당기 순이익 성장률

income_growth_rate = 0
temp = 0
for i in range(len(df_semi['당기순이익'])):
    if i < 3:
        temp += (df_semi['당기순이익'][i+1] - df_semi['당기순이익'][i]) / df_semi['당기순이익'][i]
income_growth_rate = (temp / (len(df_semi['당기순이익'])-1)) *100
income_growth_rate

 

- EPS 증가율

EPS_growth_rate = 0
temp = 0
for i in range(len(df_semi['EPS(원)'])):
    if i < 3:
        temp += (df_semi['EPS(원)'][i+1] - df_semi['EPS(원)'][i]) / df_semi['EPS(원)'][i]
EPS_growth_rate = (temp / (len(df_semi['EPS(원)'])-1)) *100
EPS_growth_rate

 

2) 직전 연도 부채 비율

 

- 부채비율

debt = df_semi['부채비율'][2]
debt

 

3) EPS, PER, PBR, BPS, PEG, PSR, 적정주가

 

- EPS 

EPS_C = df_semi['EPS(원)'][2]
EPS_E = df_semi['EPS(원)'][3]
print(EPS_C,"/" ,EPS_E)

- ROE

ROE_C = df_semi['ROE(지배주주)'][2]
ROE_E = df_semi['ROE(지배주주)'][3]
print(ROE_C,"/" ,ROE_E)

- 적정 주가 구하기 (EPS*ROE)

right_price_C = EPS_C * ROE_C
right_price_E = EPS_E * ROE_E
print(right_price_C,"/" ,right_price_E)

- PSR 구하기

 : PSR을 구하기에 앞서 현재 주가와 시가 총액을 구해야 합니다. 

※ PSR = 시가 총액 / 매출액

앞서 재무제표를 크롤링한것과 동일한 url에서 위치만 다르기 때문에 코드에서 숫자만 바꿔주면 됩니다.

아래 지표에서 현재가와 시가 총액을 가져 올 것 입니다.

code = '005930'
URL = f"https://finance.naver.com/item/main.nhn?code={code}"
r = requests.get(URL)
df_2 = pd.read_html(r.text)[4]
df_2.index=df_2['종목명']
df_2 = df_2.transpose()
df_2 = df_2.drop([df_2.index[0]]) # 컬럼명 중복 인덱스 삭제
company_name = df_2.index[0].split('*')[0] # 종목명
price_C = float(df_2['현재가'][0]) # 현재가
total_company_value = float(df_2['시가총액(억)'][0]) # 시가총액
print(price_C,"/" ,total_company_value)

이제 위의 값을 기준으로 PSR을 구해보겠습니다.

PSR_C = total_company_value / df_semi['매출액'][-2]
PSR_E = total_company_value / df_semi['매출액'][-1]
print(PSR_C,"/" ,PSR_E)

 

DataFrame화 하기

 

자 이제 모든 준비는 다 되었습니다. 이렇게 구하신 값들을 key, value의 조합으로 이루어지는 딕셔너리 형태로 만들어주겠습니다. 그런 다음 딕셔너리를 DataFrame화 할 것 입니다.

 

raw_list = {
    '종목명' : company_name,
    '현재가' : price_C,
    '시가총액(억)' : total_company_value,
    '매출액성장률' : revenue_growth_rate,
    '영업이익성장률' : semiincome_growth_rate,
    '당기순이익성장률' : income_growth_rate,
    '부채비율' : debt,
    'EPS(직전)': EPS_C,
    'EPS(예측)' : EPS_E,
    'PER(직전)' : PER_C,
    'PER(예측)' : PER_E,
    'ROE(직전)' : ROE_C,
    'ROE(예측)' : ROE_E,
    'PBR(직전)' : PBR_C,
    'PBR(예측)' : PBR_E,
    '적정주가(직전)' : right_price_C,
    '적정주가(예측)' : right_price_E,
    'PEG(직전)' : PEG_C,
    'PEG(예측)' : PEG_E,
    'PSR(직전)' : PSR_C,
    'PSR(예측)' : PSR_E
}

 

df_final = pd.DataFrame([raw_list])
df_final

아래와 같이 잘 나온 것을 볼 수 있습니다.

 

이제 이 코드를 활용해서 코스피, 코스닥 전 종목에 대해서 크롤링하여 데이터 베이스화를 한 뒤에 Excel 형태로 저장해서 DB화 하겠습니다.

 

오늘 포스팅은 이만 마치도록 하겠습니다.

 

다음 포스팅에 이어서 코스피, 코스닥 전종목에 대해서 크롤링 후 Excel로 저장하는 방법에 대해서 말씀드리도록 하겠습니다.

 

글을 읽어 주셔서 감사합니다.

반응형