ai-hedge-fund 10) Technical Analyst Agent

Tasker_Jang·2025년 3월 18일
0

기술적 분석 에이전트: 다양한 트레이딩 전략의 앙상블

AI 헤지펀드 시스템의 핵심 구성 요소 중 하나인 기술적 분석 에이전트(Technical Analyst Agent)에 대해 살펴보겠습니다. 이 에이전트는 가격과 거래량 데이터만을 사용하여 주식의 미래 움직임을 예측하는 다양한 기술적 분석 전략을 구현하고 있습니다.

기술적 분석 에이전트의 역할

기술적 분석은 주가와 거래량의 과거 패턴을 분석하여 미래 가격 움직임을 예측하는 방법론입니다. 펀더멘털 분석이 기업의 내재 가치를 평가하는 것과 달리, 기술적 분석은 시장 심리와 가격 행동에 초점을 맞춥니다.

이 에이전트는 다음 5가지 서로 다른 기술적 분석 전략을 구현하고 있습니다:

  1. 추세 추종(Trend Following): 중장기 가격 추세를 식별하고 따라가는 전략
  2. 평균 회귀(Mean Reversion): 가격이 평균으로 회귀하는 경향을 이용하는 전략
  3. 모멘텀(Momentum): 가격의 상승/하락 추세가 지속된다는 가정을 활용하는 전략
  4. 변동성 분석(Volatility Analysis): 가격 변동성 패턴을 활용하는 전략
  5. 통계적 차익거래(Statistical Arbitrage): 가격 분포의 통계적 특성을 활용하는 전략

각 전략은 서로 다른 시장 상황에서 효과적으로 작동하며, 이들을 가중 결합하여 더 안정적인 신호를 생성합니다.

코드 구조 분석

메인 에이전트 함수

def technical_analyst_agent(state: AgentState):
    """
    Sophisticated technical analysis system that combines multiple trading strategies for multiple tickers:
    1. Trend Following
    2. Mean Reversion
    3. Momentum
    4. Volatility Analysis
    5. Statistical Arbitrage Signals
    """
    data = state["data"]
    start_date = data["start_date"]
    end_date = data["end_date"]
    tickers = data["tickers"]

    # Initialize analysis for each ticker
    technical_analysis = {}

    for ticker in tickers:
        # 가격 데이터 가져오기
        prices = get_prices(ticker=ticker, start_date=start_date, end_date=end_date)
        prices_df = prices_to_df(prices)
        
        # 다양한 전략 계산
        trend_signals = calculate_trend_signals(prices_df)
        mean_reversion_signals = calculate_mean_reversion_signals(prices_df)
        momentum_signals = calculate_momentum_signals(prices_df)
        volatility_signals = calculate_volatility_signals(prices_df)
        stat_arb_signals = calculate_stat_arb_signals(prices_df)
        
        # 전략 가중치 설정
        strategy_weights = {
            "trend": 0.25,
            "mean_reversion": 0.20,
            "momentum": 0.25,
            "volatility": 0.15,
            "stat_arb": 0.15,
        }
        
        # 신호 결합
        combined_signal = weighted_signal_combination(
            {
                "trend": trend_signals,
                "mean_reversion": mean_reversion_signals,
                "momentum": momentum_signals,
                "volatility": volatility_signals,
                "stat_arb": stat_arb_signals,
            },
            strategy_weights,
        )
        
        # 분석 결과 저장
        technical_analysis[ticker] = {
            "signal": combined_signal["signal"],
            "confidence": round(combined_signal["confidence"] * 100),
            "strategy_signals": {
                # 각 전략별 신호 및 지표들
            }
        }

이 함수는 각 주식 종목에 대해 다음 작업을 수행합니다:

  1. 지정된 기간의 가격 데이터 수집
  2. 5가지 기술적 분석 전략 적용
  3. 가중치를 적용하여 전략 결합
  4. 종합 분석 결과 생성

신호 결합 메커니즘

가장 중요한 부분 중 하나는 서로 다른 전략의 신호를 어떻게 결합하는지입니다:

