3.8.2.2. 매매 내역 검토 및 분석

매매 내역은 백테스팅 결과 분석의 중요한 부분입니다. 이는 전략의 실제 작동 방식을 이해하는 데 필수적입니다. 각 거래의 세부 정보를 검토하여 전략의 강점과 약점을 파악합니다. 이 정보를 바탕으로 전략을 개선하고, 위험 요소를 줄일 수 있습니다.

매매 기록 데이터 확보 및 준비

매매 내역 검토의 첫 단계는 필요한 데이터를 확보하는 것입니다. 백테스팅 시스템은 각 거래에 대한 상세 정보를 기록해야 합니다. 여기에는 진입 시점, 진입 가격, 청산 시점, 청산 가격 등이 포함됩니다. 또한, 거래량, 수수료, 슬리피지 등도 기록해야 합니다. 확보된 데이터는 분석하기 쉬운 형태로 준비해야 합니다. 일반적으로 Pandas DataFrame을 사용합니다.

필수 데이터:

  • 진입 시점 (날짜 및 시간)
  • 진입 가격
  • 진입 수량
  • 청산 시점 (날짜 및 시간)
  • 청산 가격
  • 청산 수량
  • 거래 유형 (매수/매도)
  • 수수료
  • 슬리피지 (있는 경우)

데이터 준비 예시:

import pandas as pd

# 가상 매매 내역 데이터 (예시)
data = {
    '진입 시점': ['2024-10-26 09:00:00', '2024-10-26 12:00:00', '2024-10-26 15:00:00', '2024-10-26 18:00:00'],
    '진입 가격': [30000, 30500, 31000, 30800],
    '진입 수량': [0.1, 0.1, 0.1, 0.1],
    '청산 시점': ['2024-10-26 11:00:00', '2024-10-26 14:00:00', '2024-10-26 17:00:00', '2024-10-26 20:00:00'],
    '청산 가격': [30200, 30800, 30500, 31000],
    '청산 수량': [0.1, 0.1, 0.1, 0.1],
    '거래 유형': ['매수', '매수', '매수', '매수'],
    '수수료': [1.5, 1.525, 1.55, 1.54],
    '슬리피지': [0, 0, 0, 0]
}

# Pandas DataFrame 생성
df = pd.DataFrame(data)

# '진입 시점' 및 '청산 시점' 컬럼을 datetime 형식으로 변환
df['진입 시점'] = pd.to_datetime(df['진입 시점'])
df['청산 시점'] = pd.to_datetime(df['청산 시점'])

print(df)

거래별 성과 분석

각 거래의 수익과 손실을 계산하고 분석합니다. 총 수익, 총 손실, 평균 수익, 평균 손실 등을 계산합니다. 수익 거래와 손실 거래의 특징을 비교 분석합니다. 특정 시간대, 특정 시장 상황에서 발생하는 패턴을 파악합니다.

계산 예시:

# 수익 계산 함수
def calculate_profit(row):
    if row['거래 유형'] == '매수':
        profit = (row['청산 가격'] - row['진입 가격']) * row['진입 수량'] - row['수수료']
    else: # 매도
        profit = (row['진입 가격'] - row['청산 가격']) * row['진입 수량'] - row['수수료']
    return profit

# '수익' 컬럼 추가
df['수익'] = df.apply(calculate_profit, axis=1)

# 총 수익 계산
total_profit = df['수익'].sum()
print(f"총 수익: {total_profit:.2f}")

# 수익 거래와 손실 거래 분리
profit_trades = df[df['수익'] > 0]
loss_trades = df[df['수익'] <= 0]

# 평균 수익 및 평균 손실 계산
avg_profit = profit_trades['수익'].mean()
avg_loss = loss_trades['수익'].mean()

print(f"평균 수익: {avg_profit:.2f}")
print(f"평균 손실: {avg_loss:.2f}")

시간대별 성과 분석

시간대별로 거래를 분류하고 성과를 분석합니다. 특정 시간대에 수익이 집중되는지, 손실이 발생하는지 확인합니다. 시간대별 변동성, 거래량 등을 함께 고려합니다. 시간대별 특성에 맞는 전략을 개발하거나, 특정 시간대를 피하는 전략을 고려할 수 있습니다.

분석 예시:

# 시간대 추출
df['진입 시간대'] = df['진입 시점'].dt.hour

# 시간대별 수익 계산
profit_by_hour = df.groupby('진입 시간대')['수익'].sum()
print(profit_by_hour)

# 시각화 (선택 사항)
import matplotlib.pyplot as plt
profit_by_hour.plot(kind='bar')
plt.xlabel("진입 시간대")
plt.ylabel("수익")
plt.title("시간대별 수익")
plt.show()

시장 상황별 성과 분석

시장 상황에 따라 거래를 분류하고 성과를 분석합니다. 상승장, 하락장, 횡보장 등 시장 상황을 구분합니다. 각 시장 상황에서 전략의 성과를 비교 분석합니다. 특정 시장 상황에 취약한 부분을 파악하고 개선합니다.

분석 예시:

시장 상황을 정의하는 것은 분석가의 몫입니다. 이동평균선, 추세선 등을 활용할 수 있습니다. 여기서는 간단하게 가격 상승/하락 여부로 구분합니다.

# 가격 변화에 따른 시장 상황 분류 (예시)
df['가격 변화'] = df['진입 가격'].diff()
df['시장 상황'] = df['가격 변화'].apply(lambda x: '상승장' if x > 0 else ('하락장' if x < 0 else '횡보장'))

# 시장 상황별 수익 계산
profit_by_market_condition = df.groupby('시장 상황')['수익'].sum()
print(profit_by_market_condition)

# 시각화 (선택 사항)
profit_by_market_condition.plot(kind='pie', autopct='%1.1f%%')
plt.ylabel("시장 상황")
plt.title("시장 상황별 수익")
plt.show()

패턴 분석 및 인사이트 도출

매매 내역을 종합적으로 검토하여 패턴을 분석합니다. 성공적인 거래와 실패한 거래의 공통점을 찾습니다. 전략의 강점과 약점을 명확하게 파악합니다. 발견된 인사이트를 바탕으로 전략을 개선합니다. 파라미터 최적화, 손절매 규칙 강화, 진입 조건 변경 등을 고려할 수 있습니다.

분석 예시:

  • RSI 과매수/과매도 전략에서 횡보장에서 손실이 잦다는 것을 발견했습니다.
  • 볼린저 밴드 돌파 전략에서 추세가 강한 시장에서 수익이 높다는 것을 발견했습니다.

이러한 분석 결과를 바탕으로 다음과 같은 개선 방안을 고려할 수 있습니다.

  • 횡보장을 감지하는 지표를 추가하여 RSI 전략의 진입 시점을 필터링합니다.
  • 추세 강도를 측정하는 지표를 추가하여 볼린저 밴드 전략의 포지션 크기를 조절합니다.

매매 내역 검토는 반복적인 과정입니다. 전략을 개선하고 다시 백테스팅합니다. 결과를 분석하고 또 다시 개선합니다. 이 과정을 통해 전략의 성능을 지속적으로 향상시킬 수 있습니다.

위로 스크롤