3.7.2. 전략 1. 이동평균선 교차 Golden Cross Dead Cross 전략

이 섹션에서는 이동평균선 교차 전략을 구현합니다. 골든 크로스와 데드 크로스를 활용합니다. 이 전략은 추세 추종 전략의 대표적인 예시입니다. 이동평균선은 가격 추세를 파악하는 데 유용합니다. 두 개의 이동평균선 교차를 통해 매매 신호를 얻습니다.

3.7.2.1 전략 로직 설명

이동평균선 교차 전략은 두 개의 이동평균선을 사용합니다. 단기 이동평균선과 장기 이동평균선을 활용합니다. 단기 이동평균선은 가격 변화에 민감하게 반응합니다. 장기 이동평균선은 가격 추세를 안정적으로 보여줍니다. 두 선의 교차점에서 매수 또는 매도 신호를 포착합니다.

골든 크로스 (Golden Cross): 단기 이동평균선이 장기 이동평균선을 상향 돌파하는 경우입니다. 상승 추세로 전환될 가능성이 높다는 신호입니다. 매수 신호로 활용됩니다.

데드 크로스 (Dead Cross): 단기 이동평균선이 장기 이동평균선을 하향 돌파하는 경우입니다. 하락 추세로 전환될 가능성이 높다는 신호입니다. 매도 신호로 활용됩니다.

이 전략은 간단하지만 효과적인 추세 추종 전략입니다. 시장 상황에 따라 이동평균선 기간을 조정할 수 있습니다. 다른 보조 지표와 함께 사용하여 신호의 정확도를 높일 수 있습니다.

3.7.2.2 파이썬 코드 구현

다음은 이동평균선 교차 전략을 파이썬으로 구현하는 예시입니다. Pandas와 TA-Lib 라이브러리를 사용합니다.

1단계: 필요한 라이브러리 임포트

import pandas as pd
import talib

2단계: 데이터 불러오기 및 이동평균선 계산

# 예시: 업비트 API를 통해 BTC/KRW 1시간봉 데이터 1000개 가져오기
import pyupbit
df = pyupbit.get_ohlcv("KRW-BTC", interval="minute60", count=1000)

# 단기 이동평균선 (예: 50일)
df['SMA_50'] = talib.SMA(df['close'], timeperiod=50)

# 장기 이동평균선 (예: 200일)
df['SMA_200'] = talib.SMA(df['close'], timeperiod=200)

3단계: 매매 신호 생성 함수 정의

def generate_signals(df):
    """이동평균선 교차 전략에 따른 매매 신호를 생성합니다.

    Args:
        df (pd.DataFrame): 가격 데이터프레임. 'SMA_50', 'SMA_200' 컬럼이 필요합니다.

    Returns:
        pd.DataFrame: 매매 신호 (1: 매수, -1: 매도, 0: 유지)를 포함하는 데이터프레임.
    """
    signals = [0] * len(df) # 초기값 0으로 설정
    for i in range(1, len(df)):
        # 골든 크로스 발생
        if df['SMA_50'][i-1] < df['SMA_200'][i-1] and df['SMA_50'][i] > df['SMA_200'][i]:
            signals[i] = 1 # 매수 신호
        # 데드 크로스 발생
        elif df['SMA_50'][i-1] > df['SMA_200'][i-1] and df['SMA_50'][i] < df['SMA_200'][i]:
            signals[i] = -1 # 매도 신호
        else:
            signals[i] = 0 # 유지 신호
    df['signal'] = signals
    return df

df = generate_signals(df)
print(df[['close', 'SMA_50', 'SMA_200', 'signal']].tail(10))

4단계: 백테스팅 함수 정의 (간단한 예시)

def backtest(df, initial_balance=1000000):
    """생성된 매매 신호를 기반으로 간단한 백테스팅을 수행합니다.

    Args:
        df (pd.DataFrame): 가격 데이터프레임. 'close', 'signal' 컬럼이 필요합니다.
        initial_balance (int): 초기 자본. 기본값은 1000000입니다.

    Returns:
        float: 최종 자산.
    """
    balance = initial_balance
    position = False # 포지션 보유 여부

    for i in range(1, len(df)):
        if df['signal'][i] == 1 and not position:
            # 매수 신호 발생 시 매수
            buy_price = df['close'][i]
            position = True
            print(f"{df.index[i]} 매수: {buy_price}")
        elif df['signal'][i] == -1 and position:
            # 매도 신호 발생 시 매도
            sell_price = df['close'][i]
            profit = (sell_price - buy_price) / buy_price
            balance += balance * profit
            position = False
            print(f"{df.index[i]} 매도: {sell_price}, 수익률: {profit:.4f}")

    if position: # 마지막에 포지션이 남아있다면
        sell_price = df['close'][len(df)-1]
        profit = (sell_price - buy_price) / buy_price
        balance += balance * profit
        position = False
        print(f"마지막 매도: {sell_price}, 수익률: {profit:.4f}")

    print(f"최종 자산: {balance:.0f}")
    return balance

backtest(df)

위 코드는 이동평균선 교차 전략을 구현하고 백테스팅합니다. generate_signals() 함수는 매수/매도 신호를 생성합니다. backtest() 함수는 과거 데이터를 사용하여 전략의 성능을 평가합니다. 실제 자동매매 시스템에서는 거래소 API를 사용하여 주문을 실행해야 합니다. 또한, 더 정교한 리스크 관리 및 포지션 사이징 로직을 구현해야 합니다.

주의 사항: 위 코드는 예시이며, 실제 투자에 사용하기 전에 충분한 검증이 필요합니다. 이동평균선 기간, 수수료, 슬리피지 등을 고려하여 전략을 최적화해야 합니다. 백테스팅 결과는 미래 수익을 보장하지 않습니다.

위로 스크롤