주식 시장에서 내부자 거래와 뉴스는 종종 가격 움직임의 선행 지표가 될 수 있습니다. 이 에이전트는 이러한 비재무적 데이터를 분석하여 투자 결정에 반영합니다.
감성 분석 에이전트는 다음과 같은 주요 역할을 수행합니다:
이러한 분석을 통해 기업의 재무제표에는 아직 반영되지 않은 정보나 시장 심리를 파악할 수 있습니다.
감성 분석 에이전트의 코드를 단계별로 살펴보겠습니다:
def sentiment_agent(state: AgentState):
"""Analyzes market sentiment and generates trading signals for multiple tickers."""
data = state.get("data", {})
end_date = data.get("end_date")
tickers = data.get("tickers")
# Initialize sentiment analysis for each ticker
sentiment_analysis = {}
함수는 분석 상태, 종료 날짜, 분석할 종목 목록을 입력으로 받습니다. 각 종목에 대한 감성 분석 결과를 저장할 딕셔너리를 초기화합니다.
for ticker in tickers:
progress.update_status("sentiment_agent", ticker, "Fetching insider trades")
# Get the insider trades
insider_trades = get_insider_trades(
ticker=ticker,
end_date=end_date,
limit=1000,
)
progress.update_status("sentiment_agent", ticker, "Analyzing trading patterns")
# Get the signals from the insider trades
transaction_shares = pd.Series([t.transaction_shares for t in insider_trades]).dropna()
insider_signals = np.where(transaction_shares < 0, "bearish", "bullish").tolist()
각 종목에 대해 최대 1,000건의 내부자 거래 데이터를 가져옵니다. 거래 주식 수가 음수(매도)이면 "bearish" 신호로, 양수(매수)이면 "bullish" 신호로 해석합니다. 내부자들이 자사 주식을 매수하는 것은 일반적으로 긍정적인 신호로, 매도하는 것은 부정적인 신호로 간주됩니다.
progress.update_status("sentiment_agent", ticker, "Fetching company news")
# Get the company news
company_news = get_company_news(ticker, end_date, limit=100)
# Get the sentiment from the company news
sentiment = pd.Series([n.sentiment for n in company_news]).dropna()
news_signals = np.where(sentiment == "negative", "bearish",
np.where(sentiment == "positive", "bullish", "neutral")).tolist()
각 종목에 대해 최대 100개의 뉴스 기사를 가져옵니다. 기사의 감성이 "positive"면 "bullish" 신호로, "negative"면 "bearish" 신호로, 그 외에는 "neutral" 신호로 해석합니다.
progress.update_status("sentiment_agent", ticker, "Combining signals")
# Combine signals from both sources with weights
insider_weight = 0.3 # 내부자 거래 가중치 (30%)
news_weight = 0.7 # 뉴스 기사 가중치 (70%)
# Calculate weighted signal counts
bullish_signals = (
insider_signals.count("bullish") * insider_weight +
news_signals.count("bullish") * news_weight
)
bearish_signals = (
insider_signals.count("bearish") * insider_weight +
news_signals.count("bearish") * news_weight
)
여기서 중요한 부분은 두 정보 소스에 서로 다른 가중치를 적용한다는 것입니다. 뉴스 기사에 70%, 내부자 거래에 30%의 가중치가 부여됩니다. 이는 뉴스가 더 풍부하고 다양한 관점을 제공하지만, 내부자 거래는 더 직접적인 정보일 수 있다는 균형을 반영합니다.
if bullish_signals > bearish_signals:
overall_signal = "bullish"
elif bearish_signals > bullish_signals:
overall_signal = "bearish"
else:
overall_signal = "neutral"
# Calculate confidence level based on the weighted proportion
total_weighted_signals = len(insider_signals) * insider_weight + len(news_signals) * news_weight
confidence = 0 # Default confidence when there are no signals
if total_weighted_signals > 0:
confidence = round(max(bullish_signals, bearish_signals) / total_weighted_signals, 2) * 100
reasoning = f"Weighted Bullish signals: {bullish_signals:.1f}, Weighted Bearish signals: {bearish_signals:.1f}"
가중치가 적용된 강세 신호와 약세 신호의 개수를 비교하여 최종 신호를 결정합니다. 신뢰도는 전체 가중 신호 중에서 우세한 신호(강세 또는 약세)의 비율로 계산됩니다. 이 비율을 백분율로 표시하여 0-100 사이의 신뢰도 점수를 생성합니다.
sentiment_analysis[ticker] = {
"signal": overall_signal,
"confidence": confidence,
"reasoning": reasoning,
}
# Create the sentiment message
message = HumanMessage(
content=json.dumps(sentiment_analysis),
name="sentiment_agent",
)
# Print the reasoning if the flag is set
if state["metadata"]["show_reasoning"]:
show_agent_reasoning(sentiment_analysis, "Sentiment Analysis Agent")
# Add the signal to the analyst_signals list
state["data"]["analyst_signals"]["sentiment_agent"] = sentiment_analysis
분석 결과를 저장하고, 시스템의 다른 에이전트들이 참조할 수 있도록 상태에 추가합니다.
펀더멘털 분석과 기술적 분석이 과거와 현재의 데이터에 초점을 맞춘다면, 감성 분석은 미래의 가격 움직임을 예측하는 데 도움이 될 수 있는 선행 지표를 제공합니다:
내부자 행동: 회사 내부자들은 일반 투자자보다 회사에 대해 더 많은 정보를 가지고 있습니다. 그들의 거래 패턴은 회사의 미래 성과에 대한 통찰력을 제공할 수 있습니다.
시장 심리: 뉴스와 소셜 미디어는 투자자 심리와 시장 동향을 반영합니다. 부정적인 뉴스 캐스케이드는 종종 가격 하락의 촉매제가 되며, 긍정적인 보도는 상승 추세를 강화할 수 있습니다.
빠른 적응: 재무제표는 분기별로 갱신되지만, 뉴스와 소셜 미디어는 실시간으로 정보를 제공합니다. 이는 시장 환경의 변화에 더 빠르게 대응할 수 있게 해줍니다.
그러나 감성 분석에는 몇 가지 중요한 한계가 있습니다:
노이즈와 오판: 뉴스와 소셜 미디어에는 많은 노이즈가 있으며, 감성 분석 알고리즘이 문맥을 잘못 해석할 수 있습니다.
시장 반응 지연: 모든 뉴스가 즉시 가격에 반영되는 것은 아닙니다. 일부 정보는 시장이 소화하는 데 시간이 걸릴 수 있습니다.
역설적 움직임: 때로는 부정적인 뉴스 이후에 주가가 상승하거나 긍정적인 뉴스 이후에 하락하는 "뉴스에 팔고, 소문에 사라"는 현상이 발생합니다.
내부자 거래의 다양한 동기: 내부자 매도가 항상 부정적인 신호인 것은 아닙니다. 개인적인 자금 수요, 다양화, 세금 계획 등 다양한 이유로 발생할 수 있습니다.
감성 분석 에이전트는 내부자 거래와 뉴스 기사와 같은 비정량적 데이터 소스를 분석하여 시장 심리와 투자자 감성을 평가합니다. 이는 펀더멘털 분석과 기술적 분석을 보완하는 중요한 구성 요소로, 시장의 심리적 측면을 포착합니다.
궁극적으로, 감성 분석은 투자 결정에 있어 재무적 수치 너머의 중요한 인사이트를 제공하며, AI 헤지펀드 시스템에서 펀더멘털 분석 및 기술적 분석과 함께 포괄적인 투자 전략의 핵심 구성 요소로 작용합니다.