본문 바로가기
컴퓨터/Python

[Python] 파이썬, 투자할 주식 종목 자동으로 추려보자!

by sjblog 2021. 11. 22.
반응형

1. 서론

코스피, 코스닥 종목이 너무 많다.

 

어디에 투자해야 하는지도 모르겠는데, 모든 종목을 확인할 시간도 없다.

 

기술적 지표를 보고, 파이썬을 이용해 자동으로 투자할만한 주식 종목을 추려보자!

 

엑셀로 마무리 작업까지 해서 대략 이 정도로 만들고자 한다!

2. 준비물

VScode, Python

 

3. 전체 종목코드와 종목명 가져오기

import pandas as pd
import numpy as np
import getpass
from pykrx import stock

 

from pykrx import stock

# pykrx를 통해 국내 주식 정보를 가져올 수 있습니다.

https://github.com/sharebook-kr/pykrx

 

GitHub - sharebook-kr/pykrx: KRX 주식 정보 스크래핑

KRX 주식 정보 스크래핑. Contribute to sharebook-kr/pykrx development by creating an account on GitHub.

github.com

 

 

stock_list = pd.DataFrame({'종목코드':stock.get_market_ticker_list(market="ALL")})
stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_market_ticker_name(x))

 

stock_list = pd.DataFrame({'종목코드':stock.get_market_ticker_list(market="ALL")})

stock_list['종목명'] = stock_list['종목코드'].map(lambda x: stock.get_market_ticker_name(x))

market="ALL" 모든 종목 주식

market="KOSPI" 코스피

market="KOSDAQ" 코스닥

# ETF 등은 get_etf_ticker_list 함수를 확인해주세요

 

 

4. 전체 종목의 펀더멘탈 지표 가져오기

펀더멘탈 지표는 PER, PBR, EPS, BPS, DIV, DPS를 가져옵니다.

stock_fud = pd.DataFrame(stock.get_market_fundamental_by_ticker(date='20211119', market="ALL"))
stock_fud = stock_fud.reset_index()
stock_fud.rename(columns={'티커':'종목코드'}, inplace=True)

 

stock_fud = pd.DataFrame(stock.get_market_fundamental_by_ticker(date=stock_date, market="ALL"))

# date='기준날짜'

# 오늘 날짜를 입력해줍니다.

# 휴일일 경우 조회가 되지 않으므로, 전날 날짜를 입력해줍니다.

 

 

5. 전체 종목코드, 종목명, 펀더멘탈 지표 모두 합치기

stock_list와 stock_fud 데이터 프레임을 '종목코드'가 같은 것끼리 합쳐봅니다.

result = pd.merge(stock_list, stock_fud, left_on='종목코드', right_on='종목코드', how='outer')

 

result = pd.merge(stock_list, stock_fud, left_on='종목코드', right_on='종목코드', how='outer')

# how='outer' 옵션은

# stock_list에는 종목코드가 존재하는데, stock_fud에는 종목코드가 존재하지 않을 수 있고

# 반대로, stock_list에는 존재하지 않는데, stock_fud에는 존재할 수 있기 때문에 (상장폐지, 신규상장 등의 이유로)

# 종목코드가 없으면 빈 값으로 두고 삭제하지 않겠다는 옵션입니다.

# ('outer' 옵션을 넣지 않을 경우, 그 종목은 삭제가 됩니다.)

 

 

6. 전체 종목가격 가져오고, 합치기

마찬가지로 전체 종목의 가격을 가져옵니다.

stock_price = stock.get_market_ohlcv_by_ticker(date='20211119', market="ALL")
stock_price = stock_price.reset_index()
stock_price.rename(columns={'티커':'종목코드'}, inplace=True)

result1 = pd.merge(result, stock_price, left_on='종목코드', right_on='종목코드', how='outer')

내용은 4. 5. 와 같습니다.

 

자 이제,

print(result1)

으로 데이터가 잘 만들어졌는지 확인해봅시다.

 

