멋사 AI 7기 3주차

psy4072·2022년 9월 29일
0
post-thumbnail

FinanceDataReader

한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리
(https://github.com/financedata-org/FinanceDataReader)
(https://financedata.github.io/posts/finance-data-reader-users-guide.html)
(https://pandas-datareader.readthedocs.io/en/latest/readers/index.html)

!pip install -U finance-datareader

import pandas as pd
import numpy as np

import FinanceDataReader as fdr

fdr.__version__
 # KRX : KRX 종목 전체
 
 # 한국거래소 상장종목 전체 가져오기 
 df = fdr.StockListing("KRX")
 
 # 행과 열의 크기
 df.shape
 
 # 앞에서부터 데이터 추출
 df.head()
 
 # 뒤에서부터 데이터 추출
 df.tail()
 
 # 기술 통계값 구하기
 df.describe()
 
 # 날짜 순으로 데이터 내림차순 정렬
 df.sort_values(by="ListingDate", ascending=False).head()
 
Symbol	Market	Name	Sector	Industry	ListingDate	SettleMonth	Representative	HomePage	Region
5831	413300	KONEX	티엘엔지니어링	건축기술, 엔지니어링 및 관련 기술 서비스업	클린룸 설계 및 시공	2022-09-27	12월	서충옥	http://tleng.kr	경기도
5167	394280	KOSDAQ	오픈엣지테크놀로지	소프트웨어 개발 및 공급업	시스템 반도체 IP	2022-09-26	12월	이성현	http://www.openedges.com	서울특별시
5626	436530	KOSDAQ	케이비제22호스팩	금융 지원 서비스업	기업인수목적	2022-09-22	12월	오동출	NaN	서울특별시
5981	427950	KOSDAQ	하나금융23호스팩	금융 지원 서비스업	기업인수합병	2022-09-15	12월	박기일	NaN	서울특별시
5758	433530	KOSDAQ	키움제7호스팩	금융 지원 서비스업	기업 인수합병	2022-09-07	12월	박정근	NaN	서울특별시

DataFrame -> csv 파일로 변경

df.to_csv("krx.csv", index=False)

csv 파일을 DataFrame 으로 읽어서 확인

pd.read_csv("krx.csv")

Naver Finance

뉴스기사 수집

https://finance.naver.com/

pandas 데이터 수집

import pandas as pd
import numpy as np

item_code = "051910'
item_name = "LG화학"

page_no = 4

url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="

print(url)

read_html 데이터 수집

네이버 금융주가 기사를 read_html 수집하여서 table 변수에 할당

table = pd.read_html(url)
len(table)

df = table[0]
cols = df.columns
cols 

=> Index(['제목', '정보제공', '날짜'], dtype='object')

for 반복문을 이용하여 데이터 모두 가져오기

temp_list = []
for news in table[:-1]:
	news.columns = cols
    temp_list.append(news)
    display(news)

수집한 데이터를 하나의 데이터프레임으로 합체

df_news = pd.concat(temp_list)

결측치 제거 (데이터 다듬기)

df_news = df_news.dropna()

# 인덱스 번호 순서대로 설정
df_news = df.news_reset_index(drop=True)

# 기사에서 "연관기사" 포함된 데이터 제거 (~ : 반대를 의미)
df_news = df.news[~df_news["정보제공"].str.contains("연관기사")].copy()

중복된 데이터 제거

df_news.drop_duplicates()

전체 과정 함수로 생성

# url return 함수
def get_url(item_code, page_no):
	url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="
    return url
    
# 뉴스의 한 페이지 수집 함수
def get_one_page_news(item_code, page_no):
	url = get_url(item_code, page_no)
    table = pd.read_html(url)
    
    temp_list = []
    df = table[0].columns
    
    for news in table[:-1]:
    	news.columns = df
        temp_list.append(news)
        
    df_news = pd.concat(temp_list)
    df_news = df_news.dropna()
    df_news = df_news.reset_index(drop=True)
    df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()
    df_news = df_news.drop_duplicates()
    
    return df_news
!pip install -U finance-datareader
import FinanceDataReader as fdr

df_krx = fdr.StockListing("KRX")
df_krx.shape

item_code = df_krx.loc[df_krx["Name"]=="기아", "Symbol"].values[0]
page_no = 10
temp = get_one_page_news(item_code, page_no)
temp.head(2)

	제목									정보제공				날짜
0	기아 노사,2년 연속 무분규 임금협상 잠정합의	헤럴드경제			2022.08.31 07:20
1	기아,2년 연속 무분규 임협 잠정합의			매일경제			2022.08.30 20:58

for 반복문을 활용하여 10 page 수집

import time
from tqdm import trange

item_name = "기아"
item_code = df.krx.loc[df_krx["Name"] == "기아", "Symbol".values[0]

news_list = []
for page_no in trange(1, 11):
	temp = get_one_page_news(item_code, page_no)
    news_list.append(temp)
    time.sleep(0.01)

DataFrame 만들고 csv 파일 생성

df_news = pd.concat(news_list)

file_name = f"news_{item_code}_{item_name}.csv"

df_news.to_csv(file_name, index=False)
pd.read_csv(file_name)

일별 시세 수집

https://finance.naver.com/sise/

import pandas as pd
import numpy as np
import requests 

item_code = "005930"
item_name = "삼성전자"
page_no = 1

url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"

requests 통한 HTTP 요청

https://requests.readthedocs.io/en/latest/
https://requests.readthedocs.io/en/latest/user/quickstart/#custom-headers

response = requests.get(url, headers = {"user-agent" : "Mozilla/5.0"}
response 
=> <Response [200]>

response.text

BeautifulSoup 통한 table 태그 찾기

from bs4 import BeautifulSoup as bs

html = bs(response.text)
html.title
=> <title>네이버 금융</title>

# a-> link 의미
html.a 

html.find_all("a")[:3]
=> [<a href="/item/sise_day.naver?code=005930&amp;page=1">1</a>,
 <a href="/item/sise_day.naver?code=005930&amp;page=2">2</a>,
 <a href="/item/sise_day.naver?code=005930&amp;page=3">3</a>]
 
 html.select("table > tr > td")
 html.select("body > table.type2")

pandas 코드 한 줄로 데이터 수집

table = pd.read_html(response.text)

temp = table[0]

# row 결측치 제거
temp.dropna()

page 데이터 수집 함수

def get_one_day_list(item_code, page_no):
	url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
    response = requests.get(url, header = {"user-agent": "Mozilla/5.0"})
    response.text
    table = pd.read_html(response.text)
    site = table[0].dropna()

    return site

while 반복문 활용하여 전체 일자 데이터 수집

df_item = get_day_list(item_code, page_no)
last_day = df_item.iloc[-1]["날짜"]

import time

item_code = "373220"
item_name = "LG에너지솔루션"

page_no = 1
item_list = []
previous_day = None

while True: 
	df_item = get_day_list(item_code, page_no) 		# 한 페이지의 일별시세 수집
    last_day = df_item.iloc[-1]["날짜"]				# 해당 데이터의 마지막 날짜 가져옴
    print(page_no, previous_day, last_day)
    
    if last_day == previous_day:					
    	break
    previous_day = last_day
    item_list.append(df_item)						# 수집한 일별 시세를 리스트에 추가
    page_no += 1

수집한 데이터 합치기

df_day = pd.concat(item_list)
df_day[3]

=>	날짜	    		종가	   	전일비		시가			고가		저가			거래량
1	2022.09.28	436000.0	8000.0	444000.0	451500.0	427000.0	403887.0
2	2022.09.27	444000.0	2500.0	447500.0	451000.0	435000.0	365111.0
3	2022.09.26	446500.0	14000.0	453000.0	458000.0	440000.0	446277.0

최근 날짜 구해서 파일명 만들기

date = df_day.iloc[0]["날짜"]

file_name = f"{item_name}_{item_code}_{date}.csv"

파일로 저장

# index=False : 기본 index 저장 X
df_day.to_csv("file_name", index=False)

pd.read_csv("file_name")

전체 과정을 하나의 함수로 만들기

def get_item_list(item_code, item_name):
#     """
#     일별 시세를 수집하는 함수
#     """
    page_no = 1

# 데이터를 저장할 빈 변수 선언
    item_list = []
    pre_day = None

    while True:
        df_item = get_day_list(item_code, page_no)
    # 해당 데이터의 마지막 날짜를 가져옴
        last_day = df_item.iloc[-1]["날짜"]
   
        if last_day == pre_day:
            break
        pre_day = last_day
        item_list.append(df_item)
        page_no = page_no + 1
        time.sleep(0.01)
    
    df_day = pd.concat(item_list)

    # 종목코드, 종목명 추가 
    df_day["종목코드"] = item_code
    df_day["종목명"] = item_name
    cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']

    df_day = df_day[cols]
    df_day = df_day.drop_duplicates()

    date = df_day.iloc[0]["날짜"]
    file_name = f"{item_name}_{item_code}_{date}.csv"
    
    # 파일로 저장
    df_day.to_csv("file_name", index=False)
    file_name = pd.read_csv('file_name')

    return file_name

ETF

상장지수펀드는 기초지수의 성과를 추적하는 것이다.
거래소에 상장되어 있어서 개별주식과 마찬가지로 기존의 주식계좌를 통해 거래가 가능하다.
https://finance.naver.com/sise/etf.nhn

import pandas as pd
import numpy as np
import requests

url = "https://finance.naver.com/sise/etf.nhn"

pd.read_html(url)

url = "https://finance.naver.com/api/sise/etfItemList.nhn?etfType=0&targetColumn=market_sum&sortOrder=desc"
response = requests.get(url)

JSON 타입으로 데이터 받기

etf_json = response.json()

etfItemList = etf_json["result"]["etfItemList"]
print(len(etfItemList))
etfItemList[-1]

=> 622
{'itemcode': '287310',
 'etfTabCode': 2,
 'itemname': 'KBSTAR 200경기소비재',
 'nowVal': 9040,
 'risefall': '5',
 'changeVal': -235,
 'changeRate': -2.53,
 'nav': 9041.0,
 'threeMonthEarnRate': -2.2656,
 'quant': 9,
 'amonut': 0,
 'marketSum': 7}

JSON 데이터를 pandas의 DataFrame 형태로 변환

df = pd.DateFrame(etfItemList)
df.head(1)

=>	itemcode	etfTabCode	itemname	nowVal	risefall	changeVal	changeRate	nav	threeMonthEarnRate	quant	amonut	marketSum
 0	069500		1			KODEX 200	28390		5			-715		-2.46	28412.0		-7.9422		11126915	316767	47383

# 파생 변수 생성
df["브랜드"] = df["itemname"].str.split(expand=True)[0]
df["브랜드"].head(2)

=> 	0    KODEX
 	1    TIGER
	Name: 브랜드, dtype: object

파일 저장

from datetime import datetime
today = datetime.today().strftime("%y-%m-%d")

file_name = f"etf-{today}_raw.csv"
file_name
=> 'etf-22-09-28_raw.csv'

df.to_csv(file_name, index=False)
file_name = pd.read_csv(file_name, dtype={'itemcode' : 'object'})
profile
Ⓓ🅰️🅣🄰 ♡♥︎

0개의 댓글