파이썬으로 변동성 돌파 백테스트
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

파이썬으로 변동성 돌파 백테스트

by Squat Lee 2024. 1. 29.

제가 단타는 해 본적이 없지만, 최근에 읽은 책을 기준으로 백테스를 한번 해 보았습니다.
 

주식투자 ETF로 시작하라는 systrader79/이성규 님이 쓰신 책입니다.
 
ETF로 단타전략을 알려주셨는데 검증을 해보고 싶었습니다. 책에서 알려준 전략은 '변동성돌파'라고 합니다.

 

변동성 돌파(Volatility Range Breakout)

 
전설적인 선물트레이더로 세계적인 명성을 얻은 래리 윌림엄스가 개발한 전략입니다.  가치투자에 워런 버핏, 벤저민 그레이엄 등이 있다면, 기술적 투자에서는 추세추종의 선구주자였던 제시 리버모어, 데니스 에크하르트 등 수많은 터틀 트레이더 그리고 지금 소개하는 래리 윌리엄스가 있습니다. 그는 트레이더로서 기술적 지표를 개발하였고, 단순하지만 기발한 트레이딩 아이디어를 이용하여 단기적인 기술적 트레이딩에 능했습니다. 다양한 트레이딩 저서를 써서 투자자들에게 큰 도움을 주었는데 대표이적인 것이 "How I made $1,000,000 trading commodities last year", "Long term secrets to short term trading"등이 있습니다. 지금 소개할 윌리엄스의 단기 변동성 돌파 전략은 그가 가장 아끼는 전략으로 개발된 지 오래되었음에도 여전히 시장에서 유용하게 사용되고 있습니다.
 
 

전략규칙

  • 일봉 기준 range 계산 : 전일고가 - 전일저가
  • 매수 : 당일 장중 가격 > 당일 시가 + 전일 range -> 돌파 시점에 시장가 매수
  • 매도 : 다음 날 시가 시장가 청산

이 규칙대로 해서 ETF를 테스트 해 보았습니다.
 
테스트 한 코드는 아래와 같습니다.
 

from pykrx import stock
import pandas as pd
import numpy as np

li_etf = stock.get_etf_ticker_list('20240119')

i = 0
li_cum = []
for etf in li_etf:
    try:
        print('남은ETF 처리개수 : ' + str(len(li_etf)-i))
        etf_name = stock.get_etn_ticker_name(etf)
        print(etf_name)

        df = stock.get_market_ohlcv('20231201', '20231230', etf)

        df['변동'] = df['고가'] - df['저가']
        df['전일변동'] = df['변동'].shift(1)
        df['목표가'] = df['시가'] + df['전일변동']
        df['수익률'] = np.where(df['고가'] >= df['목표가'], df['종가']/df['목표가'], 1)
        df['누적수익률'] = df['수익률'].cumprod()

        li_cum.append([etf_name, df['누적수익률'].iloc[-1]])

        i += 1
    except:
        pass

df_total = pd.DataFrame(data=li_cum, columns=['ETF', '누적수익률'])
print(df_total)

df_total.to_excel('변동성돌파 ETF 백테스트240121.xlsx')

 
krx에서 ETF 종목을 모두 가져와서 2023년 12월 한 달동안 누적수익률을 보는 코드입니다.
 
시중에 관련 책이 있어서 참고하며 쓰느라 쉽게 작성할 수 있었습니다.
 
각 ETF 종목의 누적수익률은 List로 만들어서 데이터프레임으로 만든 다음 엑셀로 저장하였습니다.
 
결과는 엑셀파일에 저장했으며 총 811개 ETF 종목을 분석했고, 그 중에 하나 결과값이 제대로 나오지 않아서 삭제 하였습니다.
 

import pandas as pd

df = pd.read_excel('변동성돌파 ETF 백테스트240121.xlsx')

print('수익난 종목비율 : ' + str(len(df[df['누적수익률']>1])/len(df)))
print('누적수익률 평균 : '+ str(df['누적수익률'].mean()))
print('누적수익률 최대값 : '+ str(df['누적수익률'].max()))
print('누적수익률 최소값 : '+ str(df['누적수익률'].min()))

 
결과값을 확인하는 코드입니다.
 
특정 종목을 좀 더 긴 기간으로 분석해도 좋을텐데 이번 포스트는 여기까지만 작성하려고 합니다.
 

  • 수익난 종목비율 : 0.6794081381011098
  • 누적수익률 평균 : 1.0047496146520538
  • 누적수익률 최대값 : 1.083890245198598
  • 누적수익률 최소값 : 0.9379528300362799

제가 단타는 잘 몰라서 그러는데 모든 ETF 종목에 해당되는 건 아닌 것 같습니다. 수익난 종목이 67% 정도 되네요.
 
수익률 평균은 0.4%이며, 최대값은 8%, 최소값은 -7% 정도 됩니다. ETF는 거래세가 없으나 수수료가 포함됩니다. 수수료는 반영하지 않은 값이라 나온 수치보다 더 안좋을 것 같네요.
 
다음에는 이 전략을 조금 수정해서 백테스트를 해 보도록 하겠습니다.

728x90
반응형

댓글