def weighted_signal_combination(signals, weights):
    """
    Combines multiple trading signals using a weighted approach
    """
    # Convert signals to numeric values
    signal_values = {"bullish": 1, "neutral": 0, "bearish": -1}

    weighted_sum = 0
    total_confidence = 0

    for strategy, signal in signals.items():
        numeric_signal = signal_values[signal["signal"]]
        weight = weights[strategy]
        confidence = signal["confidence"]

        weighted_sum += numeric_signal * weight * confidence
        total_confidence += weight * confidence

    # Normalize the weighted sum
    if total_confidence > 0:
        final_score = weighted_sum / total_confidence
    else:
        final_score = 0

    # Convert back to signal
    if final_score > 0.2:
        signal = "bullish"
    elif final_score < -0.2:
        signal = "bearish"
    else:
        signal = "neutral"

    return {"signal": signal, "confidence": abs(final_score)}

이 함수는:
1. 각 전략의 신호를 수치값으로 변환 (bullish=1, neutral=0, bearish=-1)
2. 각 신호에 전략 가중치와 신뢰도를 곱함
3. 가중 평균을 계산하여 최종 점수 도출
4. 점수를 다시 신호로 변환 (0.2 초과면 bullish, -0.2 미만이면 bearish, 그 사이는 neutral)

이제 각 전략을 자세히 살펴보겠습니다.

주요 기술적 분석 전략

1. 추세 추종 전략

추세 추종 전략은 가격의 중장기 방향성을 식별하고 그 방향으로 거래하는 전략입니다.

def calculate_trend_signals(prices_df):
    """
    Advanced trend following strategy using multiple timeframes and indicators
    """
    # 여러 기간의 지수이동평균선(EMA) 계산
    ema_8 = calculate_ema(prices_df, 8)
    ema_21 = calculate_ema(prices_df, 21)
    ema_55 = calculate_ema(prices_df, 55)

    # 추세 강도를 측정하는 ADX 계산
    adx = calculate_adx(prices_df, 14)

    # 추세 방향 및 강도 결정
    short_trend = ema_8 > ema_21
    medium_trend = ema_21 > ema_55

    # 신호 결합
    trend_strength = adx["adx"].iloc[-1] / 100.0

    if short_trend.iloc[-1] and medium_trend.iloc[-1]:
        signal = "bullish"
        confidence = trend_strength
    elif not short_trend.iloc[-1] and not medium_trend.iloc[-1]:
        signal = "bearish"
        confidence = trend_strength
    else:
        signal = "neutral"
        confidence = 0.5

이 전략은:

  • 다양한 기간(8일, 21일, 55일)의 EMA를 사용하여 단기 및 중기 추세 식별
  • ADX(Average Directional Index)를 사용하여 추세 강도 측정
  • 단기 및 중기 추세가 모두 상승이면 강세 신호, 모두 하락이면 약세 신호

2. 평균 회귀 전략

평균 회귀 전략은 가격이 장기 평균으로 회귀하는 경향을 활용합니다.

def calculate_mean_reversion_signals(prices_df):
    """
    Mean reversion strategy using statistical measures and Bollinger Bands
    """
    # 이동평균 대비 가격의 z-점수 계산
    ma_50 = prices_df["close"].rolling(window=50).mean()
    std_50 = prices_df["close"].rolling(window=50).std()
    z_score = (prices_df["close"] - ma_50) / std_50

    # 볼린저 밴드 계산
    bb_upper, bb_lower = calculate_bollinger_bands(prices_df)

    # 상대강도지수(RSI) 계산
    rsi_14 = calculate_rsi(prices_df, 14)
    rsi_28 = calculate_rsi(prices_df, 28)

    # 볼린저 밴드 내 가격 위치 계산
    price_vs_bb = (prices_df["close"].iloc[-1] - bb_lower.iloc[-1]) / (bb_upper.iloc[-1] - bb_lower.iloc[-1])

    # 신호 결합
    if z_score.iloc[-1] < -2 and price_vs_bb < 0.2:
        signal = "bullish"
        confidence = min(abs(z_score.iloc[-1]) / 4, 1.0)
    elif z_score.iloc[-1] > 2 and price_vs_bb > 0.8:
        signal = "bearish"
        confidence = min(abs(z_score.iloc[-1]) / 4, 1.0)
    else:
        signal = "neutral"
        confidence = 0.5

