마법의 공식 파이썬 코드
본문 바로가기
파이썬(Python)/마법의 공식

마법의 공식 파이썬 코드

by 만초손겸수익 2021. 12. 12.

 

 

 

이전에 블로그의 다른 포스트에서 마법의 공식 코드를 올린적이 있다.

 

에러가 난다는 문의글이 댓글로 달려서 결국 에러를 수정했다. 에러의 이유는 없어진 기업 코드를 KRX에서 불러올때 발생한다. 그래서 try~except 문을 추가했다.

 

전문적으로 코딩을 하는 사람은 보통 Git Hub를 이용한다. 내가 만든 코드는 그렇게 복잡하거나 내용이 많지 않으니, 블로그에 올려 놓는다. 그렇게 하면 오히려 나중에 응용해서 다른 코드를 만들때 훨씬 수월하다.

 

마법의 공식으로 걸러낸 종목들은 투자한 기업을 고를때 시간도 아껴주고 유용하다. 신기하게도 이렇게 고른 기업들 중 저평가 된 기업이 의외로 많이 보인다.

 

세상이 많이 좋아졌다. 이런 파이썬이라는 언어는 나 같이 회사일을 본업으로 하는 가장에게 투자함에 있어서 많은 시간을 절약해 준다. 내가 노력한 것에 비해서 파이썬은 더 많은 것을 나에게 안겨 주는 것 같다. 파이썬을 만든 "귀도 반 로섬"을 비롯해 많은 모듈을 만들고, 공유해 준 여러 프로그래머들에게 깊은 감사의 인사를 드리고 싶다.

 

나 또한 어설픈 능력이지만, 내가 받은 고마움을 이렇게 코드를 블로그에 공개함으로써 보답하려고 한다. 

 

나눠야지 내가 얻는다. 내가 얻은 지식은 내가 잘나서 얻은게 아니다. 다른 고마운 분들의 노력에 의해서 내가 얻은 지식이다. 

 

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
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 = '2021/09'
date = '20211210'
make_magic_df(year, date)
cs

 

728x90
반응형

댓글