(업데이트) 파이썬으로 마법의 공식 구현하기 4 - 전체 코드 (파이썬 코드파일 공유)
본문 바로가기
파이썬으로 만든 것들/마법의 공식

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

by Squat Lee 2021. 5. 29.

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

이전 포스트는 아래링크를 클릭하세요 ↓

2021.05.26 - [취미로 하는 파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 1 - 종목 데이터, PER 가져오기

 

파이썬으로 마법의 공식 구현하기 1 - 종목 데이터, PER 가져오기

조엘그린블란트의 마법의 공식은 상당히 유명합니다. PER과 ROA를 이용해서 종목을 골라내는 방법이죠.(엄밀히 말하면 실제 마법의 공식과 약간 다릅니다.) 우리나라에서는 맞지 않다고 하시는

dotsnlines.tistory.com

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

 

파이썬으로 마법의 공식 구현하기 2 - ROA, ROE 가져오기

지난번 포스트에 이어서 이번에는 ROA를 웹에서 가져오는 방법을 기록하겠습니다. 지난번 포스트는 아래 링크를 참고하세요 ↓ 2021.05.26 - [파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기

dotsnlines.tistory.com

2021.05.28 - [취미로 하는 파이썬/Python Project] - 파이썬으로 마법의 공식 구현하기 3 - ROA, PER의 순위를 매겨서 최종순위 정렬하기

 

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

지난번 포스트까지 전 종목 코드와 PER을 가져오는 함수와 코드를 입력하면 ROA를 가져올 수 있는 함수를 만들었습니다. 지난번 포스트는 아래 링크를 참고하세요. ↓ 2021.05.27 - [파이썬/Python Proje

dotsnlines.tistory.com



이번 포스트는 전체코드를 기록하겠습니다.

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'

 

혹시나 안 되시는 분들을 위해서 작성한 파이썬 파일도 공유드리니 참고하세요

magic_update.py
0.00MB

 

11가지 프로젝트로 시작하는 Do it! 파이썬 생활 프로그래밍:문자열 가공 CSV 파일 처리 통계 분석 웹 크롤링까지, 이지스퍼블리싱 파이썬 증권 데이터 분석:파이썬 입문 웹 스크레이핑 트레이딩 전략 자동 매매, 한빛미디어 파이썬을 활용한 금융공학 레시피:문과생의 코딩 울렁증과 이과생의 금융 울렁증을 한 방에 씻어줄 금융공학, 한빛미디어 Do it! 첫 파이썬:게임하듯 배우는 나의 첫 프로그래밍 책, 이지스퍼블리싱 이지스퍼블리싱 Do it! 점프 투 파이썬 (개정판)

 

※ 웹크롤링을 하시다가 문제가 발생할 수 있으니 주의하시기 바랍니다. 본 블로그는 개인 공부목적의 기록 공간이므로 불법적 사용에 대한 권유나 조장을 하지 않았으며, 어떠한 책임도 없음을 알려드립니다.

 

최근 회계 데이터가 업데이트 되면 아래와 같이 바꿔주어야 합니다.

year ='2021/03'   ===>   year = '2021/06'

계속 댓글로 문의를 주시는 분들이 있어서 공지 드리며, 2021.09.05 자로 실행해본 파일을 업로드 해 드리니 참고하세요. (↓↓↓ 아래 파일입니다.)

 

magic_update.py
0.00MB

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

 

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

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

 

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

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

dotsnlines.tistory.com

 

728x90
반응형

댓글