본문 바로가기
프로그램 (PHP,Python)

증권시장 종목에 대한 최신 주식정보 수집하여 시각화

by 날으는물고기 2023. 9. 18.

증권시장 종목에 대한 최신 주식정보 수집하여 시각화

먼저 코드를 실행하기 전에 필요한 라이브러리를 설치해야 합니다. pandas, plotly.express, requests, bs4 (Beautiful Soup) 라이브러리가 필요합니다.

 

만약 이러한 라이브러리가 설치되어 있지 않다면, 다음 명령어를 사용하여 설치할 수 있습니다.

pip install pandas plotly requests beautifulsoup4

이제 다음과 같이 코드를 작성하고 실행할 수 있습니다.

import pandas as pd
import plotly.express as px
import requests
from bs4 import BeautifulSoup

# 종목명과 코드를 저장할 데이터프레임 생성
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
code_df = code_df[['회사명', '종목코드']]
code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'})
code_df['code'] = code_df['code'].astype(str).str.zfill(6)

# 종목명으로부터 종목 코드를 얻는 함수 정의
def get_stock_code(name, code_df):
    code = code_df.query("name == '{}'".format(name))['code'].to_string(index=False)
    return code.strip()

# 종목명 지정 (삼성전자)
company_name = '삼성전자'

# 종목 코드 가져오기
stock_code = get_stock_code(company_name, code_df)

# 네이버 금융에서 종목 데이터 수집
def get_stock_data(stock_code):
    url = 'https://finance.naver.com/item/sise_day.nhn?code={}'.format(stock_code)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    table = soup.find('table')
    df = pd.read_html(str(table), header=0)[0]
    return df

# 종목 데이터 수집
stock_data = get_stock_data(stock_code)

# 데이터 전처리
stock_data = stock_data.dropna()
stock_data['날짜'] = pd.to_datetime(stock_data['날짜'])
stock_data[['종가', '전일비', '시가', '고가', '저가', '거래량']] = stock_data[['종가', '전일비', '시가', '고가', '저가', '거래량']].astype(int)

# 그래프 그리기
fig = px.line(stock_data, x='날짜', y='종가', title='{}의 종가(Time Series)'.format(company_name))
fig.show()

위 코드는 삼성전자의 주식 종가 데이터를 수집하고 Plotly를 사용하여 시계열 그래프를 생성하는 예제입니다.

 

코드를 실행하기 전에 Python 환경에 필요한 라이브러리를 설치하고, 코드 내에서 company_name 변수에 삼성전자 또는 원하는 다른 기업명을 입력하여 해당 기업의 주식 종가를 시각화할 수 있습니다.

이 코드의 각 단계는 다음과 같습니다.

  1. 필요한 라이브러리를 가져옵니다.
  2. 한국 거래소의 기업 코드 데이터를 가져와서 종목명과 종목 코드를 추출합니다.
  3. 특정 기업명(여기서는 '삼성전자')을 선택하고 해당 기업의 종목 코드를 얻습니다.
  4. 네이버 금융에서 선택한 기업의 주식 데이터를 크롤링합니다.
  5. 주식 데이터를 데이터프레임으로 변환하고 데이터를 전처리합니다.
  6. Plotly를 사용하여 주식 종가의 시계열 그래프를 생성하고 표시합니다.

Pandas를 사용하여 Naver 금융에서 주식 데이터를 가져오는 과정은 아래와 같습니다.

  1. 필요한 라이브러리 설치
    먼저 필요한 라이브러리를 설치해야 합니다. pandas, plotly, requests, bs4 (Beautiful Soup) 라이브러리가 필요합니다. 필요한 라이브러리를 설치하는 방법은 이전에 설명한대로입니다.
pip install pandas plotly requests beautifulsoup4
  1. 한국거래소(KRX)에서 종목 코드 가져오기
    한국거래소에서 종목 코드를 가져오는 부분은 이미 설명한 코드와 동일합니다. 이 코드를 사용하여 주식 종목의 종목 코드를 얻어옵니다.