7. 불필요한 값 제거

펀더멘탈 지표 중에 값이 없는 경우가 있습니다.

또, 거래정지, 상장폐지된 종목은 시가, 고가, 저가, 종가 등이 존재하지 않아 0으로 표시됩니다.

result1 = result1.replace([0], np.nan)
result1 = result1.dropna(axis=0)

 

result1 = result1.replace([0], np.nan)    # 0값을 NaN으로 변경

# 0 값을 NaN으로 변경해줍니다.

 

 

result1 = result1.dropna(axis=0)      # NaN을 가진 행 제거

# NaN을 가진 행을 모두 제거합니다. (axis = 0 은 행을 제거)(axis = 1 은 열을 제거)

 

 

8. 내재가치 계산하기

내재가치 = (BPS + EPS * 10) / 2

 

로 기술적 지표들을 활용하여 이 종목이 얼마의 가치가 있는지 확인할 수 있는 방법입니다.

(내재가치에 대한 자세한 설명은 논외로 하겠습니다.)

(본인의 원하는 계산식으로 수정하여 줍시다.)

result1['내재가치'] = (result1['BPS'] + (result1['EPS']) * 10) / 2
result1['내재가치/종가'] = (result1['내재가치'] / result1['종가'])

1. 첫번째 줄

'내재가치'라는 컬럼을 만들어 주고, 그 값은 위의 식을 통해 계산하여 값을 넣어주었습니다.

 

2. 두번째 줄

'내재가치'가 현재 종가의 몇 배인지 계산하여 '내재가치/종가' 컬럼을 만들어 값을 넣어주었습니다.

 

9. 엑셀로 저장

만든 데이터 프레임을 엑셀로 저장하여 확인하여 봅니다.

username = getpass.getuser()    #사용자이름
result1.to_excel('C:\\Users\\' + username + '\\Desktop\\data.xlsx')

 

username = getpass.getuser()    #사용자이름

# 사용자이름은 컴퓨터마다, 사용자마다 다를 수 있기 때문에 username에 사용자이름을 넣었습니다.

 

 

result1.to_excel('C:\\Users\\' + username + '\\Desktop\\data.xlsx')

# 바탕화면에 data.xlsx로 저장합니다.

 

 

10. 너무 많다. 더 추려 볼까?

"9. 엑셀로 저장 " 까지만 해도 내재가치가 종가보다 큰 종목들을 엑셀 작업을 통해 추려볼 수 있습니다.

 

그런데, 여전히 많다. 더 추려봅시다

 

본인이 원하는 로직이 있을테니 아래를 참고하여 본인이 원하는 종목을 추려봅시다.

 

아래는,

 

PER <= 10 (PER가 10보다 같거나 작고)

PBR <= 1 (PBR이 1보다 같거나 작고)

내재가치/종가 >= 1.5 (내재가치/종가가 1.5배 이상인)

 

종목들만 추려보았습니다.

PERv10 = result1['PER'] <= 10
PBRv1 = result1['PBR'] <= 1
inner_value = result1['내재가치/종가'] >= 1.5
result2 = result1[PERv10 & PBRv1 & inner_value]
result2.to_excel('C:\\Users\\' + username + '\\Desktop\\data.xlsx')

1. 첫번째 줄

PER <= 10 (PER가 10보다 같거나 작고)

 

2. 두번째 줄

PBR <= 1 (PBR이 1보다 같거나 작고)

 

3. 세번째 줄

내재가치/종가 >= 1.5 (내재가치/종가가 1.5배 이상인)

 

4. 네번째 줄

위의 조건들에 맞는 종목들을 만든다. 

 

5. 다섯번째 줄

바탕화면에 data.xlsx 로 저장합니다.

 

 

원하는 종목을 위의 옵션들을 변경해보며 본인에게 맞는, 맞춤형 종목을 추려봅시다!

(위의 종목이 반드시 수익을 보장하지 않습니다.)

 

반응형