크립토

[백테스트] 파이썬 변동성 돌파 전략

코대장 2021. 8. 17. 22:10
반응형

퀀트투자 관련 책을 읽으며, 처음으로 백테스트가 무엇인지 알게 되었습니다.
백테스트? 과거 데이터를 기반으로 여러 조건을 만들어 테스트 해 보는것이죠.

백테스트란 어떤 투자 전략이 과거에 어느 정도의 수익이 나는지
또는 얼마나 위험한지를 알아보기 위해 역사적인 데이터를 이용하여 전략을 모의실험하는 과정을 말한다.
- 실전 퀀트투자 중에서, 홍용찬 저 -

근데 여기서 중요한게 바로! 직접 백테스트를 해봤느냐? 인거 같습니다.
최근에 열심히 보고 있는 퀀트투자 유투버 강(갓 또는 킹)환국님 영상에 나온 백테스트를 직쩝! 파이썬을 통해서 구현해 보려고 합니다.
강환국님은 영상에서 백테스트를 엑셀로 하셨는데요. 엑셀 쓰면 간단하지 왜 굳이 파이썬으로 하려고 하느냐?

  • 첫째, 코드 재사용성을 통해 데이터만 있으면 다른 티커들도 백테스트를 바로 돌릴 수 있다.
  • 둘째, plotly 등과 같은 모듈을 통해 다이내믹한 시각화를 만들 수 있다.
  • 셋째, 파이썬과 판다스를 공부 할 수 있다.
  • 그리고 재밋다. 이거면 사실 끝.

그럼 관심 있는 분들은 따라오세요~!!

1. 데이터 수집

유투브 영상은 2019년 5월 영상으로 백테스트는 2018년 4월 1일 ~ 2019년 5월 21일 사이 데이터를 사용하셨습니다.
이전 포스팅에서 업비트 시세정보 수집에 대해서 다룬적이 있죠! 못 보신 분들은 참고하시고요.
크립토는 주식과 다르게 장이 열리고 닫히는 시간 없이 연중무휴로 24시간 돌아가죠.
그래서 시가, 종가를 나누는 기준이 거래소 마다 다르기도 합니다.
업비트에서는 오전 9시를 기준으로 장이 열리는 것으로 세팅되어 있더군요.

my_ticker = ["KRW-BTC"] # BTC, ETH, DOT
my_interval = "minutes1" #day, minutes1

periods = pd.period_range(start='2018-04',end='2019-05', freq='M')

# 임시데이터 저장 리스트
temp_list = []

# 코인 종류별, 월별 데이터 모으는 작업
for ticker in my_ticker:
    for pr in periods:
        pr = str(pr).replace('-','')
        fileName = '{}_{}_ohlcv_{}.csv'.format(pr, ticker, my_interval)
        df = pd.read_csv('./data/'+fileName)
        df['ticker'] = ticker
        temp_list.append(df)

df_orig = pd.concat(temp_list, axis=0)
df_orig['index'] = pd.to_datetime(df_orig['index'])
df_orig['날짜'] = df_orig['index'].dt.date
df_orig['시각'] = df_orig['index'].dt.time

근데 우리 갓환국님께서 사용한 데이터와 업비트에서 수집한 데이터가 시가, 종가, 고가, 저가 값이 모두 다르더라고요.

강환국님 유투브 영상 중
업비트 수집 데이터

뭐지? 왜 다르지? 와 역시 백테스트는 아무나 할 수 있는게 아닌건가봐... 절망할 뻔 했지만!
강환국님께서 사용한 일일 데이터는 00시부터 그날 23시 59분사이에서 데이터를 뽑아 오신거더라고요.
다시말해,

  • 00시 00분: 시가
  • 00시 ~ 23시 사이에서 고가, 저가 추출
  • 23시 59분: 종가
df = df_orig.pivot_table(index='날짜', values='open', aggfunc='first').reset_index()
df['high'] = df_orig.pivot_table(index='날짜', values='high', aggfunc='max').reset_index()['high']
df['low'] = df_orig.pivot_table(index='날짜', values='low', aggfunc='min').reset_index()['low']
df['close'] = df_orig.pivot_table(index='날짜', values='close', aggfunc='last').reset_index()['close']

이제 아래처럼 우리 갓환국 형님과 데이터를 똑같이 맞췄습니다.

OHLCV 추출방식 수정


휴~
이제 백테스트 할 수 있습니다!!
다음 시간에는 본격적으로 변동성 돌파 전략을 구현해 봅시다.
바로 갓환국 형님과 똑같이 말이죠!

혹시 백테스트 파이썬 코드가 필요하신 분은 댓글 남겨주세요!