Alpha Vantage API에서 티커 없는 질의 처리하기

Tasker_Jang·3일 전
0

Alpha Vantage API에서 티커 없는 질의 처리하기

🔍 문제 상황

주식 정보를 제공하는 Alpha Vantage API를 활용하여 주식 재무제표 분석 기능을 개발하고 있습니다. 그런데 사용자가 티커 심볼 없이 질문을 하는 경우가 종종 발생합니다.

예를 들면:

  • "가장 최근에 성장한 기술주 분석해줘"
  • "애플 재무제표 분석해줘" (티커 AAPL 없이)
  • "요즘 핫한 주식 재무 상태는?"

하지만 Alpha Vantage API는 기본적으로 티커 심볼(AAPL, MSFT 등)을 필수로 요구합니다. 이 문제를 어떻게 해결할 수 있을까요?

🛠️ 현재 코드

현재 코드에서는 티커 심볼이 없을 때 None 또는 "unknown"을 반환하는 처리가 구현되어 있습니다.

# USFinancialStatementTool 클래스에서
def _extract_ticker(self, query):
    """티커 추출 메소드"""
    # 티커 추출 로직
    # ...
    
    # 티커가 없으면 None 반환
    return None

# 티커 없을 때 처리
def _run(self, query):
    ticker = self._extract_ticker(query)
    if not ticker:
        return "No valid ticker symbol found. Please provide a specific ticker symbol."
    # ...

# USFinancialAnalyzerNode 클래스에서
def _extract_ticker_from_result(self, text):
    """결과 텍스트에서 티커 추출"""
    # ...
    
    # 티커를 찾지 못하면 "unknown" 반환
    return {"ticker": "unknown"}

하지만 이 방식으로는 사용자에게 충분한 가이드를 제공하지 못합니다.

💡 개선 방안

1. 회사 이름에서 티커 심볼 추출

사용자가 회사 이름만 언급할 경우 이를 티커로 변환합니다.

def company_to_ticker(company_name):
    # 인기 회사 매핑 테이블
    mapping = {
        "애플": "AAPL",
        "마이크로소프트": "MSFT",
        "구글": "GOOGL",
        "아마존": "AMZN",
        "테슬라": "TSLA",
        "삼성전자": "005930",  # 한국 주식
        # ... 더 많은 매핑
    }
    
    # 대소문자 구분 없이 검색
    company_lower = company_name.lower()
    for company, ticker in mapping.items():
        if company.lower() in company_lower:
            return ticker
    
    return None

2. Alpha Vantage의 심볼 검색 API 활용

Alpha Vantage의 SYMBOL_SEARCH 함수를 활용하여 회사 이름으로 티커를 검색합니다.

def search_ticker(company_name):
    url = f"https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords={company_name}&apikey={API_KEY}"
    response = requests.get(url)
    data = response.json()
    
    if "bestMatches" in data and data["bestMatches"]:
        # 가장 연관성 높은 결과 반환
        return data["bestMatches"][0]["1. symbol"]
    
    return None

3. 사용자 친화적인 안내 메시지

티커를 찾지 못했을 때 사용자에게 도움이 될 만한 정보를 제공합니다.

def get_ticker_guidance():
    return (
        "특정 주식 티커가 필요합니다. 인기 있는 주식 티커는 다음과 같습니다:\n"
        "- AAPL: 애플\n"
        "- MSFT: 마이크로소프트\n"
        "- GOOGL: 알파벳(구글)\n"
        "- AMZN: 아마존\n"
        "- TSLA: 테슬라\n"
        "분석하고 싶은 주식의 티커를 입력해주세요."
    )

4. 통합 솔루션

위의 방법들을 결합한 통합 솔루션을 구현합니다.

def process_financial_query(query):
    # 1. 쿼리에서 티커 추출 시도
    ticker = extract_ticker(query)
    
    if ticker:
        return analyze_financial_statements(ticker)
    
    # 2. 회사 이름 추출 시도
    company_name = extract_company_name(query)
    
    if company_name:
        # 2-1. 내부 매핑 테이블 검색
        ticker = company_to_ticker(company_name)
        
        if not ticker:
            # 2-2. Alpha Vantage 심볼 검색 API 사용
            ticker = search_ticker(company_name)
        
        if ticker:
            return analyze_financial_statements(ticker)
    
    # 3. 인기 주식 제안 또는 가이드 제공
    return {
        "status": "ticker_required",
        "message": get_ticker_guidance()
    }

🔄 개선된 사용자 흐름

개선된 방식으로 다음과 같은 사용자 흐름이 가능해집니다:

  1. 사용자: "애플 재무제표 분석해줘"

    • 시스템: (내부적으로 "애플" → "AAPL" 변환)
    • 시스템: "AAPL(애플)의 재무제표 분석 결과입니다: ..."
  2. 사용자: "마이크로소프트 분석"

    • 시스템: (내부적으로 "마이크로소프트" → "MSFT" 변환)
    • 시스템: "MSFT(마이크로소프트)의 재무제표 분석 결과입니다: ..."
  3. 사용자: "좋은 투자 종목 알려줘"

    • 시스템: "특정 주식 티커가 필요합니다. 인기 있는 주식 티커는 다음과 같습니다: AAPL(애플), MSFT(마이크로소프트)..."

🚀 구현 시 고려사항

  1. 다국어 지원: 한국어/영어 회사 이름을 모두 처리할 수 있도록 매핑 테이블 확장

  2. 모호성 처리: 비슷한 이름의 회사가 여러 개일 경우(e.g. "삼성" → 삼성전자, 삼성SDI 등) 사용자에게 확인 요청

  3. 캐싱: API 호출을 최소화하기 위해 이전 검색 결과 캐싱

  4. 오류 처리: API 제한에 도달했을 때 적절한 안내 메시지 제공

  5. 사용자 피드백 활용: 자주 검색되는 회사 이름은 매핑 테이블에 추가하여 시스템 개선

📊 테스트 케이스

개선된 시스템을 위한 테스트 케이스도 추가해야 합니다:

def test_company_name_to_ticker():
    """회사 이름에서 티커 변환 테스트"""
    testcases = [
        ("애플", "AAPL"),
        ("애플 주식 어때?", "AAPL"),
        ("마이크로소프트의 재무상태는?", "MSFT"),
        ("구글과 아마존 중 어디가 더 나아?", "GOOGL"),  # 첫 번째 매칭
        ("없는회사", None)
    ]
    
    for company, expected in testcases:
        result = company_to_ticker(company)
        self.assertEqual(result, expected, f"Company: {company}")

def test_symbol_search_api():
    """심볼 검색 API 테스트"""
    with patch('requests.get') as mock_get:
        mock_response = MagicMock()
        mock_response.status_code = 200
        mock_response.json.return_value = {
            "bestMatches": [
                {
                    "1. symbol": "AAPL",
                    "2. name": "Apple Inc",
                    "3. type": "Equity",
                    "4. region": "United States"
                }
            ]
        }
        mock_get.return_value = mock_response
        
        result = search_ticker("Apple")
        self.assertEqual(result, "AAPL")

🌟 결론

티커 심볼 없는 질의도 사용자 친화적으로 처리하면 금융 분석 시스템의 사용성이 크게 향상됩니다. 회사 이름을 티커로 변환하고, 인기 있는 주식을 추천하며, 명확한 가이드를 제공함으로써 사용자 경험을 개선할 수 있습니다.

이러한 접근법은 Alpha Vantage API뿐만 아니라 다른 금융 API를 사용할 때도 적용할 수 있는 범용적인 방법입니다.

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

0개의 댓글

관련 채용 정보