Coding Is My Life

코딩은 인생

파이썬

[Django Project][주식 종목 추천 프로그램 웹에서 구현]

산기대 컴공 2021. 12. 24. 12:16
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