728x90
이번에는 저번에 만든 community사이트에 주식 종목을 추천해주는 프로그램을 구현해 보도록하겠다.
주식 추천 프로그램은 내 블로그에서 한번 소개했었던 envelope를 이용한 주식매매 프로그램을 사용하였다.
https://kpumangyou.tistory.com/93?category=895793
[파이썬][보조지표 envelope를 이용한 코스피 200종목 분석]
Envelope란? n일의 이동평균선에 +m%,-m%를 뜻한다. 분석 내용 보통 20일 이동평균선을 사용하고 m은 트레이더의 성향에 따라 많이 다르나 가장 보편적으로 사용되는 10으로 두고 분석해보겠다. 하향 e
kpumangyou.tistory.com
일단 view코드를 보면 다음과 같다.
import pandas as pd
import bs4
import yfinance as yf
from urllib.request import urlopen # url의 소스코드를 긁어오는 기능
def envelope(N,ma): #엔벨로프 설정 함수
idx = ma.index
plus = {}
minus = {}
for i in range(len(ma)):
plus[idx[i]] = ma[i]+((ma[i]*N)/100)
minus[idx[i]] = ma[i]-((ma[i]*N)/100)
return plus,minus
def company_information(code):
opn = []
code = code
url = 'https://finance.naver.com/item/coinfo.nhn?code={code}'.format(code = code)
source = urlopen(url).read()
source = bs4.BeautifulSoup(source,'lxml')
opinion = source.find_all('span','f_up')
money = source.select_one('#_market_sum')
money = money.get_text()
remove = []
remove.append('\n')
remove.append('\t')
for j in remove:
money = money.replace(j,"")
money = money+'억원'
if len(opinion) == 0:
opinion = 0.00
else:
opinion = opinion[0].find_all('em')[0].text
opn.append(code)
opn.append(opinion)
opn.append(money)
return opn
def stock_program():
# 종목코드 불러오기
stock_code = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download', header=0)[0]
stock_code = stock_code[['회사명','종목코드']]
# rename(columns = {'원래 이름' : '바꿀 이름'}) 칼럼 이름 바꾸기
stock_code = stock_code.rename(columns = {'회사명':'company','종목코드':'code'})
# 종목코드가 6자리이기 때문에 6자리를 맞춰주기 위해 설정해줌
stock_code.code = stock_code.code.map('{:06d}'.format) #6자리가 아닌 수를 앞에 0으로 채우기 위함
# 코스피 200 종목의 이름을 웹 크롤링함
import bs4
from urllib.request import urlopen # url의 소스코드를 긁어오는 기능
#//*[@id="tab_con1"]/div[3]/table/tbody/tr[1]/td/span[1]/em
company_name = []
for i in range(1,21):
page = i
url = 'https://finance.naver.com/sise/entryJongmok.nhn?&page={page}'.format(page = page)
source = urlopen(url).read()
source = bs4.BeautifulSoup(source,'lxml')
source = source.find_all('a',target = '_parent')
for j in range(len(source)):
name = source[j].text
company_name.append(name)
code = []
for i in company_name:
for j in range(len(stock_code)):
if stock_code['company'][j] == i:
code.append(stock_code['code'][j])
break
today_buy_list = []
for i in code:
try:
code = i+'.KS'
data = yf.download(code,start = '2021-11-01')
ma20 = data['Adj Close'].rolling(window = 20).mean()
ma60 = data['Adj Close'].rolling(window = 60).mean()
for j in range(5,10):
plus,minus = envelope(j,ma20)
plus = pd.Series(plus)
minus = pd.Series(minus)
if data['Adj Close'][-2]>minus[-2] and data['Adj Close'][-1] <=minus[-1]:
line = []
line.append(i)
line.append(j)
today_buy_list.append(line)
except:
continue
stock_data = []
for i in today_buy_list:
infomation = company_information(str(i[0]))
line = []
for j in range(len(stock_code)):
if stock_code['code'][j] == infomation[0]:
name = stock_code['company'][j]
line.append('envelope 지수:'+str(i[1])+'%')
line.append('종목코드:'+str(infomation[0]))
line.append('회사명:'+name)
if float(infomation[1])>=4.00:
line.append('애널리스트 평가: 강력매수')
elif float(infomation[1])<4.00 and float(infomation[1])>3.8:
line.append('애널리스트 평가: 매수')
elif float(infomation[1])>=3.00 and float(infomation[1])<=3.8:
line.append('애널리스트 평가: 중립')
else:
line.append('애널리스트 평가: 강력매도')
stock_data.append(line)
break
return stock_data
def stock(request):
if request.method == 'GET':
res_data = {}
res_data['res_data'] = '오늘의 추천 종목받기'
return render(request,'stock.html',res_data)
elif request.method == 'POST':
list1 = stock_program()
data = {'data':list1,'res_data':'오늘의 추천 종목'}
return render(request,'stock.html',data)
프로그램 코드는 다른 파일에 넣어서 하는것이 좋아보인다. 일단 구현이 되는지 확인한 다음에 나중에 수정하도록 하겠다.
다른 코드는 envelope 프로그램 코드를 그대로 사용하였고 값을 전달하는 코드만 살펴보겠다.
list1 = stock_program()
data = {'data':list1,'res_data':'오늘의 추천 종목'}
return render(request,'stock.html',data)
일단 데이터를 리스트로 받아서 딕셔너리로 저장한다음 render로 html에 넘겨 주었다.
그리고 html에서는 for문을 이용해서 리스트의 데이터들을 출력해 주었다.
{% csrf_token %}
{% for i in data %}
{% for j in i %}
{{j}}
<br>
{% endfor %}
<p>------------------------------------</p>
{% endfor %}
웹사이트에서 보면 다음가 같이 출력이 된다.
728x90
'파이썬' 카테고리의 다른 글
[Django Project][community 만들기 - 게시판 만들기(2)] (0) | 2021.12.23 |
---|---|
[Django project][community 만들기 - 게시판 만들기(1)] (0) | 2021.12.23 |
[Django Project][community 만들기 - 세션과 로그인] (0) | 2021.12.12 |
[Django Project][community 만들기 - url 설정하기] (0) | 2021.12.12 |
[Django Project][community 만들기 - template과 view 만들어 주기] (0) | 2021.12.12 |