더북(TheBook)

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()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.