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
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 로 저장합니다.
원하는 종목을 위의 옵션들을 변경해보며 본인에게 맞는, 맞춤형 종목을 추려봅시다!
(위의 종목이 반드시 수익을 보장하지 않습니다.)
'컴퓨터 > Python' 카테고리의 다른 글
[Python] 파이썬, 주식 차트와 보조지표 그리기 (Plotly) (0) | 2021.12.20 |
---|---|
[Python] 파이썬, 백트레이더(Backtrader)로 백테스팅 하기 (2) | 2021.11.30 |
[Python] 파이썬, HTML로 카카오맵 api 해상도 높은 큰 지도 만들기 (0) | 2021.11.18 |
[Python] 파이썬, 로컬 서버 localhost 간단하게 만들기(터미널, 코드) (0) | 2021.11.13 |
딥페이크, 얼굴 바꾸기: Faceswap 설치 및 사용법 (2) (61) | 2020.11.12 |