-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathai_analyst.py
More file actions
148 lines (121 loc) · 5.2 KB
/
Copy pathai_analyst.py
File metadata and controls
148 lines (121 loc) · 5.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
"""AI 시황 분석 모듈 - Gemini API를 사용해 메모 섹션에 AI 코멘트를 자동 생성합니다.
Usage:
from ai_analyst import generate_ai_commentary
comment = generate_ai_commentary(data, date)
API 키 설정 방법 (우선순위 순):
1. 프로젝트 루트의 .env 파일에 GEMINI_API_KEY=your_key_here 작성 (권장)
2. 시스템 환경변수로 GEMINI_API_KEY 설정
3. generate_ai_commentary(data, date, api_key="your_key") 로 직접 전달
.env 파일은 .gitignore에 등록되어 있어 GitHub에 올라가지 않습니다.
"""
from __future__ import annotations
import os
from pathlib import Path
from typing import Optional
# ---------------------------------------------------------------------------
# .env 파일 로드 (python-dotenv가 설치된 경우 자동으로 .env를 읽음)
# ---------------------------------------------------------------------------
try:
from dotenv import load_dotenv
# 스크립트 위치 기준으로 .env 탐색 (없어도 에러 없이 패스)
_env_path = Path(__file__).resolve().parent / ".env"
load_dotenv(dotenv_path=_env_path, override=False)
except ImportError:
pass # python-dotenv 미설치 시 환경변수만 사용
GEMINI_MODEL = "gemini-2.5-flash" # GA 모델, 빠르고 무료 플랜 사용 가능
def _build_market_summary(data: dict) -> str:
"""시장 데이터를 Gemini에 넣을 텍스트 요약으로 변환합니다."""
lines = []
# 미국 시장
us = data.get("us_indices", {})
for name, d in us.items():
if d:
sign = "+" if d["change_pct"] >= 0 else ""
lines.append(f"미국 {name}: {d['price']:,.2f} ({sign}{d['change_pct']:.2f}%)")
# 한국 시장
kr = data.get("korean_indices", {})
for name, d in kr.items():
if d:
sign = "+" if d["change_pct"] >= 0 else ""
lines.append(f"한국 {name}: {d['price']:,.2f} ({sign}{d['change_pct']:.2f}%)")
# 환율
fx = data.get("fx", {})
for name, d in fx.items():
if d:
sign = "+" if d["change_pct"] >= 0 else ""
lines.append(f"{name}: {d['price']:,.2f} ({sign}{d['change_pct']:.2f}%)")
# 원자재
comm = data.get("commodities", {})
for name, d in comm.items():
if d:
sign = "+" if d["change_pct"] >= 0 else ""
lines.append(f"{name}: ${d['price']:,.2f} ({sign}{d['change_pct']:.2f}%)")
# 비트코인
crypto = data.get("crypto", {})
for name, d in crypto.items():
if d:
sign = "+" if d["change_pct"] >= 0 else ""
lines.append(f"{name}: ${d['price']:,.2f} ({sign}{d['change_pct']:.2f}%)")
# VIX
vix = data.get("volatility", {})
for name, d in vix.items():
if d:
lines.append(f"VIX(변동성): {d['price']:,.2f}")
# 투자자 수급 (있는 경우)
flows = data.get("investor_flows")
if flows:
for investor, flow in flows.items():
net_100m = flow["net"] / 100_000_000
sign = "+" if net_100m >= 0 else ""
lines.append(f"투자자 수급 {investor}: 순매수 {sign}{net_100m:,.0f}억원")
return "\n".join(lines)
def generate_ai_commentary(
data: dict,
date: str,
api_key: Optional[str] = None,
) -> str:
"""시장 데이터를 바탕으로 Gemini API로 AI 시황 코멘트를 생성합니다.
Args:
data: fetch_all_data()의 반환값
date: 날짜 문자열 (YYYY-MM-DD)
api_key: Gemini API 키 직접 전달 (없으면 환경변수 / .env 파일 사용)
Returns:
AI가 작성한 한국어 시황 코멘트 문자열.
API 키 미설정 또는 오류 시 안내 메시지 반환.
"""
# API 키 우선순위: 직접 전달 > 환경변수(dotenv 로드 후)
key = api_key or os.environ.get("GEMINI_API_KEY", "")
if not key:
return (
"_AI 코멘트: GEMINI_API_KEY가 설정되지 않았습니다. "
"프로젝트 루트에 .env 파일을 만들고 "
"`GEMINI_API_KEY=your_key_here` 를 추가하세요._"
)
try:
from google import genai # pip install google-genai
except ImportError:
return (
"_AI 코멘트: google-genai 패키지가 설치되지 않았습니다. "
"`pip install google-genai` 를 실행하세요._"
)
market_summary = _build_market_summary(data)
prompt = f"""당신은 한국 주식 모니터링 시스템의 AI 에이전트입니다.
아래 {date} 글로벌 & 한국 시장 데이터를 바탕으로, 한국어로 짧은 시황 코멘트를 작성해주세요.
조건:
- 200자 이내로 작성 (마크다운 메모 스타일)
- 주요 시장 동향과 리스크 요인 1~3개를 간결하게 요약
- 투자 팁(TIP)이나 주의사항이 있다면 하나 더 추가
- 투자 권유는 하지 말 것
- 업무에만 집중 (매력적인 인사말 불필요)
시장 데이터:
{market_summary}
"""
try:
client = genai.Client(api_key=key)
response = client.models.generate_content(
model=GEMINI_MODEL,
contents=prompt,
)
return response.text.strip()
except Exception as e:
return f"_AI 코멘트 생성 실패: {e}_"