Back Trader는 전략식 분석을 위해서 OHLCV(시가,고가,종가,저가,거래량)으로 구성된
Pandas dataframe형태의 데이터를 사용한다.
키움증권API를 통해 데이터를 가져와 사용할 수도 있지만
키움증권 계좌와 아이디가 필요하기 때문에 범용성이 떨어진다.
때문에 개발기간 동안에는 Beautiful Soup을 통해서 Naver Finance의 데이터를 크롤링 하도록 한다.
준비물
라이브러리 : BeautifulSoup, Pandas Dataframe, datetime(datetime, timedelta)
먼저 크롤링 할 OHLCV DATA를 보유한 웹 페이지는 아래 링크를 참고하면 된다.
https://trading-for-chicken.tistory.com/4
크롤링 할 웹페이지 주소는 아래와 같은데 기본적으로 4가지 검색조건이 존재함을 알 수 있다.
종목코드, 검색시작 날짜, 검색종료날짜, 일봉-주봉-월봉 이다. 이를 참고하여 코딩을 진행한다.
https://api.finance.naver.com/siseJson.naver?symbol=005930&requestType=1&startTime=20190624&
endTime=20210901&timeframe=day
네이버금융에서 데이터를 파싱 dataframe형태로 변경하고 검색조건에따라 원하는 파싱이 가능하도록 함수를 작성하는 방법은 글이 길어서 3개 로 나누었으니, 아래 링크 참고하면 된다.
1편 : 네이버 금융에서 원하는 데이터 크롤링하기
2편 : 데이터를 mplfinance나 backtrader에서 사용 가능한 pandas dataframe 형태로 가공하기
3편 : 종목코드, 검색기간, 검색종류에따라 원하는 데이터 크롤링이 가능한 함수 만들기
1편 링크
https://trading-for-chicken.tistory.com/5
2편 링크
https://trading-for-chicken.tistory.com/6
3편 링크
https://trading-for-chicken.tistory.com/7
전체 코드는 아래와 같다. 자세한 설명은 위 링크 참고 하시면 된다.
from bs4 import BeautifulSoup
from urllib.request import urlopen
import ssl
import pandas as pd
from datetime import datetime
from datetime import timedelta
def ohlcv_data(code='005930',starttime='default',endtime='today',timeframe='day'):
if endtime == 'today':
endtime = datetime.today().strftime('%Y%m%d')
if starttime == 'default':
date = datetime.strptime(endtime,'%Y%m%d')-timedelta(days=365)
starttime = date.strftime('%Y%m%d')
url = 'https://api.finance.naver.com/siseJson.naver?symbol='+str(code)+'&requestType=1&startTime='+str(starttime)+'&endTime='+str(endtime)+'&timeframe='+str(timeframe)
res = urlopen(url, context=ssl.create_default_context())
soup = BeautifulSoup(res.read(), 'html.parser', from_encoding='utf-8')
data = str(soup).split('],')
df = pd.DataFrame(columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
for i in range(1,len(data)):
date = data[i].split(', ')[0].split('["')[1].split('"')[0]
open = data[i].split(', ')[1]
high = data[i].split(', ')[2]
close = data[i].split(', ')[3]
low = data[i].split(', ')[4]
volume = data[i].split(', ')[5]
list = [date, open, high, low, close, volume]
df = df.append(pd.Series(list, index=df.columns), ignore_index=True)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
df = df.astype({'Open':'int','High':'int','Low':'int','Close':'int','Volume':'int'})
df = df.sort_index(ascending=True)
return df
'알고리즘 트레이딩 만들기' 카테고리의 다른 글
0. 들어가기에 앞서 (0) | 2021.08.31 |
---|