이 전략은:

  • Z-점수를 사용하여 가격이 장기 평균에서 얼마나 벗어났는지 측정
  • 볼린저 밴드를 사용하여 가격의 상대적 위치 파악
  • RSI를 사용하여 과매수/과매도 상태 확인
  • 가격이 평균보다 크게 낮고 볼린저 밴드 하단에 가까우면 강세 신호, 그 반대는 약세 신호

3. 모멘텀 전략

모멘텀 전략은 가격의 상승/하락 추세가 지속된다는 가정을 활용합니다.

def calculate_momentum_signals(prices_df):
    """
    Multi-factor momentum strategy
    """
    # 가격 모멘텀 계산
    returns = prices_df["close"].pct_change()
    mom_1m = returns.rolling(21).sum()  # 1개월
    mom_3m = returns.rolling(63).sum()  # 3개월
    mom_6m = returns.rolling(126).sum()  # 6개월

    # 거래량 모멘텀 계산
    volume_ma = prices_df["volume"].rolling(21).mean()
    volume_momentum = prices_df["volume"] / volume_ma

    # 모멘텀 점수 계산 (단기, 중기, 장기 가중 평균)
    momentum_score = (0.4 * mom_1m + 0.3 * mom_3m + 0.3 * mom_6m).iloc[-1]

    # 거래량 확인
    volume_confirmation = volume_momentum.iloc[-1] > 1.0

    if momentum_score > 0.05 and volume_confirmation:
        signal = "bullish"
        confidence = min(abs(momentum_score) * 5, 1.0)
    elif momentum_score < -0.05 and volume_confirmation:
        signal = "bearish"
        confidence = min(abs(momentum_score) * 5, 1.0)
    else:
        signal = "neutral"
        confidence = 0.5

이 전략은:

  • 다양한 기간(1개월, 3개월, 6개월)의 수익률을 가중 평균하여 모멘텀 점수 계산
  • 거래량 확인을 통해 시그널 강화
  • 모멘텀 점수가 양수이고 거래량이 증가하면 강세 신호, 음수이고 거래량이 증가하면 약세 신호

4. 변동성 분석 전략

변동성 분석 전략은 가격 변동성의 패턴과 변화를 활용합니다.

def calculate_volatility_signals(prices_df):
    """
    Volatility-based trading strategy
    """
    # 수익률 계산
    returns = prices_df["close"].pct_change()

    # 역사적 변동성 계산 (연간화)
    hist_vol = returns.rolling(21).std() * math.sqrt(252)

    # 변동성 레짐 탐지
    vol_ma = hist_vol.rolling(63).mean()
    vol_regime = hist_vol / vol_ma

    # 변동성 평균 회귀
    vol_z_score = (hist_vol - vol_ma) / hist_vol.rolling(63).std()

    # ATR 비율
    atr = calculate_atr(prices_df)
    atr_ratio = atr / prices_df["close"]

    # 변동성 레짐 기반 신호 생성
    current_vol_regime = vol_regime.iloc[-1]
    vol_z = vol_z_score.iloc[-1]

    if current_vol_regime < 0.8 and vol_z < -1:
        signal = "bullish"  # 낮은 변동성 레짐, 확장 가능성
        confidence = min(abs(vol_z) / 3, 1.0)
    elif current_vol_regime > 1.2 and vol_z > 1:
        signal = "bearish"  # 높은 변동성 레짐, 수축 가능성
        confidence = min(abs(vol_z) / 3, 1.0)
    else:
        signal = "neutral"
        confidence = 0.5

이 전략은:

  • 역사적 변동성과 변동성의 이동평균을 계산
  • 현재 변동성 레짐(낮음/보통/높음)을 식별
  • 변동성의 Z-점수를 계산하여 극단적인 변동성 식별
  • 변동성이 낮고 감소 중이면 강세 신호(확장 가능성), 변동성이 높고 증가 중이면 약세 신호(수축 가능성)

