주식 데이터 그리기

웹 드라이버로 chrome 설치
server에 적절한 크롬 설치할 것. 설치후 웹 드라이버를 os. path로 옮겨 넣음.
https://shanyitan.medium.com/how-to-install-selenium-and-run-it-successfully-via-jupyter-lab-c3f50d22a0d4

In [1]:
import sys
import os
os.path.dirname(sys.executable)
Out[1]:
'/usr/local/bin'

크롬을 그냥 실행하면 안됨. 아래 옵션으로 실행.

In [2]:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("--single-process")
#chrome_options.add_argument("--disable-dev-shm-usage")
# driver 를 설정합니다. driver = webdriver.Chrome()
driver=webdriver.Chrome(options=chrome_options)
In [3]:
import pandas as pd 
import requests
from bs4 import BeautifulSoup

stock_code = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download', header=0)[0] 
#stock_code.head()

# 데이터에서 정렬이 따로 필요하지는 않지만 테스트겸 Pandas sort_values를 이용하여 정렬을 시도해봅니다.
stock_code.sort_values(['상장일'], ascending=True)

# 필요한 것은 "회사명"과 "종목코드" 이므로 필요없는 column들은 제외
stock_code = stock_code[['회사명', '종목코드']] 

# 한글 컬럼명을 영어로 변경 
stock_code = stock_code.rename(columns={'회사명': 'company', '종목코드': 'code'}) 
#stock_code.head()

# 종목코드가 6자리이기 때문에 6자리를 맞춰주기 위해 설정해줌 
stock_code.code = stock_code.code.map('{:06d}'.format) 

# LG화학의 일별 시세 url 가져오기 
company='한국항공우주'
code = stock_code[stock_code.company==company].code.values[0].strip() ## strip() : 공백제거

row_data=[]

for page in range (1,237):
#for page in range (1,2):
    url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code)     
    url = '{url}&page={page}'.format(url=url, page=page)

    #df = pd.read_html(url, header=0)[0]
    driver.get(url);
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    #requests.get(url).text
    #df = pd.read_html(requests.get(url).text)
    #df = requests.get(url).text
    #df

    table = soup.find_all('table')[0].tbody
    for row in table.find_all("tr"):
        cols = row.find_all("td")
        cols = [ele.text.strip() for ele in cols]
        #row_data.append(ele for ele in cols if ele)
        #row_data.append(cols)
        if(len(cols) == 7):
            #숫자에 포함된 컴마 삭제.
            cols[1]=int(cols[1].replace(',', ''))
            cols[2]=int(cols[2].replace(',', ''))
            cols[3]=int(cols[3].replace(',', ''))
            cols[4]=int(cols[4].replace(',', ''))
            cols[5]=int(cols[5].replace(',', ''))
            cols[6]=int(cols[6].replace(',', ''))
            row_data.append(cols)
In [4]:
df = pd.DataFrame (row_data, columns = ['날자','종가','전일비','시가','고가','저가','거래량'])
In [5]:
import matplotlib.pyplot as plt
# 필요한 모듈 import 하기 
import plotly
import plotly.graph_objects as go
import plotly.express as px

# %matplotlib inline 은 jupyter notebook 사용자용 - jupyter notebook 내에 그래프가 그려지게 한다.
%matplotlib inline 
In [6]:
df['날자'] = pd.to_datetime(df['날자'])
df[['종가','종가','전일비','시가','고가','저가','거래량' ]] = df[['종가','종가','전일비','시가','고가','저가','거래량' ]].astype(int)

구매 시점 데이터

In [7]:
row_data=[]
row_data.append(['2021-1-25',20,32400])
row_data.append(['2021-1-8',1,28200])
row_data.append(['2020-12-4',1,24150])
row_data.append(['2020-11-2',1,21900])
row_data.append(['2020-9-29',4,22900])
row_data.append(['2020-8-25',1,23050])
row_data.append(['2020-7-28',4,25350])
row_data.append(['2020-6-30',4,23950])
row_data.append(['2020-5-29',10,25150])
row_data.append(['2020-3-12',1,22700])
row_data.append(['2019-10-8',2,38800])
row_data.append(['2019-8-29',3,39250])
row_data.append(['2019-4-29',3,34300])
row_data.append(['2019-3-27',3,35750])
row_data.append(['2018-12-27',3,31400])
row_data.append(['2018-11-27',4,32100])
row_data.append(['2018-10-30',3,28800])
row_data.append(['2018-9-27',1,50600])
row_data.append(['2018-9-27',1,49950])
row_data.append(['2018-9-7',1,43100])
row_data.append(['2018-9-3',2,41750])
row_data.append(['2018-7-30',3,34750])
row_data.append(['2018-7-17',1,38150])
row_data.append(['2018-6-28',2,42600])
row_data.append(['2018-5-28',2,43200])
row_data.append(['2018-5-10',1,43700])
row_data.append(['2018-4-10',2,47700])
row_data.append(['2017-9-6',1,43900])
row_data.append(['2017-4-25',1,62200])
row_data.append(['2017-4-21',1,62600])
row_data.append(['2016-12-16',5,69100])
row_data.append(['2016-9-6',2,85400])
row_data.append(['2016-7-5',2,71500])

row_data.append(['2020-9-22',1,23450])
row_data.append(['2020-4-28',4,24800])
row_data.append(['2019-4-17',7,36500])
In [8]:
df_buy = pd.DataFrame(row_data,columns=['날자','수량','가격'])
df_buy['날자'] = pd.to_datetime(df_buy['날자'])
df_buy[['수량','가격']] = df_buy[['수량','가격']].astype(int)
In [9]:
fig = px.line(df, x='날자', y='종가', title='{}의 종가'.format(company))

fig.update_xaxes(
    rangeslider_visible=True,
    rangeselector=dict(
        buttons=list([
            dict(count=5, label="5년", step="year", stepmode="backward"),
            dict(count=6, label="6개월", step="month", stepmode="backward"),
            dict(step="all")
        ])
    )
)
fig.add_scatter(x=df_buy['날자'], y=df_buy['가격'],mode='markers',marker_size=df_buy['수량'], name="매수시점")
fig.show()
In [10]:
#총액을 계산
df_buy.insert(3,"총액",df_buy['수량']*df_buy['가격'],True)
In [11]:
cost= df_buy['총액'].sum()
count = df_buy['수량'].sum()
sell_price = df['종가'][0]
#up 현재 가격
up = sell_price * count
#down: 총 구매액
down = cost
ratio = up /down
print("수익률=%.2f"%ratio)
수익률=1.06