지난 포스트까지 전체 종목코드와 PER을 가져오고, 에프엔가이드 사이트에서 ROA를 크롤링해서 데이터프레임을 만들고 마법의 공식을 구현하는 코드를 작성해 보았습니다.
이전 포스트는 아래링크를 클릭하세요 ↓
2021.05.26 - [취미로 하는 파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 1 - 종목 데이터, PER 가져오기
2021.05.27 - [취미로 하는 파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 2 - ROA, ROE 가져오기
2021.05.28 - [취미로 하는 파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 3 - ROA, PER의 순위를 매겨서 최종순위 정렬하기
이번 포스트는 전체코드를 기록하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import requests
import pandas as pd
from pykrx import stock
import time
from datetime import datetime
#종목, PER 가져오기
def get_ticker_per(date):
tickers = stock.get_market_ticker_list(date, market='ALL')
corp=[]
for ticker in tickers:
corp_name = stock.get_market_ticker_name(ticker)
corp.append([ticker, corp_name])
df = pd.DataFrame(data=corp, columns=['종목코드', '종목명'])
df = df.set_index('종목코드')
df_f = stock.get_market_fundamental_by_ticker(date, market='ALL')
df = pd.merge(df, df_f, left_index=True, right_index=True)
return df
def get_roa(code, year):
url = 'https://comp.fnguide.com/SVO2/ASP/SVD_FinanceRatio.asp?pGB=1&gicode=' + code + \
'&cID=&MenuYn=Y&ReportGB=&NewMenuID=104&stkGb=701'
fr_page = requests.get(url)
fr_tables = pd.read_html(fr_page.text)
temp_df = fr_tables[0]
temp_df = temp_df.set_index(temp_df.columns[0])
temp_df = temp_df.loc[['ROA계산에 참여한 계정 펼치기', 'ROE계산에 참여한 계정 펼치기']]
temp_df.index = ['ROA', 'ROE']
temp_df = pd.DataFrame({code : temp_df[year]})
temp_df = temp_df.transpose()
return temp_df
def make_magic_df(year, date):
# krx 데이터 '종목코드', '종목명', 'PER' 가져오기
codes = get_ticker_per(date)
codes['종목코드'] = codes.index
print(codes)
codes['종목코드'] = codes['종목코드'].apply(lambda x: 'A' + x)
# 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
print(len(codes['종목코드']) - num, codes['종목명'][num])
# 인덱스를 코드로 바꾸기
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()
# 전체 마법의 공식 데이터 만들기
total_df = pd.merge(codes, roa_df, left_index=True, right_index=True)
#값이 0인 행 제거
total_df = total_df[total_df['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'])
today = datetime.today().strftime('%y-%m-%d')
total_df.to_excel('Magic('+ today + ').xlsx')
print(total_df)
year = '2020/12'
date = '20210521'
print(make_magic_df(year, date))
|
cs |
위의 코드에서 에러가 나는 분들이 아마 계실겁니다.
데이터를 가져오는 사이트가 업데이트 되면서 생긴 문제인 것 같습니다.
아래에서 3번째 코드를 최근 회계년월로 바꿔 주시면, 아마 제대로 실행이 될 겁니다.
year ='2020/12' ===> year = '2021/03'
혹시나 안 되시는 분들을 위해서 작성한 파이썬 파일도 공유드리니 참고하세요
※ 웹크롤링을 하시다가 문제가 발생할 수 있으니 주의하시기 바랍니다. 본 블로그는 개인 공부목적의 기록 공간이므로 불법적 사용에 대한 권유나 조장을 하지 않았으며, 어떠한 책임도 없음을 알려드립니다.
최근 회계 데이터가 업데이트 되면 아래와 같이 바꿔주어야 합니다.
year ='2021/03' ===> year = '2021/06'
계속 댓글로 문의를 주시는 분들이 있어서 공지 드리며, 2021.09.05 자로 실행해본 파일을 업로드 해 드리니 참고하세요. (↓↓↓ 아래 파일입니다.)
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
CAGR(연복리 수익률) 30%를 목표로 하는 파이썬 퀀트투자법이 궁금하시다면 아래 링크를 클릭해 보시기 바랍니다.
2021.11.21 - [집구석 강의/파이썬 퀀트투자 쉽게하기] - 파이썬 퀀트투자 쉽게하기 - 1. 들어가는 글
'파이썬(Python) > 마법의 공식' 카테고리의 다른 글
파이썬 마법의 공식 - 1. 시작하는 글 (2) | 2022.06.12 |
---|---|
마법의 공식 파이썬 코드 (0) | 2021.12.12 |
파이썬으로 마법의 공식 구현하기 3 - ROA, PER의 순위를 매겨서 최종순위 정렬하기 (0) | 2021.05.28 |
파이썬으로 마법의 공식 구현하기 2 - ROA, ROE 가져오기 (3) | 2021.05.27 |
파이썬으로 마법의 공식 구현하기 1 - 종목 데이터, PER 가져오기 (2) | 2021.05.26 |
댓글