이제 본격적으로 전략 시뮬레이션을 개발해 보겠습니다. 

이 글은 시스템 트레이딩에 관심을 가지고 직접 개발해보고 싶은 전산 비 전공자를 대상으로 합니다. 가능한 쉽게 이해할 수 있도록 기술해보도록 하겠습니다.

 

이번에 개발할 전략은 Larry Williams의 변동성 돌파 전략(이하 LW)입니다. 

 

LW와 관련하여 검색을 해보니 좋은 글들이 많았습니다. 이 중 heybit에서 LW를 실제 운영 중이라고 하는군요. 여기 나오는 전략을 개발해보도록 하겠습니다. 

support.heybit.io/ko/articles/2297782-

 

헤이비트의 '변동성 돌파 전략' 상세 안내

헤이비트 핵심 트레이딩 전략인 '변동성 돌파'에 대해 상세 안내 합니다.

support.heybit.io

이외에도 systraders79님의 아래 글도 굉장히 좋습니다. 이제 막 퀀트를 시작하시는 분들은 일독을 권합니다.

cafe.naver.com/invest79

 

systrader79의 실전 주식 투... : 네이버 카페

초보자도 따라할 수 있는 안전하고 쉬운 주식/ETF 포트폴리오 투자법을 공개합니다 미국주식투자

cafe.naver.com

 

전략에 대한 자세한 설명은 위에 Heybit글을 참고하시면 될 것 같습니다.

 

LW를 개발하기 위하여 필요한 사항을 정리해보겠습니다.

 

1. test 대상 ticker : 암호화폐 BTC, ETH

2. back data : 2017-09-25 ~ 2020-11-12 일봉 데이타. 

3. 거래 규칙 :

   매수 : 일봉 데이타의 high 값이 매수 예정 가격(시가+전일 변동성*k)보다 높으면 매수

   청산 : 당일 종가 (주식의 경우에는 다음 날 시초가 매도가 성과가 좋다고 알려져 있으나 암호화폐는 24시간 거래가 되므로 다음 날 시초가 의미가 없음)

   수수료 : 0.035% (upbit 기준)

   일단 k = 0.5로 고정, noise는 사용하지 않습니다.

 

전략을 돌려보기 위해서는 준비해야할 것들이 많습니다. 우선 파일에 저장된 과거 데이터를 읽어와야 합니다. 이런 부분은 전략을 만드는 것과는 크게 관련이 없기 때문에 제가 소개해드리는 코드를 그냥 사용하시면 됩니다.

 

기본 함수들

- read_csv_to_dict() :  csv 형태로 저장된 과거 데이터를 dict 형태로 돌려주는 함수

- save_to_file_csv() : 전략 test 중 중간 값들을 보관한 후 그 결과를 csv 파일에 저장하는 함수. 이렇게 하는 이유는 LW가  제대로 동작하였는지 excel로 검정해보기 위하여 사용합니다.

- class Candle() : candle 데이터를 묶어서 처리하는 class. class라는 용어가 나오는데, 일단은 관련 함수의 집합이라고 생각하시면 됩니다. 앞으로 Candle()을 발전시켜서 분/일봉 관리 그리고 각종 지표들도 모두 구현해볼 예정입니다.

- make_candle_info() : simluation 데이터를 candle로 바꾸어 주는 함수

 

여기까지는 그냥 이런 함수들이 필요하다 정도만 생각하시고 내용은 무시하여도 됩니다.

 

이 함수들을 바탕으로 이제 본격적으로 전략 시뮬레이터를 만들어보겠습니다. 일단은 막 짜보겠습니다. 막 짠 코드이기 때문에 직관적이고 읽기 좋은 코드입니다 :)

 

시뮬레이터는 아래와 같은 형식으로 동작할 것입니다.

 

백데이터 읽기

LW 초기화 ( 가장 오래된 일봉에서 range값 구함 )

while(모든 데이터에 대하여) :

    if 매수 조건을 만족하면 :

         수익 = 오늘 종가 - 매수가격 

         누적수익 += 수익

 

print(누적수익)

 

LW와 관련된 구현내용입니다. 이것도 편의상 class로 개발해보았습니다. 앞에서 설명하였듯이 class는 그냥 관련 함수의 집합이다라고 생각하시면 이해가 편하실 것입니다.

 

class TR_LW()은 크게 세 함수로 구성되어 있습니다.

- __init__() : 초기화 함수, LW에서 사용하는 변수를 초기화 합니다. k 값은 일단 0.5로 사용합니다.

- update_new_range() : 새로운 일봉으로 변경하는 부분입니다. range 값을 update합니다. 

