3.8.4. 다양한 시장 상황 상승장 하락장 횡보장 에서의 전략 성능 평가

자동매매 전략은 시장 상황에 따라 다른 성능을 보입니다. 상승장, 하락장, 횡보장 각 상황에서 전략을 평가해야 합니다. 특정 시장 상황에만 강한 전략은 위험합니다. 다양한 상황에서 안정적인 수익을 내는 전략이 좋습니다. 이 섹션에서는 시장 상황별 전략 성능 평가 방법을 설명합니다.

시장 상황 구분 기준 설정

전략 성능을 평가하기 전에 시장 상황을 구분해야 합니다. 명확한 기준을 설정해야 객관적인 분석이 가능합니다. 일반적으로 기술적 지표를 사용하여 시장 상황을 구분합니다. 이동평균선, 추세선, ADX 등을 활용할 수 있습니다.

다음은 시장 상황 구분 기준 예시입니다.

  • 상승장: 20일 이동평균선이 60일 이동평균선 위에 위치합니다.
  • 하락장: 20일 이동평균선이 60일 이동평균선 아래에 위치합니다.
  • 횡보장: 20일 이동평균선과 60일 이동평균선이 교차하거나 좁은 범위에서 움직입니다.

ADX 지표를 활용하여 추세 강도를 측정할 수도 있습니다. ADX 값이 높을수록 추세가 강하고, 낮을수록 추세가 약합니다. ADX 값과 이동평균선을 함께 사용하여 시장 상황을 구분할 수 있습니다.

시장 상황별 백테스팅 수행

설정된 시장 상황 구분 기준에 따라 데이터를 나눕니다. 각 시장 상황별로 백테스팅을 수행합니다. 동일한 전략을 사용하되, 데이터만 다르게 적용합니다. 각 백테스팅 결과는 독립적으로 분석합니다.

각 시장 상황별 백테스팅 결과는 주요 성과 지표를 사용하여 비교합니다. 수익률, MDD, 승률 등을 비교합니다. 특정 시장 상황에서 유독 강하거나 약한 지표를 확인합니다.

결과 분석 및 전략 개선 방향 설정

시장 상황별 백테스팅 결과를 분석합니다. 특정 시장 상황에서 전략이 강하거나 약한 이유를 분석합니다. 예를 들어, 추세 추종 전략은 추세가 강한 시장에서 좋은 성과를 보입니다. 하지만 횡보장에서는 잦은 손실이 발생할 수 있습니다.

분석 결과를 바탕으로 전략 개선 방향을 설정합니다. 특정 시장 상황에 취약한 전략은 해당 상황을 회피하도록 수정합니다. 또는 해당 상황에 맞는 새로운 전략을 개발합니다. 다양한 시장 상황에서 안정적인 수익을 내는 전략을 구축합니다.

파이썬 코드 예시

다음은 파이썬 코드를 사용하여 시장 상황별 백테스팅을 수행하는 예시입니다.

import pandas as pd
import talib
import pyupbit
import numpy as np

# 데이터 불러오기 (예시)
df = pyupbit.get_ohlcv("KRW-BTC", interval="minute60", count=1000)
df.rename(columns={'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close', 'volume': 'Volume'}, inplace=True)

# 이동평균선 계산
df['SMA_20'] = talib.SMA(df['Close'], timeperiod=20)
df['SMA_60'] = talib.SMA(df['Close'], timeperiod=60)

# 시장 상황 구분 함수
def get_market_condition(row):
    if row['SMA_20'] > row['SMA_60']:
        return '상승장'
    elif row['SMA_20'] < row['SMA_60']:
        return '하락장'
    else:
        return '횡보장'

df['market_condition'] = df.apply(get_market_condition, axis=1)

# RSI 전략 (예시)
def rsi_strategy(df, overbought, oversold):
    df['RSI'] = talib.RSI(df['Close'], timeperiod=14)
    df['signal'] = 0.0
    df['signal'] = np.where((df['RSI'] > overbought) , -1, df['signal'])
    df['signal'] = np.where((df['RSI'] < oversold) , 1, df['signal'])
    df['position'] = df['signal'].diff()
    return df

# 백테스팅 함수
def backtest(df, initial_balance=1000000, fee=0.0005):
    balance = initial_balance
    position = 0
    buy_price = 0

    for i in range(len(df)):
        if df['position'][i] == 1:
            if position == 0:
                buy_price = df['Close'][i]
                balance *= (1 - fee)
                position = 1
        elif df['position'][i] == -1:
            if position == 1:
                sell_price = df['Close'][i]
                profit = (sell_price - buy_price) / buy_price
                balance += balance * profit * (1 - fee)
                position = 0

    return balance

# 파라미터 설정
overbought = 70
oversold = 30

# 시장 상황별 백테스팅
market_conditions = df['market_condition'].unique()
for condition in market_conditions:
    df_condition = df[df['market_condition'] == condition].copy()
    df_condition = rsi_strategy(df_condition, overbought, oversold)
    final_balance = backtest(df_condition)
    profit = (final_balance - 1000000) / 1000000
    print(f"시장 상황: {condition}, 수익률: {profit:.4f}")

위 코드는 시장 상황을 구분하고, 각 상황별로 RSI 전략을 백테스팅합니다. 시장 상황별 수익률을 출력하여 전략 성능을 비교합니다.

결론

다양한 시장 상황에서 전략 성능을 평가하는 것은 필수적입니다. 특정 상황에만 강한 전략은 위험합니다. 시장 상황별 분석을 통해 전략을 개선하고, 안정적인 수익을 추구해야 합니다.

요약

시장 상황에 따라 전략 성능은 달라집니다. 상승장, 하락장, 횡보장 각 상황별 평가가 필요합니다. 이동평균선 등을 활용하여 시장 상황을 구분합니다. 각 상황별 백테스팅 결과를 비교 분석합니다. 분석 결과를 바탕으로 전략을 개선합니다.

위로 스크롤