5.3.2 유니버스 구성하기
이제 크롤링해 온 데이터를 바탕으로 구성 조건에 맞게 유니버스를 생성해 보겠습니다. 앞서 작성한 크롤링 코드 다음에 get_universe 함수를 추가해 보겠습니다.
make_up_universe.py
(...)
def get_universe():
df = execute_crawler() ------ 크롤링 결과를 얻어 옴
mapping = {',': '', 'N/A': '0'}
df.replace(mapping, regex=True, inplace=True)
cols = ['거래량', '매출액', '매출액증가율', 'ROE', 'PER'] ------ 사용할 column들 설정
df[cols] = df[cols].astype(float) ------ column들을 숫자 타입으로 변환(Naver Finance를 크롤링해 온 데이터는 str 형태)
df = df[(df['거래량'] > 0) & (df['매출액'] > 0) & (df['매출액증가율'] > 0) & (df['ROE'] > 0) & (df['PER'] > 0) & (~df.종목명.str.contains("지주")) & (~df.종목명.str.contains("홀딩스"))] ------ 유니버스 구성 조건 ➊~➍를 만족하는 데이터 가져오기
df['1/PER'] = 1 / df['PER'] ------ PER 역수
df['RANK_ROE'] = df['ROE'].rank(method='max', ascending=False) ------ ROE의 순위 계산
df['RANK_1/PER'] = df['1/PER'].rank(method='max', ascending=False) ------ 1/PER의 순위 계산
df['RANK_VALUE'] = (df['RANK_ROE'] + df['RANK_1/PER']) / 2 ------ ROE 순위, 1/PER 순위를 합산한 랭킹
df = df.sort_values(by=['RANK_VALUE']) ------ RANK_VALUE를 기준으로 정렬
df.reset_index(inplace=True, drop=True) ------ 필터링한 데이터프레임의 index 번호를 새로 매김
df = df.loc[:199] ------ 상위 200개만 추출
df.to_excel('universe.xlsx') ------ 유니버스 생성 결과를 엑셀로 출력
return df ['종목명'].tolist()