본격적으로 전략에 대한 백테스팅을 진행하겠다. 백테스팅은 다음과 같은 여러개의 백테스팅을 진행할 예정이다.
설명
이 중 평균적인 결과를 얻을 수 있는 기초 백테스팅이 이번 포스팅이 되겠다! 평균이라 함은 특정 시간대를 정하거나 혼용하지 않고 기본 전략 중 일부가 삭제되거나 다른 조건이 추가되지 않은 상태를 의미한다. 현재 백테스팅을 진행하는 시간은 오전 0시를 기준으로 진행했다.
코드
코드에서는 단일 화폐로 가정한다!
또, 전략 설명에는 오전 0시에 매수한다고 명시했지만, 이 부분을 trading_time 이라는 변수로 선언했다.
import pyupbit
import pandas as pd
import datetime
import time
import numpy as np
pd.set_option('display.max_rows', None) # print all rows
pd.set_option('display.max_columns', None) # print all columns
pd.set_option('expand_frame_repr', False) # print df on single line
ma_score_weight = [1.1, 1.05, 0.95, 0.9]
기본적인 라이브러리와 출력 세팅을 했다. 그리고 이동평균선 점수도 가중치를 둬서 선언했다.
지금부터 설명하는 코드는 너무 길어서 3개의 부분으로 나눈다. 3개의 부분은 모두 한 함수내에 있는 코드라고 생각하면 된다.
def get_ohlcv(ticker, trading_time, target_volatility):
date = trading_time
dfs = []
for i in range(52):
df = pyupbit.get_ohlcv(ticker, interval="minute60", to=date, count=24*7)
if len(df) == 0: break
dfs.append(df)
date = df.index[0]
time.sleep(0.1)
df = pd.concat(dfs).sort_index()
df.index.name = 'datetime'
df.reset_index(inplace=True)
ndex가 2021:05:13 12:00:00로 되어있는데 시간에 해당하는 '12' 부분만을 따로 컬럼으로 만든다! 나중에 원하는 시간대에 대한 거래로 추리기 위해서이다.
이후, 오전 오후 거래량을 비교하기 위해 거래량을 구하고, 오후 수익률이 오전 수익률보다 더 큰지 확인하기 위해 차를 구한다. 그외의 고가, 저가, 시가, 변동성, 노이즈 이동평균선 점수를 구한다.
이후, 원하는 trading time 정보만 보기 위해서 df를 축소한다.
이 코드는 원하는 구매 시점이 지난 이후에 돌리는 코드이기 때문에 shift(1)을 모두 사용한다. 왜냐하면 12시 5분에 12시 거래에 대해 코드를 돌리면 마지막 데이터가 12시부터 12시 5분까지의 단 5분의 데이터밖에 존재하지 않기 때문에 12시 5분에 돌리더라도 12시(정확히는 11시 59분)를 현재라고 가정한다.
20일간 노이즈 평균을 구하고 목표 가격을 구한다(목표 가격 이상일 때 구매). 그 뒤 거래가 가능한지 여부와 목표 변동성을 적용한 가격 가중치 결정, 수익률을 구하고 반환한다.
구매 조건을 다시 말하자면 이동평균선이 0보다 큰지, 1일 노이즈가 0.55보다 작은지, 오후 거래량(12시간전부터 지금까지)이 오전 거래량(24시간전부터 12시간전까지)보다 높은지, 오후 수익률(24시간 전 시가 - 현재 종가)이 0보다 큰지, 그리고 마지막으로 현재 종가가 목표가보다 높은지이다.
target_price_priority 같은 경우는 목표 변동성이 5%인데 전일 변동성이 3% 라면 1이상의 수치를 가지는 값이 되므로 최대 1로 제한했다.
수익률은 전체 1 중에서 target_price_priority가 적용안되는(현금으로 보유하는) 부분과 target_price_priority가 적용되는 부분으로 나누고 후자의 수익률을 구해서 전체 수익률을 구했다. 거래비용 0.001 까지 제했다.
이 때 반환값으로는 총 거래 기간, 조건을 만족한 거래 기간, 승률, 현재 수익률, 최대 수익률, MDD, 손익비이다.