한글 폰트 지원하게 하기
# 컴퓨터에 설치된 폰트 목록(한글 지원하는) 출력하기 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')
df['날짜'] = pd.to_datetime(df['날짜'])
df.set_index('날짜', inplace=True) df.sort_index(inplace=True)
df['종가']
df['종가'].rolling(window=5).mean()
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()