- is_enter_candle() : 주어진 일봉에 대하여 매수 가능한지 여부를 판단합니다. 주어진 일봉의 고가가 매수예정가 보다 높으면 매수 예정가를 돌려줍니다. 아니면 0 return

 

이제 주 함수인 simulation() 입니다.

test용 백데이터는 candle_data에 저장되어 있습니다. simulation 중 발생하는 데이터를 기록하고 싶으면 이 변수에 추가를 하면 됩니다. 일단은 buy한 일봉에 대하여 buying 가격, 수익, draw down 값을 저장하도록 하겠습니다. 개발 과정에서 궁금한 변수가 있으면 여기에 계속 추가하면 됩니다.

 

    # simulation 중 파일에 저장할 변수들 추가 [-1]은 가장 마지막을 의미함
    candle_data[-1]['buying'] = 0 # buy 여부 저장
    candle_data[-1]['profit'] = 0 # profit 저장

    candle_data[-1]['total_profit'] = 0 # total_profit 저장
    candle_data[-1]['dd'] = 0 # downd draw 저장

 

시뮬레이션에 필요한 변수를 초기화합니다. 초기 투입금액, 각종 통계용 변수들 등등

 

candle_data는 내림차순으로 저장되어 있기 때문에 simulation은 뒤에서 앞으로 읽어가면서 처리합니다.

 

    for i in range(len(candle_data)-2,-1,-1)  :# 내림차순으로 저장되어 있으므로 뒤에서 한개씩

 

매수 조건을 만족하는 일봉이라면 아래 일들을 합니다.

 

1. 매수 금액 결정 : 매수 금액을 복리로 할지 단리로 할지 결정을 해야합니다. 일단 최대 초기 원금으로 투자하는 것으로 하겠습니다. 다만 원금 손실이 발생하면 초기 원금보다 적을 수 있으므로 현재잔고(balance)와 초기원금(deposit) 중 min 값을 매수가능 금액으로 결정합니다.

            # 매수 금액 결정, min(balance, deposit) 초기 deposit 금액 혹은 balance가 초기 deposit 이하이면 balance
            buying_amount = min(balance, deposit)

 

2. 매수 수량을 구한 후 종가에 매도 기준으로 수익을 계산한 후 balance update합니다.

3. 수수료를 계산하여 balance에 update합니다.

4. 통계를 위한 변수들을 update

5. log를 위하여 필요한 변수들을 저장

 

이렇게 모든 데이터에 대하여 돌린 후에는 그 결과를 csv 파일 형태로 저장합니다.

다음에는 simulation 결과를 간단하게 화면에 표시합니다.

마지막으로 simulation 결과를 파일에 저장합니다 파일 이름은 임의로 정의하시면 됩니다.

 

simulation을 위한 준비가 끝났습니다. 이제 이 함수를 부르기만 하면 됩니다.

이 함수는 ticker와 백데이터가 저장된 파일명, 전략을 인자로 받습니다.

 

simulation(ticker, fname, tr_logic)

 

simulation을 부를 때 전략을 전달하기 때문에 앞으로는 전략만 개발하면 됩니다. 

 

fname = '.\\sim_data\\BTC_day-2017-09-25-2020-11-12.csv'

ticker = 'KRW-STEEM'

# Larry William 변동성 돌파, 일봉 사용

tr_logic = TR_LW('day', 1)

 

simulation(ticker, fname, tr_logic)

 

2017년 09월 25일 부터 2020년 11월 12일 동안 BTC 일봉으로 돌려보았습니다. 올해 BTC가 상승세를 보여서인지 1백만원 투입해서 수수료 제외하고 약 2.9백만원이 되었군요. 

LW 전략이 암호화폐에 좋다는 이야기는 많이 들었는데, 역시나 좋군요.

 

github에 올린 코드를 보면 직관적으로 막 짰기 때문에 조금 지저분한 느낌이 듭니다. 새로운 전략이 나올 때 마다 코드 수정량이 많으면 생산성이 떨어지기 때문에 코드를 조금 정리를 해야합니다.

 

다음에는 이번에 소개해드린 코드를 조금 정리해서 향후 새로온 전략을 적용하기 좋은 형태로 바꾸어 보겠습니다.

 

소스코드는 아래에 있습니다.

github.com/multizone-quant/System_trading_ex/blob/main/Larry_williams1.py

 

multizone-quant/System_trading_ex

Contribute to multizone-quant/System_trading_ex development by creating an account on GitHub.

github.com

주의사항.

 

시뮬레이션 결과가 저장된 파일이 열려있으면 동작 중 오류가 발생합니다. 따라서 시뮬레이션을 돌릴 때는 결과가 저장된 파일은 반드시 닫아야 합니다.

반응형

설정

트랙백

댓글