이 섹션에서는 구축된 백테스팅 환경을 활용합니다. 실제 매매 전략을 실행하는 방법을 안내합니다. 데이터 준비부터 결과 확인까지 단계별 과정을 상세히 설명합니다. 코드를 예시로 제시하여 실습을 돕습니다. 이를 통해 독자는 백테스팅 시스템을 능숙하게 사용할 수 있습니다.
자동매매 시스템 구축에서 백테스팅은 중요한 과정입니다. 개발한 전략의 성능을 검증하고 개선합니다. 올바른 백테스팅은 성공적인 자동매매의 기반이 됩니다. 이 섹션에서는 백테스팅 환경을 최대한 활용하는 방법을 제시합니다.
1단계: 백테스팅 환경 점검
먼저 구축된 백테스팅 환경을 점검합니다. 필요한 라이브러리가 설치되었는지 확인합니다. 데이터베이스 연결 상태를 확인합니다. 백테스팅에 필요한 데이터가 준비되었는지 확인합니다. 환경 변수 설정이 올바른지 확인합니다.
2단계: 데이터 로딩
백테스팅에 사용할 데이터를 로딩합니다. 과거 가상화폐 시세 데이터를 데이터베이스에서 가져옵니다. 또는 CSV 파일에서 데이터를 읽어옵니다. Pandas DataFrame 형태로 데이터를 저장합니다.
import pandas as pd
import sqlite3
# SQLite 데이터베이스 연결 (예시)
conn = sqlite3.connect('crypto_data.db')
# SQL 쿼리 실행하여 데이터 가져오기
query = "SELECT * FROM btc_usdt_1h"
df = pd.read_sql_query(query, conn)
# 데이터베이스 연결 종료
conn.close()
print(df.head())
3단계: 매매 전략 구현
백테스팅할 매매 전략을 파이썬 코드로 구현합니다. 이전에 개발한 전략 코드를 활용합니다. 이동평균선 교차, RSI, 볼린저 밴드 전략 등을 사용할 수 있습니다. 전략 코드는 매수/매도 신호를 생성해야 합니다.
import talib
def generate_sma_signals(df, short_window, long_window):
"""단순 이동평균 교차 전략 신호 생성"""
df['SMA_SHORT'] = talib.SMA(df['close'], timeperiod=short_window)
df['SMA_LONG'] = talib.SMA(df['close'], timeperiod=long_window)
df['signal'] = 0.0
df['signal'][short_window:] = np.where(df['SMA_SHORT'][short_window:] > df['SMA_LONG'][short_window:], 1.0, 0.0)
df['position'] = df['signal'].diff()
return df
# 전략 실행 (예시)
short_window = 20
long_window = 50
df = generate_sma_signals(df, short_window, long_window)
print(df[['close', 'SMA_SHORT', 'SMA_LONG', 'position']].tail())
4단계: 백테스팅 로직 구현
백테스팅 로직을 구현합니다. 초기 자본금을 설정합니다. 매수/매도 시뮬레이션을 진행합니다. 거래 수수료를 고려합니다. 손절매 로직을 구현합니다.
def backtest_strategy(df, initial_capital=1000000, commission=0.0005):
"""백테스팅 로직 구현"""
capital = initial_capital
position = 0 # 0: No position, 1: Long
buy_price = 0
for i in range(len(df)):
if df['position'][i] == 1: # 매수 신호
if position == 0:
buy_price = df['close'][i]
capital *= (1 - commission) # 수수료
position = 1
print(f"매수: {df.index[i]}, 가격: {buy_price}")
elif df['position'][i] == -1: # 매도 신호
if position == 1:
sell_price = df['close'][i]
profit = (sell_price - buy_price) / buy_price
capital += capital * profit * (1 - commission) # 수수료
position = 0
print(f"매도: {df.index[i]}, 가격: {sell_price}, 수익률: {profit:.4f}")
if position == 1: # 마지막 포지션 정리
sell_price = df['close'][len(df) - 1]
profit = (sell_price - buy_price) / buy_price
capital += capital * profit * (1 - commission)
print(f"마지막 매도: {df.index[len(df) - 1]}, 가격: {sell_price}, 수익률: {profit:.4f}")
return capital
# 백테스팅 실행
final_capital = backtest_strategy(df.copy())
print(f"최종 자본: {final_capital:.0f} 원")
5단계: 결과 기록
백테스팅 결과를 기록합니다. 최종 자본금, 총 수익률, 최대 낙폭(MDD) 등을 계산합니다. 결과를 데이터베이스에 저장합니다. 또는 CSV 파일로 저장합니다. 시각화를 통해 결과를 분석합니다.
def calculate_metrics(initial_capital, final_capital, df):
"""백테스팅 결과 지표 계산"""
total_return = (final_capital - initial_capital) / initial_capital
print(f"총 수익률: {total_return:.4f}")
# 최대 낙폭 (MDD) 계산 로직 (예시, 실제 MDD 계산은 더 복잡할 수 있음)
df['equity'] = initial_capital
position = 0
buy_price = 0
for i in range(len(df)):
if df['position'][i] == 1 and position == 0:
buy_price = df['close'][i]
position = 1
elif df['position'][i] == -1 and position == 1:
sell_price = df['close'][i]
profit = (sell_price - buy_price) / buy_price
df['equity'][i:] = df['equity'][i-1] + df['equity'][i-1] * profit * (1 - 0.0005) # 수수료
position = 0
else:
df['equity'][i:] = df['equity'][i-1]
df['peak'] = df['equity'].cummax()
df['drawdown'] = (df['equity'] - df['peak']) / df['peak']
mdd = df['drawdown'].min()
print(f"최대 낙폭 (MDD): {mdd:.4f}")
# 결과 분석
calculate_metrics(1000000, final_capital, df.copy())
6단계: 반복적인 백테스팅 및 개선
다양한 파라미터 조합으로 백테스팅을 반복합니다. 결과를 분석하고 전략을 개선합니다. 3.8.2 섹션에서 백테스팅 결과 분석 방법을 자세히 다룹니다.
이 섹션에서는 백테스팅 환경에서 매매 전략을 실행하는 방법을 설명했습니다. 다음 섹션에서는 백테스팅 결과를 상세하게 분석하는 방법을 알아봅니다.