파이썬으로 마법의 공식 구현하기 3 - ROA, PER의 순위를 매겨서 최종순위 정렬하기
본문 바로가기
파이썬으로 만든 것들/마법의 공식

파이썬으로 마법의 공식 구현하기 3 - ROA, PER의 순위를 매겨서 최종순위 정렬하기

by Squat Lee 2021. 5. 28.

지난번 포스트까지 전 종목 코드와 PER을 가져오는 함수와 코드를 입력하면 ROA를 가져올 수 있는 함수를 만들었습니다.

 

지난번 포스트는 아래 링크를 참고하세요. ↓

2021.05.27 - [파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 2 - ROE 가져오기

이번에는 이미 만들어진 함수를 가지고 데이터프레임을 만들고 각각 순위를 매겨서 최종 순위를 매기는 코드를 만들어 보겠습니다.

# krx 데이터 '종목코드', '종목명', 'PER' 가져오기
codes = get_ticker_per(date)

codes['종목코드'] = codes.index

종목코드와 PER을 가져와서 codes라는 변수의 데이터프레임에 담습니다. 종목코드는 인덱스로 되어있기 때문에 임의로 종목코드의 컬럼을 하나 만듭니다.(ROA와 합치기 위해서 종목코드 컬럼을 하나 만들어 주었습니다.)


codes['종목코드'] = codes['종목코드'].apply(lambda x: 'A' + x)

KRX에서 가져온 종목코드는 '000000' 이렇게 6자리 숫자로 되어있습니다. 하지만, 에프엔가이드에서는 앞에 'A'가 붙어서 'A000000' 이렇게 표시됩니다. 그래서 람다함수를 써서 강제로 'A'를 종목코드 앞에 붙여줍니다.


# ROA를 가져와서 데이터프레임 만들기
for num, code in enumerate(codes['종목코드']):

   try:
      if num == 0:
         roa_df = get_roa(code, year)
    else:
         roa_df = pd.concat([roa_df, get_roa(code, year)])
         time.sleep(0.01)
     except:
          pass

종목코드를 하나씩 가져와서 roa_df 변수에 담습니다. 첫번째 가져오는 데이터는 roa_df에 담고, 두번째부터는 이미 만들어진 데이터와 새로만든 데이터를 합쳐줍니다.

 

time.sleep은 0.01초로 주었는데, 크롤링할때 문제가 되지 않네요. 다행입니다.


print(len(codes['종목코드']) - num, codes['종목명'][num])

2,400개 종목을 가져오는거기 때문에 시간이 오래 걸립니다. 그래서 얼마나 남았는지 알아보기 위해 print문을 사용하였습니다.


# 인덱스를 코드로 바꾸기
codes = codes.set_index('종목코드')

인덱스를 종목코드로 지정해 줍니다.


# ROE, ROA 문자형 데이터를 숫자로 변경
roa_df['ROA'] = pd.to_numeric(roa_df['ROA'], errors='coerce') #문자가 있을시 에러발생을 N/A로 변경
roa_df = roa_df['ROA'].dropna()

모든 데이터는 string(문자형)으로 출력이 되기 때문에 rank() 함수가 제대로 작동되지 않습니다.

 

이것을 숫자로 변경시켜줍니다. 하지만, 데이터 중 진짜문자가 포함되어 있으면 에러가 발생하기에 errors='coerce' 옵션을 넣어줍니다. 이 옵션을 사용하면 실제문자는 N/A로 변경됩니다. 

 

dropna()함수로 'N/A'가 포함된 행은 모두 삭제합니다. 

 

# 전체 마법의 공식 데이터 만들기
total_df = pd.merge(codes, roa_df, left_index=True, right_index=True)

종목코드, PER, ROA 데이터프레임을 합쳐서 total_df를 만듭니다.


#값이 0인 행 제거
total_df = total_df[total_df['PER'] != 0]

PER 컬럼에서 0이 있으면 순위가 올라가서 잘못된 데이터가 높은 순위로 올라가기 때문에 삭제해 주어야 합니다.


# # PER 순위매기기
total_df['per_rank'] = total_df['PER'].rank()

total_df['roa_rank'] = total_df['ROA'].rank(ascending=False)
total_df['total'] = total_df['per_rank'] + total_df['roa_rank']
total_df['total_rank'] = total_df['total'].rank()
total_df = total_df.sort_values(by=['total_rank'])

PER을 낮은 순으로 순위로 매기고, ROA는 높은 순으로 순위를 매겨서 두 순위를 더해서 'total_df['total']' 컬럼을 만들어줍니다. 그리고 total_df['total_rank'] 컬럼을 만들어서 낮은 순으로 정렬을 해줍니다.


today = datetime.today().strftime('%y-%m-%d')
total_df.to_excel('Magic('+ today + ').xlsx')

오늘 날짜로 엑셀파일에 데이터를 저장합니다.

 

전체 코드는 다음 포스트에 올리도록 하겠습니다.

2021.05.29 - [파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 4 - 전체 코드

 

(업데이트) 파이썬으로 마법의 공식 구현하기 4 - 전체 코드 (파이썬 코드파일 공유)

지난 포스트까지 전체 종목코드와 PER을 가져오고, 에프엔가이드 사이트에서 ROA를 크롤링해서 데이터프레임을 만들고 마법의 공식을 구현하는 코드를 작성해 보았습니다. 이전 포스트는 아래링

dotsnlines.tistory.com

 

 

CAGR(연복리 수익률) 30%를 목표로 하는 파이썬 퀀트투자법이 궁금하시다면 아래 링크를 클릭해 보시기 바랍니다.

2021.11.21 - [집구석 강의/파이썬 퀀트투자 쉽게하기] - 파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글

 

파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글

퀀트투자는 참으로 매력적인 투자방법입니다. 일정한 기준으로 종목을 선별해서 일정한 기간 후에 기계적으로 매도하고, 다시 같은 방법으로 매수합니다. 이런 작업을 계속해서 반복하다 보면

dotsnlines.tistory.com

 

728x90
반응형

댓글