import pandas as pd

# 한국거래소에서 종목 코드를 가져오기
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]

# 종목 코드를 6자리로 맞추기
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format)

# 필요한 컬럼만 선택
code_df = code_df[['회사명', '종목코드']]

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

# 상위 5개 데이터 확인
print(code_df.head())
  1. Naver 금융에서 주식 데이터 가져오기
    이제 Naver 금융에서 주식 데이터를 가져오는 부분을 설명하겠습니다. 여기서는 '삼성전자'를 예로 들겠습니다.
import requests
from bs4 import BeautifulSoup

# 종목 이름을 입력하면 종목에 해당하는 코드를 가져와 네이버 금융에 넣어줍니다.
def get_url(item_name, code_df):
    code = code_df.query("name=='{}'".format(item_name))['code'].to_string(index=False)
    url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code)

    print("요청 URL = {}".format(url))
    return url

# 종목명 지정 (예: 삼성전자)
company_name = '삼성전자'

# 종목 코드 가져오기
stock_code = get_url(company_name, code_df)

# 일자 데이터를 담을 데이터프레임 정의
df = pd.DataFrame()

# 1페이지에서 20페이지까지의 데이터를 가져옵니다.
for page in range(1, 21):
    pg_url = '{url}&page={page}'.format(url=stock_code, page=page)
    df = df.append(pd.read_html(pg_url, header=0)[0], ignore_index=True)

# 결측값(NaN) 있는 행 제거
df = df.dropna()

# 상위 5개 데이터 확인
print(df.head())
  1. 데이터 전처리
    주식 데이터를 가져오면 데이터를 전처리해야 합니다. 데이터프레임의 컬럼명을 영어로 변경하고, 데이터의 타입을 int로 변환하며, 일자(date)를 날짜 형식으로 변환합니다.
# 한글로 된 컬럼명을 영어로 바꿔줍니다.
df = df.rename(columns={'날짜': 'date', '종가': 'close', '전일비': 'diff',
                         '시가': 'open', '고가': 'high', '저가': 'low', '거래량': 'volume'})

# 데이터의 타입을 int로 변환합니다.
df[['close', 'diff', 'open', 'high', 'low', 'volume']] = df[['close', 'diff', 'open', 'high', 'low', 'volume']].astype(int)

# 컬럼명 'date'의 타입을 날짜로 변환합니다.
df['date'] = pd.to_datetime(df['date'])

# 일자(date)를 기준으로 오름차순 정렬합니다.
df = df.sort_values(by=['date'], ascending=True)

# 상위 5개 데이터 확인
print(df.head())
  1. Plotly를 사용하여 Time Series 그래프 그리기
    이제 전처리한 데이터를 사용하여 Plotly를 이용해 Time Series 그래프를 그립니다.
import plotly.offline as offline
import plotly.graph_objs as go

# Jupyter Notebook에서 출력
offline.init_notebook_mode(connected=True)

trace = go.Scatter(
    x=df.date,
    y=df.close,
    name=company_name
)

data = [trace]

layout = dict(
    title='{}의 종가(Time Series)'.format(company_name),
    xaxis=dict(
        rangeselector=dict(
            buttons=list([
                dict(count=1,
                     label='1m',
                     step='month',
                     stepmode='backward'),
                dict(count=3,
                     label='3m',
                     step='month',
                     stepmode='backward'),
                dict(count=6,
                     label='6m',
                     step='month',
                     stepmode='backward'),
                dict(step='all')
            ])
        ),
        rangeslider=dict(),
        type='date'
    )
)

fig = go.Figure(data=data, layout=layout)
offline.iplot(fig)

이제 위의 코드를 사용하여 Pandas를 이용해 Naver 금융에서 주식 데이터를 가져와서 시계열(Time Series) 그래프를 그릴 수 있습니다. 주식 데이터를 쉽게 분석하고 시각화할 수 있는 강력한 도구입니다.

728x90

댓글