5. 통계적 차익거래 전략

통계적 차익거래 전략은 가격 분포의 통계적 특성을 분석합니다.

def calculate_stat_arb_signals(prices_df):
    """
    Statistical arbitrage signals based on price action analysis
    """
    # 수익률 계산
    returns = prices_df["close"].pct_change()

    # 왜도와 첨도 계산
    skew = returns.rolling(63).skew()
    kurt = returns.rolling(63).kurt()

    # 허스트 지수로 평균 회귀 테스트
    hurst = calculate_hurst_exponent(prices_df["close"])

    # 통계적 특성 기반 신호 생성
    if hurst < 0.4 and skew.iloc[-1] > 1:
        signal = "bullish"
        confidence = (0.5 - hurst) * 2
    elif hurst < 0.4 and skew.iloc[-1] < -1:
        signal = "bearish"
        confidence = (0.5 - hurst) * 2
    else:
        signal = "neutral"
        confidence = 0.5

이 전략은:

  • 수익률 분포의 왜도(skewness)와 첨도(kurtosis)를 계산
  • 허스트 지수를 계산하여 시계열의 평균 회귀 경향을 측정
  • 허스트 지수가 낮고(평균 회귀 경향이 강함) 왜도가 양수이면 강세 신호, 허스트 지수가 낮고 왜도가 음수이면 약세 신호

기술적 지표 계산 함수들

이 에이전트는 다양한 기술적 지표를 계산하는 유틸리티 함수들을 포함하고 있습니다:

  1. RSI(Relative Strength Index): 과매수/과매도 상태를 식별
  2. 볼린저 밴드(Bollinger Bands): 가격 변동성을 기반으로 한 밴드
  3. EMA(Exponential Moving Average): 지수이동평균
  4. ADX(Average Directional Index): 추세의 강도를 측정
  5. ATR(Average True Range): 가격 변동성 측정
  6. 허스트 지수(Hurst Exponent): 시계열의 지속성 또는 평균 회귀 경향을 측정

이러한 지표들은 다양한 시장 상태와 특성을 포착하기 위해 사용됩니다.

기술적 분석 에이전트의 장단점

장점

  1. 다양한 시장 환경 대응: 서로 다른 전략들이 다양한 시장 환경에서 효과적
  2. 앙상블 효과: 여러 전략의 결합으로 개별 전략보다 안정적인 결과 제공
  3. 펀더멘털 독립성: 재무제표나 기업 분석 없이 작동하여 다른 분석과 상호보완
  4. 적응성: 다양한 시간대와 지표를 사용하여 시장 변화에 적응

단점

  1. 과거 데이터 의존: 과거 패턴이 미래에도 계속된다는 가정에 의존
  2. 노이즈 민감성: 단기 시장 노이즈에 민감할 수 있음
  3. 최적화 편향 가능성: 과거 데이터에 과적합될 수 있음
  4. 예측력 한계: 경제적 충격이나 기업 이벤트를 예측하지 못함

마무리

기술적 분석 에이전트는 과거 가격과 거래량 패턴을 분석하여 미래 가격 움직임을 예측하는 다양한 전략을 구현합니다. 이 에이전트는 5가지 다른 기술적 분석 접근 방식을 가중 결합하여 다양한 시장 환경에서 작동할 수 있는 종합적인 신호를 생성합니다.

이러한 기술적 분석은 펀더멘털 분석, 감성 분석, 내부자 거래 분석 등과 함께 AI 헤지펀드 시스템의 중요한 구성 요소로 작동하며, 서로 다른 시장 관점을 통합하여 더 완전한 투자 의사결정을 가능하게 합니다.

기술적 분석에는 한계가 있지만, 다른 분석 방법과 결합하면 시장에 대한 더 완전한 그림을 제공할 수 있습니다. 시장은 결국 참가자들의 행동에 의해 움직이며, 기술적 분석은 이러한 행동 패턴을 포착하는 도구입니다.

profile
터널을 지나고 있을 뿐, 길은 여전히 열려 있다.

0개의 댓글

관련 채용 정보