작성자 : 15기 김지호
본 스터디는 「파이썬 증권 데이터 분석」 (김황후 저) 책을 참고하여 진행하였습니다.
금주 스터디에서는 팬더스와 웹스크레이핑을 활용하여 특정 종목의 일별 시세와 주가 변동폭을 구하고 시각화하는 실습을 진행하였습니다.
네이버의 데이터는 크롤링이 거부되어있기 때문에 언제든지 막힐 수 있고, 증권사의 API를 이용하기 위해서는 증권사 프로그램을 PC에 설치해야 하는 번거로움이 있기 때문에 간편하게 Yahoo Finance의 데이터를 이용한다. 참고로,야후와 구글 파이낸스에서 팬더스 데이터 리더 기반의 주식 데이터를 제공하는데, 현재 구글 파이낸스는 중단된 상태이다
pip install yfinance
pip install pandas_datareader
from pandas_datareader impoert data as pdr
import yfinance as yf
yf.pdr_override()
data = pdr.get_data_yahoo('005930.KS',start='2018-05-30') //dataframe 의 index는 datatime
주가 단순 비교 단위가 달라서 비교가 어렵다.
가격이 다른 두 주가의 수익률을 비교할 수 있다.
t['dpc'] = (t['close'] - t['close']shift(1)) / t['close']shift(1) * 100
shift(1) : 종가 series를 전체 1행 아래로 이동시킴
삼성전자 종가의 일간 변동률을 살펴본 결과 정규분포보다 중앙은 더 뾰족하고 꼬리는 두터운 경향이 있다.
일정기간 동안 최고점과 최저점을 비율로 계산한 값. 즉, 고점 대비 몇%가 빠졌는지를 계산한 값
퀀트 투자에서는 수익률을 높이는 것보다 이 최대 손실 낙폭을 낮추는 것의 중요성을 언급하며, 자동매매도 MDD가 10% 이상이면 손절하도록 코드를 작성할 정도로 중요한 지표다.
KOSPI 와 다운존스 지수를 비교.
* 다운존스 지수는 미국 증권거래소에 상장된 30개 우량기업으로 구성되어있다.
역시나 단위 탓에 단순 비교는 어렵다
지수화 - 기준을 각 지수의 2000년대 시점으로 잡음
(오늘 KOSPI 지수 / 2000-01-04 KOSPI 지수 )*100
(오늘 다운존스 지수/ 2000-01-04 다운존스 지수 )*100
NaN 처리 —> fillna(method = ‘bfill’) 로 다음날 데이터 복붙. 단, 맨 마지막 데이터는 NaN 을 바로 앞 데이터로 채움(’ffill’)
from scipy import stats
regr = stats.linregress(df['DOW'],df['KOSPI'])
# model = stats.linregress(x, y)
자산끼리의 상관계수를 보면, 두 자산의 움직임이 서로 연관 있는 경우가 있다.
상관계수를 구하는 방법은 다음과 같다
# 데이터프레임으로 구하기
df.corr()
# 시리즈로 구하기
df['DOW'].corr(df['KOSPI'])
df.DOW.corr(df.KOSPI)
다운존스 지수와 KOSPI / 미국 국채와 KOSPI
결정계수 : 0.76 / 0.72
투자에 대한 위험과 수익은 평균과 분산으로 나타낼 수 있으며, 상관관계가 낮은 자산을 대상으로 분산 투자하면 위험을 감소시킬 수 있다.이는 포트폴리오를 구성할 때 상관관계가 낮은 종목들로 자산을 배분했을 때, 리스크를 줄일 수 있음을 의미한다.
위와 같은 경우엔 리스크 완화를 위해 다운존스 지수에 분산투자하는 것보다 미국채권에 분산투자하는 것이 도움이 된다.
한국거래소에서 제공하는 상장법인 목록에서 종목코드를 따와서 → 네이버 금융으로 해당 기업의 주가를 scraping 한다.
한국거래소의 상장법인 목록에서 종목코드를 가져옴
종목 코드를 바탕으로 Naver 금융 웹사이트 접속해서 주가데이터 끌어오기
한국거래소 기업공시 채널에서 상장 법인 목록을 엑셀로 받을 수 있다.
.xls 형태로 제공한다. 열어보면 다음과 같다.
엑셀파일 같아 보이지만, 메모장으로 열어보면 다음과 같이 html로 되어있어서 read_html 함수를 활용해야함.
Pandas 로 읽기
pip install html5lib
pip install lxml
웹은 다양한 언어(JSP, ASP, PHP) 로 만들 수 있지만,
결국 사용자에게 보여지는 웹브라우저는 html로 변환한 결과를 렌더링한 것이다.
html 의 구조와 속성을 간단히 이
<html>
<head>
<title>This is title</title>
</head>
<body>
<h1>Korea Univ </h1>
<h2>KUBIG</h2>
<b>두껍게</b><br />
<i>이탈릭</i><br />
<a href="https://portal.korea.ac.kr">포털입니다!<br />
</a>
</body>
</html>
웹 페이지안에 보이는 모든 내용은 여는 <body> 태그와 닫는 </body> 태그안에 있어야 함.
셀트리온을 검색해서 들어가면 finance.naver.com/item/main.nhn?code=068270 해당 url 을 확인할 수 있다.
068270은 셀트리온 종목코드이고, 다른 종목을 확인하려면 종목코드만 바꿔서 접속하면 된다.
일별 시세 페이지를 보면 10페이지씩 되어있고, ‘맨뒤’로 이동하면 412 까지 있다.
(크롬 웹브라우저에서 F12 키를 누르면 웹브라우저의 개발자 도구기능을 이용할 수 있다.)
https://finance.naver.com/item/sise.naver?code=068270&page=1
F12로 확인해본 웹 소스코드이다. 스크린샷에서 ‘맨뒤’라는 문자열을 검색해보면 바로 앞에 전체 페이지 정보가 나와있다.
우리는 긴 코드 중에서 이 부분(전체 페이지수)만을 추출해서 해당 종목이 몇 페이지까지 있는지 정보를 얻어낼 예정이고,
일련의 과정은 뷰티풀수프 파이썬 라이브러리로 진행한다.
뷰티풀 수프는 HTML, XML 페이지로 부터 데이터를 추출하는 라이브러리이다.
pip install beautifulsoup4
제공하는 기본적인 파서들이 있는데,
우리는 뷰티풀 수프를 이용해서 셀트리온 일별시세, 중에서도 맨 마지막 페이지를 찾아낼 예정이다.
이를 위해 원하는 태그를 찾아주는 두 가지 함수를 사용해볼 수 있다.
문서 전체를 대상으로 조건에 맞는 모든 태그를 찾는다. 문서에 하나뿐인 body 같은 태그를 찾으려고 이 함수를 쓰면 낭비스럽..
find_all(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값'][, limit=찾을 개수])
find(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값'])
[금융데이터 스터디] 주식 종료 가격 예측 경진대회 - LSTM (0) | 2022.05.30 |
---|---|
[금융데이터 스터디] 데이콘 "주식 종료 가격 예측 경진대회" 코드 리뷰 - 소뉸팀 (0) | 2022.05.29 |
[금융데이터 스터디] 백테스팅 지표/ 변동성 돌파 전략 (0) | 2022.03.31 |
[금융데이터 스터디] 트레이딩 전략과 구현 (0) | 2022.03.31 |
댓글 영역