파이썬 퀀트투자 쉽게하기 - 11. 종목 고르는 프로그램(실행파일) 무료 배포
본문 바로가기
파이썬으로 만든 것들/퀀트투자

파이썬 퀀트투자 쉽게하기 - 11. 종목 고르는 프로그램(실행파일) 무료 배포

by Squat Lee 2022. 6. 7.

 


지난번 사정상 급하게 마지막 강의를 마무리하고 오랜만에 다시 포스트를 올려 봅니다.

파이썬을 배우시는 목적에서 나름 설명을 드렸으나, 종목을 고르는 코드만 필요하신 분들도 계실거라는 생각이 듭니다.

그래서 이번 포스트는 투자할 종목을 고르는 코드를 설명드리고, 포스트의 마지막에는 제가 만든 프로그램도 배포 드릴려고 합니다.

우선 전체 코드는 아래와 같습니다.

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
from PyQt5.QtWidgets import *
from PyQt5 import uic
from pykrx import stock
import pandas as pd
import numpy as np
import sys
 
pbrdps_ui = 'pbrdps.ui'
 
class InvestScreener(QDialog):
    def __init__(self):
        QDialog.__init__(selfNone)
        uic.loadUi(pbrdps_ui, self)
 
        self.btn_screen.clicked.connect(self.make_pbr_dps_list)
 
    def make_pbr_dps_list(self):
        global df
        global invest_date
 
        self.lbl_result.clear()
 
        invest_date = self.lineEdit.text()
        codes = stock.get_market_ticker_list(invest_date, market='ALL')
        corp = []
        for code in codes:
            name = stock.get_market_ticker_name(code)
            corp.append([code, name])
 
        df = pd.DataFrame(data=corp, columns=['code''종목명'])
        df = df.set_index('code')
 
        df_f = stock.get_market_fundamental_by_ticker(invest_date, market='ALL')
        df_c = stock.get_market_cap_by_ticker(invest_date, market='ALL')
 
        df = pd.merge(df, df_f, left_index=True, right_index=True)
        df = pd.merge(df, df_c, left_index=True, right_index=True)
 
        df = df[df['PBR'> 0]
        df['pbr_rank'= df['PBR'].rank()
 
        df = df[df['DPS'> 0]
        df['dps_rank'= df['DPS'].rank()
 
        df['pbr_dps'= df['pbr_rank'+ df['dps_rank']
        df['total_rank'= df['pbr_dps'].rank()
        df = df.sort_values(by='total_rank')
 
        df = df[df['거래량'> 0]
 
        df = df[:30]
 
        df['리스트기준일'= np.array([invest_date] * len(df))
 
        file_name = 'PBR X DPS 기준 종목선정(' + invest_date + ').xlsx'
        df.to_excel(file_name)
        print(df)
        self.lbl_result.setText('종목선정이 완료되어 엑셀파일에 저장하였습니다.')
 
if __name__=='__main__':
    app = QApplication(sys.argv)
    Dialog = InvestScreener()
    Dialog.show()
    app.exec_()
cs

 


        invest_date = self.lineEdit.text()
        codes = stock.get_market_ticker_list(invest_date, market='ALL')
        corp = []
        for code in codes:
            name = stock.get_market_ticker_name(code)
            corp.append([code, name])

기준 날짜를 'LineEdit'으로 입력 받아서 'invest_date'라는 변수에 저장 합니다.

코스닥, 코스피에서 종목 코드를 입력받은 날짜(invest_date) 기준으로 모두 가져와서 'codes'라는 변수에 넣어 줍니다.

'codes'는 List 형태라 종목 코드를 for 문을 사용해서 하나씩 뺀 후 종목 이름을 가져오는 함수(stock.get_market_ticker_name(code))에 인자로 넣어 줍니다.

그리고 나서 "종목코드, 종목이름" 형태로 'corp'라는 List에 저장합니다.


df_f = stock.get_market_fundamental_by_ticker(invest_date, market='ALL')
각종 재무 데이터를 가져와서 데이터 프레임에 저장합니다. 저는 PBR 데이터를 가져오기 위해서 이 함수를 사용했습니다.

 

df_c = stock.get_market_cap_by_ticker(invest_date, market='ALL')

시가총액을 가져와서 데이터프레임에 저장합니다.

 

df = pd.merge(df, df_f, left_index=True, right_index=True)
df = pd.merge(df, df_c, left_index=True, right_index=True)

가져와서 만든 데이터프레임을를 모두 병합해 줍니다.

 

df = df[df['PBR'> 0]
df['pbr_rank'= df['PBR'].rank()

PBR이 0인 종목만 걸러내서 순서를 매겨줍니다.

 

df = df[df['DPS'> 0]
df['dps_rank'= df['DPS'].rank()
DPS가 0 이상인 항목만 걸러내서 순위를 매겨줍니다.
 
df['pbr_dps'= df['pbr_rank'+ df['dps_rank']
df['total_rank'= df['pbr_dps'].rank()
df = df.sort_values(by='total_rank')
PBR과 DPS의 순위를 더한 다음 pbr_dps라는 컬럼을 만들어 줍니다. 그리고 순위를 매기고, 낮은 순으로 정렬합니다.
 
 
df = df[df['거래량'> 0]
df = df[:30]
거래량이 0 이상인 항목만 걸러내서 30개 항목의 데이터만 표시해줍니다.

 

df['리스트기준일'= np.array([invest_date] * len(df))
file_name = 'PBR X DPS 기준 종목선정(' + invest_date + ').xlsx'
df.to_excel(file_name)

'리스트기준일' 컬럼을 만들어서 날짜를 기입하고, 엑셀파일로 만들어 줍니다.


위의 코드로 만든 실행파일(exe)을 공유합니다.

 

아래의 링크를 클릭해서 다운로드 받으시기 바랍니다.

 

공유드리는 프로그램은 무료이고 마음껏 사용하셔도 무방하나, 혹시나 본 프로그램을 이용해서 투자를 하실때 책임은 사용자 본인에게 있음을 유의하시기 바랍니다.



퀀트 종목 자동으로 고르는 프로그램 다운로드



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



728x90
반응형

댓글