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

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

by 만초손겸수익 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
반응형

댓글