본문 바로가기
심심풀이 project

회귀 알고리즘을 이용한 주가분석 -2

by winston1214 2020. 5. 17.
반응형

바로 전 게시물에는 KOSPI 200을 추출하였다. 이번에는 상위 10개 종목인 K10을 추출해보겠다. 2019.10.31일 기준 시가총액 상위 10개 기업은 아래와 같다.

005930 삼성전자
000660 SK하이닉스
005935 삼성전자우
207940 삼성바이오로직스
068270 셀트리온
005380 현대차
035420 NAVER
012330 현대모비스
051910 LG화학
055550 신한지주

나는 이 회사들의 시가총액을

http://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd=005930

 

온라인기업정보 - 기업모니터 - 기업개요(삼성전자)

요약정보 시세정보 주가/전일대비/수익률 47,850원 / -150원 / -0.31% 52Weeks 최고/최저 62,800원 / 40,850원 액면가 100원 거래량/거래대금 18,463,100주 / 8,876억원 시가총액 2,856,541억원 52주베타 0.98 발행주식�

companyinfo.stock.naver.com

위와 같은 사이트에서 받아올 것이다.

이 사이트의 특징은 cmp_cd 다음에 주가 번호를 입력하면 그 주가번호에 해당되는 회사의 정보가 나온다. 따라서 코드는

url_float = 'http://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd='
k10_component=['005930','000660','005935','207940','068270','005380','035420','012330','051910','055550']
source=urlopen(url_float+k10_component[0]).read()
soup=bs4.BeautifulSoup(source,'html.parser')
soup

위와 같은 방식으로 사이트를 긁어온다.

이도 K10도 전 장에서 말했던 방식과 같이 데이터를 긁어온다. 이 부분에 대한 설명은 생략하도록 하겠다.(회귀 알고리즘을 이용한 주가분석-1 파트에 있습니다.)

# //*[@id="cTB11"]/tbody/tr[7]/td
tmp=soup.find(id='cTB11').find_all('tr')[6].td.text
tmp=tmp.replace('\r','')
tmp=tmp.replace('\n','')
tmp=tmp.replace('\t','')
tmp=re.split('/',tmp)
#out
# ['5,969,782,550주 ', ' 74.62%']

위와 같이 발행 주식 수와 유동비율이 나타난다. 이 데이터를 이쁘게 만들어서 우리는 활용하면 된다.

outstanding=tmp[0].replace(',','').replace('주','').repalce(' ','')
floating=tmp[1].replace(' ','').replace('%','')
outstanding=int(outstanding)
floating=float(floating)

 

위와 같은 코드를 활용해 ,를 없애고 주라는 단어를 없애고 띄어쓰기 되어 있는 것도 없앤다.  유동비율도 마찬가지이다.

우리는 이와 같은 코드를 통해 상장 주식 수와 유동 비율을 구하는 함수를 짤 수 있다.

def stock_info(stock_cd): # 상장주식과 유동비율 주가 이름을 구하는 함수
    url_float='http://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd='+stock_cd
    source = urlopen(url_float).read()
    soup = bs4.BeautifulSoup(source,'html.parser')
    
    # //*[@id="cTB11"]/tbody/tr[7]/td
    tmp = soup.find(id='cTB11').find_all('tr')[6].td.text
    tmp= tmp.replace('\r','')
    tmp= tmp.replace('\t','')
    tmp= tmp.replace('\n','')
    
    tmp=re.split('/',tmp)
    
    outstanding=tmp[0].replace(' ','')
    outstanding=outstanding.replace('주','')
    outstanding=outstanding.replace(',','')
    outstanding=int(outstanding)
    
    floating= tmp[1].replace(' ','')
    floating=floating.replace('%','')
    floating=float(floating)
    
    name=soup.find(id='pArea').find('div').find('div').find('tr').find('td').find('span').text
    
    k10_outstanding[stock_cd]=outstanding
    k10_floating[stock_cd]=floating
    k10_name[stock_cd]=name

 

k10_outstanding=dict()
k10_floating=dict()
k10_name=dict()
for stock_cd in k10_component:
    stock_info(stock_cd)

이와 같이 상장주식 수와 유동 비율을 얻을 수 있다. 이번엔 각 종목에 대한 종가를 받아오겠다.

KOSPI200 과 똑같으므로 설명은 생략하겠다.

