AI 헤지펀드 시스템의 핵심 구성 요소 중 하나인 기술적 분석 에이전트(Technical Analyst Agent)에 대해 살펴보겠습니다. 이 에이전트는 가격과 거래량 데이터만을 사용하여 주식의 미래 움직임을 예측하는 다양한 기술적 분석 전략을 구현하고 있습니다.
기술적 분석은 주가와 거래량의 과거 패턴을 분석하여 미래 가격 움직임을 예측하는 방법론입니다. 펀더멘털 분석이 기업의 내재 가치를 평가하는 것과 달리, 기술적 분석은 시장 심리와 가격 행동에 초점을 맞춥니다.
이 에이전트는 다음 5가지 서로 다른 기술적 분석 전략을 구현하고 있습니다:
각 전략은 서로 다른 시장 상황에서 효과적으로 작동하며, 이들을 가중 결합하여 더 안정적인 신호를 생성합니다.
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": {
# 각 전략별 신호 및 지표들
}
}
이 함수는 각 주식 종목에 대해 다음 작업을 수행합니다:
가장 중요한 부분 중 하나는 서로 다른 전략의 신호를 어떻게 결합하는지입니다:
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)
이제 각 전략을 자세히 살펴보겠습니다.
추세 추종 전략은 가격의 중장기 방향성을 식별하고 그 방향으로 거래하는 전략입니다.
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
이 전략은:
평균 회귀 전략은 가격이 장기 평균으로 회귀하는 경향을 활용합니다.
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
이 전략은:
모멘텀 전략은 가격의 상승/하락 추세가 지속된다는 가정을 활용합니다.
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
이 전략은:
변동성 분석 전략은 가격 변동성의 패턴과 변화를 활용합니다.
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
이 전략은:
통계적 차익거래 전략은 가격 분포의 통계적 특성을 분석합니다.
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
이 전략은:
이 에이전트는 다양한 기술적 지표를 계산하는 유틸리티 함수들을 포함하고 있습니다:
이러한 지표들은 다양한 시장 상태와 특성을 포착하기 위해 사용됩니다.
기술적 분석 에이전트는 과거 가격과 거래량 패턴을 분석하여 미래 가격 움직임을 예측하는 다양한 전략을 구현합니다. 이 에이전트는 5가지 다른 기술적 분석 접근 방식을 가중 결합하여 다양한 시장 환경에서 작동할 수 있는 종합적인 신호를 생성합니다.
이러한 기술적 분석은 펀더멘털 분석, 감성 분석, 내부자 거래 분석 등과 함께 AI 헤지펀드 시스템의 중요한 구성 요소로 작동하며, 서로 다른 시장 관점을 통합하여 더 완전한 투자 의사결정을 가능하게 합니다.
기술적 분석에는 한계가 있지만, 다른 분석 방법과 결합하면 시장에 대한 더 완전한 그림을 제공할 수 있습니다. 시장은 결국 참가자들의 행동에 의해 움직이며, 기술적 분석은 이러한 행동 패턴을 포착하는 도구입니다.