주식 정보를 제공하는 Alpha Vantage API를 활용하여 주식 재무제표 분석 기능을 개발하고 있습니다. 그런데 사용자가 티커 심볼 없이 질문을 하는 경우가 종종 발생합니다.
예를 들면:
하지만 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"}
하지만 이 방식으로는 사용자에게 충분한 가이드를 제공하지 못합니다.
사용자가 회사 이름만 언급할 경우 이를 티커로 변환합니다.
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
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
티커를 찾지 못했을 때 사용자에게 도움이 될 만한 정보를 제공합니다.
def get_ticker_guidance():
return (
"특정 주식 티커가 필요합니다. 인기 있는 주식 티커는 다음과 같습니다:\n"
"- AAPL: 애플\n"
"- MSFT: 마이크로소프트\n"
"- GOOGL: 알파벳(구글)\n"
"- AMZN: 아마존\n"
"- TSLA: 테슬라\n"
"분석하고 싶은 주식의 티커를 입력해주세요."
)
위의 방법들을 결합한 통합 솔루션을 구현합니다.
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()
}
개선된 방식으로 다음과 같은 사용자 흐름이 가능해집니다:
사용자: "애플 재무제표 분석해줘"
사용자: "마이크로소프트 분석"
사용자: "좋은 투자 종목 알려줘"
다국어 지원: 한국어/영어 회사 이름을 모두 처리할 수 있도록 매핑 테이블 확장
모호성 처리: 비슷한 이름의 회사가 여러 개일 경우(e.g. "삼성" → 삼성전자, 삼성SDI 등) 사용자에게 확인 요청
캐싱: API 호출을 최소화하기 위해 이전 검색 결과 캐싱
오류 처리: API 제한에 도달했을 때 적절한 안내 메시지 제공
사용자 피드백 활용: 자주 검색되는 회사 이름은 매핑 테이블에 추가하여 시스템 개선
개선된 시스템을 위한 테스트 케이스도 추가해야 합니다:
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를 사용할 때도 적용할 수 있는 범용적인 방법입니다.