반응형

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

 

01. Naver Finance에서 크롤링할 URL 찾기

01. 크롤링할 페이지 찾기 먼저 네이버금융에 들어가서 [국내증시] → [코스피] → [삼성전자] 를 클릭하자. 이제 아래에 [차트]를 클릭하자 여기서 [F12]로 [개발자 모드]를 켜고 [Network]를 클릭한다

trading-for-chicken.tistory.com

 

크롤링 할 웹페이지 주소는 아래와 같은데 기본적으로 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

 

02. OHLCV 데이터를 파싱해 Pandas Dataframe 형태로 만들기 -1

2. Data를 파싱하여 깔끔한 출력으로 만들기 앞에서 찾은 URL을 확인하면 4가지 검색조건이 존재함을 알 수 있다. 종목코드, 검색시작 날짜, 검색종료날짜, 일봉-주봉-월봉 이다. 이를 참고하여 코

trading-for-chicken.tistory.com

 

2편 링크 

https://trading-for-chicken.tistory.com/6

 

03. OHLCV 데이터를 파싱해 Pandas Dataframe 형태로 만들기 -2

저번 글에서 데이터를 깔끔하게 파싱하는데 성공하였다. 이제 Pandas Dataframe 형태로 변환하도록 하자. 저번 글 링크>> https://trading-for-chicken.tistory.com/5 02. OHLCV 데이터를 파싱해 Pandas Datafram..

trading-for-chicken.tistory.com

3편 링크

https://trading-for-chicken.tistory.com/7

 

04. OHLCV 데이터를 파싱해 Pandas Dataframe 형태로 만들기 -3

이번장에는 저번에 만든 URL 파싱 -> 데이터프레임으로 변환하는 함수에서 원하는 종목과 기간으로 파싱할 수 있도록 함수를 만들어 보도록 한다. 저번 글 링크 >> https://trading-for-chicken.tistory.com/6

trading-for-chicken.tistory.com

 

전체 코드는 아래와 같다. 자세한 설명은 위 링크 참고 하시면 된다.

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

+ 최근 글