네이버 주가정보 수집

P4·2023년 5월 21일
0
post-thumbnail

라이브러리 임포트

import pandas as pd
import requests

1. 웹서비스 분석 : url

  • pc 웹페이지가 복잡하면 mobile 웹페이지에서 수집
page, page_size = 1, 20
url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}'
print(url)

2. 서버에 데이터 요청 : request(url) > response : json(str)

  • response의 status code가 200이 나오는지 확인
  • 403이나 500이 나오면 request가 잘못되거나 web server에서 수집이 안되도록 설정이 된것임
    • header 설정 또는 selenium 사용
  • 200이 나오더라도 response 안에 있는 내용을 확인 > 확인하는 방법 : response.text
response = requests.get(url)
response # response가 200이 나오는지 확인
response.text[:200] # response의 내용 확인

3. 서버에서 받은 데이터 파싱(데이터 형태를 변경) : json(str) > list, dict > DataFrame

columns = ["localTradedAt", "closePrice"]
datas = response.json()
kospi_df = pd.DataFrame(datas)[columns]
kospi_df.tail(2)

4. 함수로 만들기

  • 방금까지 짠 크롤링 코드를 함수로 만들어준다.
def stock_price(code="KOSPI", page=1, page_size=20):
    """ This function is crwaling stock price from naver stock web page
    parameters :
        code : str : KOSPI or KOSDAQ
        page : int : page number
        page_size : int : one page size
    return :
        type : DataFame of pandas"""
    url = f'https://m.stock.naver.com/api/index/{code}/price?pageSize={page_size}&page={page}'
    response = requests.get(url)
    columns = ["localTradedAt", "closePrice"]
    datas = response.json()
    return pd.DataFrame(datas)[columns]

  • Docstring이 잘뜨는지 확인해본다.
help(stock_price)

  • 사용예시
kospi_df = stock_price()
kospi_df.tail(2)
kosdaq_df = stock_price("KOSDAQ")
kosdaq_df.tail(2)

5. 원달러 환율 데이터 수집 : 실습

  • 위에서 했던것과 마찬가지로 함수를 만들어준다.
def exchage_rate(code="FX_USDKRW", page=1, page_size=60):
    url = f'https://api.stock.naver.com/marketindex/exchange/{code}/prices?page={page}\
&pageSize={page_size}'
    response = requests.get(url)
    columns = ["localTradedAt", "closePrice"]
    datas = response.json()
    return pd.DataFrame(datas)[columns]

  • 사용예시
usd_df = exchage_rate()
usd_df.tail(2)
eur_df = exchage_rate("FX_EURKRW")
eur_df.tail(2)

6. 시각화

  • 라이브러리 세팅인 것 같음
%matplotlib inline
%config InlineBackend.figure_formats = {'png', 'retina'}
  • 라이브러리 임포트
import matplotlib.pyplot as plt
import seaborn as sns

  • 데이터 수집
page_size = 60
kospi_df = stock_price("KOSPI", page_size=page_size)
kosdaq_df = stock_price("KOSDAQ", page_size=page_size)
usd_df = exchage_rate("FX_USDKRW", page_size=page_size)
eur_df = exchage_rate("FX_EURKRW", page_size=page_size)

  • 데이터 전처리 1 : 데이터 타입 변경
print(kospi_df.dtypes)
kospi_df["kospi"] = kospi_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
kospi_df = kospi_df.drop(columns=["closePrice"])
print(kospi_df.dtypes)
kosdaq_df["kosdaq"] = kosdaq_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
usd_df["usd"] = usd_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
eur_df["eur"] = eur_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
kosdaq_df = kosdaq_df.drop(columns=["closePrice"])
usd_df = usd_df.drop(columns=["closePrice"])
eur_df = eur_df.drop(columns=["closePrice"])

  • 데이터 전처리 2 : 날짜 데이터 맞추기 : merge
merge_df_1 = pd.merge(kospi_df, kosdaq_df, on="localTradedAt")
merge_df_2 = pd.merge(merge_df_1, usd_df, on="localTradedAt")
merge_df_3 = pd.merge(merge_df_2, eur_df, on="localTradedAt")
merge_df = merge_df_3.copy()
merge_df.tail(2)
# 시각화
plt.figure(figsize=(20, 5))

# plt.plot(merge_df["localTradedAt"], merge_df["kospi"], label="kospi")
# plt.plot(merge_df["localTradedAt"], merge_df["kosdaq"], label="kosdaq")
# plt.plot(merge_df["localTradedAt"], merge_df["usd"], label="usd")
# plt.plot(merge_df["localTradedAt"], merge_df["eud"], label="eur")

columns = merge_df.columns[1:]
for column in columns:
    plt.plot(merge_df["localTradedAt"], merge_df[column], label=column)
    
xticks_count = 11
plt.xticks(merge_df["localTradedAt"][::int(len(merge_df) // xticks_count) + 1])
plt.legend(loc=0)
plt.show()

7. 데이터 스케일링

  • min max scaling
  • z=ximin(x)max(x)min(x)(0z1)z = \frac{x_i - min(x)}{max(x) - min(x)} (0 \leqq z \leqq 1)
from sklearn.preprocessing import minmax_scale
# 시각화
plt.figure(figsize=(20, 5))

columns = merge_df.columns[1:]
for column in columns:
    plt.plot(merge_df["localTradedAt"], minmax_scale(merge_df[column]), label=column)
    
xticks_count = 11
plt.xticks(merge_df["localTradedAt"][::int(len(merge_df) // xticks_count) + 1])
plt.legend(loc=0)
plt.show()

8. 상관관계 분석

  • 피어슨 상관계수(Pearson Correlation Coefficient)
  • 두 데이터 집합의 상관도를 분석할때 사용되는 지표
  • 상관계수의 해석
    • -1에 가까울수록 서로 반대방향으로 움직임
    • 1에 가까울수록 서로 같은방향으로 움직임
    • 0에 가까울수록 두 데이터는 관계가 없음
# 해석 1 : kospi, kosdaq은 아주 강한 양의 상관관계를 갖는다. (데이터가 같은 방향으로 움직임)
# 해석 2 : kospi와 usd를 강한 음의 상관관계를 갖는다. (데이터가 반대 방향으로 움직임)
corr_df = merge_df[merge_df.columns[1:]].corr()
corr_df
# 결정계수 : r-squared 
# 1과 가까울수록 강한 관계, 0과 가까울수록 약한 관계
plt.figure(figsize=(20, 5))
sns.heatmap(corr_df**2, cmap="YlGnBu", annot=True)
plt.show()
profile
지식을 담습니다.

0개의 댓글