지난번 포스트까지 전 종목 코드와 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 - 전체 코드
CAGR(연복리 수익률) 30%를 목표로 하는 파이썬 퀀트투자법이 궁금하시다면 아래 링크를 클릭해 보시기 바랍니다.
2021.11.21 - [집구석 강의/파이썬 퀀트투자 쉽게하기] - 파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글
'파이썬(Python) > 마법의 공식' 카테고리의 다른 글
파이썬 마법의 공식 - 1. 시작하는 글 (2) | 2022.06.12 |
---|---|
마법의 공식 파이썬 코드 (0) | 2021.12.12 |
(업데이트) 파이썬으로 마법의 공식 구현하기 4 - 전체 코드 (파이썬 코드파일 공유) (9) | 2021.05.29 |
파이썬으로 마법의 공식 구현하기 2 - ROA, ROE 가져오기 (3) | 2021.05.27 |
파이썬으로 마법의 공식 구현하기 1 - 종목 데이터, PER 가져오기 (2) | 2021.05.26 |
댓글