주식 데이터

오상윤·2023년 2월 24일
0

EDA

목록 보기
12/16

주식 데이터

한글 폰트 지원하게 하기

# 컴퓨터에 설치된 폰트 목록(한글 지원하는) 출력하기
from matplotlib import font_manager
for font in font_manager.fontManager.ttflist:
    if 'Myung' in font.name or 'Gothic' in font.name:
        print(font.fname, font.name)

주가 데이터 수집

  • 주가 데이터 수집 -> 모듈화
import requests
from bs4 import BeautifulSoup
import csv
import json
class StockCrawler:
    def __init__(self, code):
        self.url_format = "http://finance.daum.net/api/quote/%s/days?symbolCode=%s&page=%d&perPage=100&pagination=true"
        self.code = code
​
    def get_prices(self,page=50):
        csvfile = open(self.code + ".csv", "w", encoding='utf-8', newline='')
        filename = csvfile.name
        stock_writer = csv.writer(csvfile)
        stock_writer.writerow(["날짜", "시가", "고가", "저가", "종가"])
​
        custom_headers = {
            "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36",
            "referer":f"http://finance.daum.net/quotes/{self.code}",
        }
        for page in range(1, page + 1):
            url = self.url_format % (self.code, self.code, page)
            data = requests.get(url, headers=custom_headers)
            if data.status_code != requests.codes.ok:
                print("접속실패")
​
            stock_data = json.loads(data.text)for daily in stock_data['data']:
                stock_writer.writerow([daily['date'][:10], daily['openingPrice'], daily['highPrice'],
                     daily['lowPrice'],daily['tradePrice']])
​
        csvfile.close()
        return filename
​
# 현재 이 소스코드를 단독 실행했을 때 실행될 코드들
if __name__ == "__main__":
    stock_code = input("수집을 원하는 주식의 코드를 입력하세요 : ")
    crawler = StockCrawler(stock_code)
    filename = crawler.get_prices(5)

준비 작업

# 필요한 모듈 로드
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
# 불필요한 경고창 끄기
# warning message : deprecated
import warnings
# errors='' raise #에러가 나면 올라가라, ignore # 에러가 나면 무시해라, coerce
warnings.filterwarnings('ignore')
df = pd.read_csv('A035720.csv')

데이터 전처리

1. 날짜 열을 문자열 -> 시간(datetime) 형으로 변환

  • 22/04/2022나 12 Jan 2022 같이 섞여 있는 경우 format='%Y-%m-%d'로 입력
df['날짜'] = pd.to_datetime(df['날짜'])

2. 시간순으로 정렬

  • 날짜 열을 index로 설정, index 기준 오르차순으로 데이터 정렬
  • 데이터의 변형(변경)이 있을 떄, 원본을 변경하는 방법 -> 재할당, inplace=True
df.set_index('날짜', inplace=True)
df.sort_index(inplace=True)

데이터 전처리(이평값)

  • 이평값(이동평균) = 장기이평(30, 50, 60, 120), 단기이평(5, 10, 15, 20)

1.컬럼(종가)

df['종가']

2. 이평값 구하기

  • 5개씩 묶어서 그룹화후 평균
df['종가'].rolling(window=5).mean()

3. 이평값을 새로운 컬럼

df['5일이평'] = df['종가'].rolling(window=5).mean()
# 10일 이평
df['10일이평'] = df['종가'].rolling(window=10).mean()
# 20일 이평
df['20일이평'] = df['종가'].rolling(window=20).mean()
# 20일 이평
df['30일이평'] = df['종가'].rolling(window=30).mean()
# 20일 이평
df['60일이평'] = df['종가'].rolling(window=60).mean()
# 120일 이평
df['120일이평'] = df['종가'].rolling(window=120).mean()

데이터 분석

  • 골든 크로스 (겹치는 부분)

    • 어제 : 장기 > 단기
    • 오늘 : 장기 < 단기
  • 데드 크로스

  • 어제 : 장기 < 단기

  • 오늘 : 장기 > 단기

한칸 아래로 이동

# 어제 5일 이평 컬럼 만들기
df['어제5일이평'] = df['5일이평'].shift(1)
# 어제 20일 이평 컬럼 만들기
df['어제20일이평'] = df['20일이평'].shift(1)
# 당일 값 비교 : 2023-01-31
df['5일이평'] > df['20일이평']# 전일 값 비교 : 2023-01-30
df['어제5일이평'] < df['어제20일이평']

컬럼 추가

# is_golden 컬럼
df['is_golden'] = ((df['어제5일이평'] < df['어제20일이평']) & (df['5일이평'] > df['20일이평']
))
# is_dead 컬럼
df['is_dead'] = ((df['어제5일이평'] > df['어제20일이평']) & (df['5일이평'] < df['20일이평']
))

필요 없는 컬럼 제거

# 필요한 컬럼 : 종가, 5일이평, 20일이평, 어제5일이평, 어제20일이평, is_golden, is_dead
# 나머지 필요 없는 컬럼 제거(del, drop, reindex)
df = df.reindex(columns=['종가', '5일이평', '20일이평', '어제5일이평', '어제20일이평', 'is_golden', 'is_dead'])

그래프

# plt.plot(df['종가'].index, df['종가'], label='End Price') # (x값, y값, 그래프 이름)
plt.plot(df['종가'].index, df['5일이평'], label='5MA') # (x값, y값, 그래프 이름)
plt.plot(df['종가'].index, df['20일이평'], label='20MA') # (x값, y값, 그래프 이름)
plt.plot(df[df['is_golden']]['5일이평'],'^', color='gold', label='Golden') # golden
plt.plot(df[df['is_dead']]['5일이평'],'^', color='black', label='Dead') # dead
plt.legend(loc='best') # 범례 보이기, 위치 지정
plt.grid(True) # 그리드 보이기
plt.title("Price Cross Graph") # 그래프 제목
plt.xticks(rotation = 30, fontsize=8) # 축레이블 설정 :  각도, 글자 사이즈
plt.tight_layout() # 여백을 적게 써서, 그래프를 넓게 보이게 하는 방법
plt.savefig('graph.png') # 파일로 저장하기

# 도화지 만들기
fig = plt.figure(figsize=(12, 6))
# 칸 만들기
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
# 그래프 그리기
ax1.plot(df['종가'])
ax2.plot(df['5일이평'])
# 옵션 조정
ax1.set_xticklabels(df['종가'].index, rotation=30, fontsize=7)
ax1.set_title('End Price Graph')
# 한글 표기 : 한글 폰트가 아니라서 한글 폰트로 설정
# 폰트 이름을 알면 설정 가능
plt.rc('font', family='Malgun Gothic')
ax2.set_title('5일이평 그래프')
plt.show()

profile
가보자가보자~

0개의 댓글