def historical_stock_naver(stock_cd,start_date='',end_date='',page_n=1,last_page=0):   #날짜 지정하면 그 날의 종가 지수 출력
    if start_date:
        start_date=date_format(start_date)  #date포맷으로 변환
    else:
        start_date=dt.date.today()  #없으면 오늘로 지정
    if end_date:
        end_date=date_format(end_date)
    else:
        end_date=dt.date.today()
        
    naver_stock='https://finance.naver.com/item/sise_day.nhn?code='+stock_cd+'&page='+str(page_n)
    
    source=urlopen(naver_stock).read()  #지정한 페이지에서 코드 읽기
    source=bs4.BeautifulSoup(source,'html.parser') #뷰티풀 수프로 태그별로 코드 분류    
    
    dates=source.find_all('span',class_='tah p10 gray03')  #날짜 수집
    prices=source.find_all('td',class_='num')  #종가 수집
    
    for n in range(len(dates)):  #dates 개수만큼 반복
        if len(dates)>0: 
            #날짜처리
            this_date=dates[n].text
            this_date=date_format(this_date)
            
            if this_date<= end_date and this_date>=start_date:  #start_date 와 end_date 사이에서 데이터 처리
                #종가처리
                this_close=prices[n*6].text
                this_close=this_close.replace(',','')
                this_close=float(this_close)
                
                #딕셔너리에 저장
                #historical_prices=dict()
                historical_prices[this_date]=this_close
            elif this_date<start_date:
                return historical_prices
    #페이지 네비게이션
    if last_page==0:
        last_page = source.find_all('table')[1].find('td',class_='pgRR').find('a')['href']
        #마지막 페이지 주소추출
        last_page=last_page.split('&')[1]
        last_page=last_page.split('=')[1]
        last_page=float(last_page)
    if page_n<last_page:
        page_n+=1
        historical_stock_naver(stock_cd,start_date,end_date,page_n,last_page)
    
    return historical_prices
k10_component=['005930','000660','005935','207940','068270','005380','035420','012330','051910','055550']
k10_historical_prices=dict()

for stock_cd in k10_component:   
    historical_prices=dict()
    start_date='2018-5-4'
    end_date='2019-10-31'
    historical_stock_naver(stock_cd,start_date,end_date)
    
    k10_historical_prices[stock_cd]=historical_prices
k10_historical_prices=pd.DataFrame(k10_historical_prices)
k10_historical_prices

우리는 K10 지수에 대한 정보를 거의 다 알았다! 이제 이를 활용하기 위해 처리해주는 일만 남았다.

일단 2019.10.31 에 상위 10개 기업의 시가총액, 유동비율, 종가를 데이터 프레임 형식으로 만들어보겠다.

tmp = {'Outstanding':k10_outstanding,'Floating': k10_floating,'Price':k10_historical_prices.iloc[0],'Name':k10_name}
k10_info=pd.DataFrame(tmp)
k10_info

k10_info

삼성전자가 2개 있는데 005935는 삼성전자우 이다! (자동으로 받아오다가 실수가 생긴 것 같다..)

우리는 지수로 환산하기 위해 하나의 공식을 알아야한다.

종가들을 다음과 같은 공식을 통해 지수화 시키는 이유는 비교 대상들의 주가를 같은 기준으로 통일하여 비교해야하기 때문이다. 보통 하는 정규화라고 생각하면 된다.

따라서 이러한 식을 코드로 구현하면

# 시가총액 = 주가 * 상장주식 수
k10_info['Market Cup'] = k10_info['Outstanding'] * k10_info['Price'] * 0.01
# 유동비율을 반영한 시가총액 = 주가 * 상장주식 수 * 유동비율
k10_info['f Market Cup']= k10_info['Outstanding'] * k10_info['Floating'] *k10_info['Price'] * 0.01

k10_historical_mc = k10_historical_prices * k10_info['Outstanding'] * k10_info['Floating'] * 0.01
k10_historical_mc.head() #일자별 유동 비율을 반영한 시가 총액

k10=pd.DataFrame()
k10['K10 Market Cap']=k10_historical_mc.sum(axis=1) # 일자별 시가총액의 합
k10['K10'] = k10['K10 Market Cap']/k10['K10 Market Cap'][0] * 100 # k10지수 산출

k10

K10 Market Cap = K10 종가의 합을 나타내고 K10 컬럼은 K10 종가의 지수를 구한 것이다. 

 

결국 KOSPI200의 종가와 K10의 지수를 구하였다.  이제 분석을 하기 위해선 KOSPI200도 지수화 시켜야 된다.

이는 R로 구현할 것이며 다음 장에는 R을 통한 회귀분석을 실행하겠다.

 

출처: 파이썬을 활용한 금융공학 레시피: 문과생의 코딩 울렁증과 이과생의 금융 울렁증을 한 방에 씻어줄 금융공학 사이다

그 전에도 밝혔습니다..!

 

K10과 KOSPI200 pdf.pdf
0.67MB

pdf로 정리한 것입니다. pdf가 이해하기 쉬울 수도 있습니다!

반응형

'심심풀이 project' 카테고리의 다른 글

회귀 알고리즘을 이용한 주가분석-1  (0) 2020.05.17
복권 분석  (2) 2020.04.10

댓글