on
[Django Project][주식 종목 추천 프로그램 웹에서 구현]
[Django Project][주식 종목 추천 프로그램 웹에서 구현]
반응형
이번에는 저번에 만든 community사이트에 주식 종목을 추천해주는 프로그램을 구현해 보도록하겠다.
주식 추천 프로그램은 내 블로그에서 한번 소개했었던 envelope를 이용한 주식매매 프로그램을 사용하였다.
https://kpumangyou.tistory.com/93?category=895793
일단 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('
') 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}} {% endfor %} ------------------------------------ {% endfor %}
웹사이트에서 보면 다음가 같이 출력이 된다.
반응형
from http://kpumangyou.tistory.com/108 by ccl(A) rewrite - 2021-12-24 12:26:51