본문 바로가기
Python

[주식 분석 프로젝트] 9편 – 전략의 실전 적용 가능성 검토 & 체결 시뮬레이션

by ramzee 2025. 4. 30.

주식 분석 프로젝트 9편

전략의 실전 적용 가능성 검토 & 체결 시뮬레이션


📌 이번 실습 목표

  • 전략이 실제 시장에서 실행 가능한지 점검
  • 시장가/지정가/거래량 조건 등 체결 가능성 요소 분석
  • 슬리피지, 수수료 반영 후 실수익률 시뮬레이션

🔍 왜 이 과정이 필요한가?

지금까지 우리는 종가를 기준으로 매매 전략을 설계하고 평가해왔습니다. 하지만 실제 시장에서는 다음과 같은 문제들이 존재합니다:

  • 매수 시점의 가격이 생각보다 높아질 수 있음 (슬리피지)
  • 지정가 주문은 체결되지 않을 수 있음
  • 호가 단위, 거래량이 적으면 매매 지연 발생

따라서 실전 적용 전에 반드시 체결 가능성실제 수익 가능성을 검토해야 합니다.


🛠️ 슬리피지 적용한 전략 수익률 계산

시장가 매매 가정 시 체결가가 평균보다 높거나 낮게 체결된다고 가정하고, 슬리피지(0.1% 등)를 반영합니다.

def apply_slippage(df, slippage_rate=0.001):
    df = df.copy()
    df['Entry Price'] = df['Close'].shift(1) * (1 + slippage_rate * df['Position'].diff().clip(lower=0))
    df['Exit Price'] = df['Close'].shift(1) * (1 - slippage_rate * df['Position'].diff().clip(upper=0))

    df['Adjusted Return'] = 0
    for i in range(1, len(df)):
        if df['Position'].iloc[i] == 1 and df['Position'].iloc[i-1] == 0:
            entry = df['Entry Price'].iloc[i]
        elif df['Position'].iloc[i] == 0 and df['Position'].iloc[i-1] == 1:
            exit = df['Exit Price'].iloc[i]
            df.loc[df.index[i], 'Adjusted Return'] = (exit - entry) / entry

    df['Cumulative Adjusted'] = (1 + df['Adjusted Return'].fillna(0)).cumprod()
    return df

📉 거래량 기준 체결 가능성 판단

체결이 불가능할 수도 있는 조건:

  • 하루 거래량 < 10만 주 이하인 종목
  • 호가 간격이 커서 시장가 주문이 불리할 수 있는 경우

● 예시 필터링 코드

df = yf.download("005930.KS", period="1y")

if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.get_level_values(0)
df = run_strategy(df)

df = apply_slippage(df, slippage_rate=0.001)
low_volume = df[df['Volume'] < 100000]
print(f"거래량 낮은 일 수: {len(low_volume)}일")

💵 수수료 및 세금 반영

commission = 0.0015  # 총 매매 수수료 0.15%
df['After Fee Return'] = df['Adjusted Return'] - commission
df['Cumulative Net Return'] = (1 + df['After Fee Return'].fillna(0)).cumprod()

📊 시각화 예시

import matplotlib.pyplot as plt
plt.figure(figsize=(14, 6))
plt.plot(df['Cumulative Adjusted'], label='슬리피지 적용')
plt.plot(df['Cumulative Net Return'], label='슬리피지+수수료 적용')
plt.legend()
plt.grid(True)
plt.title("전략 실수익률 비교")
plt.show()


✅ 오늘의 요약

  • 실전 시장에서는 단순 백테스트보다 다양한 변수를 고려해야 함
  • 슬리피지, 거래량 부족, 수수료/세금은 수익률에 큰 영향
  • 실제 자동매매 이전 단계에서 이런 시뮬레이션은 필수