목표는
1. 야후 파이낸스를 이용해서 기술적인 계산하기
2. 네이버 증권 실시간 뉴스 이용해서 종목관련 최신뉴스 가져오기
[1] 야후 파이낸스를 이용해서 기술적인 계산하기
야후 파이낸스 라이브러리를 설치하고 임포트해준다.
터미널을 열고 라이브러리를 설치한다. 순서대로 야후파이낸스 설치, 판다스 설치, 판다스타 설치명령어이다.
pip install yfinance
pip install pandas
pip install pandas-ta
판다스(Pandas)란?
판다스(Pandas)는 파이썬 데이터 분석 라이브러리 중 하나로, 데이터 조작, 정제, 분석, 시각화 등을 위한 다양한 기능을 제공합니다. 판다스는 시리즈(Series)와 데이터프레임(DataFrame)이라는 자료형을 이용하여 데이터를 처리합니다.
Pandas는 (데이터 다루는 엑셀 역할)
종목의 종가 시가 등등 정보를 처리 하고 차트 분석 하려면 데이터 분석이 필요하다.
파이썬 판다스 라이브러리를 설치해준다.
그리고 주식 기술적 분석을 해주는 라이브러리인 pandas-ta도 사용하겠다
1. pandas-ta가 뭔가요?
한마디로 **"주식 보조지표 자동 계산기"**입니다.
주식 차트 보면 이동평균선(일명 이평선), RSI, 볼린저밴드, MACD 같은 선들이 그려져 있죠? 우리가 눈으로 볼 때는 그냥 선이지만, 컴퓨터(봇)한테는 수학 공식으로 계산된 숫자가 필요합니다.
2. 왜 필요한가요?
봇한테 "RSI가 30 이하일 때 매수해!"라고 시키려면, 현재 RSI가 몇인지 계산해야 합니다.
- 이 라이브러리가 없으면: RSI 구하는 복잡한 수학 공식을 직접 코드로 다 짜야 합니다. (수십 줄 필요)
- 이 라이브러리가 있으면: df.ta.rsi() 딱 한 줄이면 계산 끝납니다.
즉, "복잡한 수학 계산 안 하고 편하게 전략 짜려고" 쓰는 겁니다.
https://antsinvest.tistory.com/33#google_vignette
python 파이썬으로 주식 차트 분석 / 기술적 지표 사용하기 : pandas-ta
2024.03.29 - [주가 예측 모델/관련 package] - python 파이썬으로 주식 차트 분석 / 기술적 지표 사용하기 : TA-Lib python 파이썬으로 주식 차트 분석 / 기술적 지표 사용하기 : TA-Lib이번엔 앞서 yfinance, financ
antsinvest.tistory.com
이블로그 글을 참고했다.
이 외에도 MACD, RSI, 일목균형, 스토캐스틱, 블린저밴드, 각종 오실레이터 등 증권사에서 제공하는 차팅 툴을 모두 지원하며, 이를 세부적으로 조정할 수도 있다.
라고 한다....
주식 기술적 분석은 내가 잘 모르므로 간단히 지표를 계산해서 제미나이한테 넘겨주고 주식을 살지 말지 판단을 맡기겠다.

야후 파이낸스에 티커번호를 주고 데이터를 다운로드 한다.
그후 보조지표를 계산한다.
[2] 네이버 증권 뉴스 가져오기

네이버 뉴스를 가져오는 url은 바뀔수도 있다...
봇인지 프로그램인지 확인하고 막는거 있는듯 함...
그래서 헤더에 메인에서 들어간척 하는 코드를 넣어줌
import yfinance as yf
import pandas as pd
import pandas_ta as ta
from ai_brain import get_ai_decision
import sys
import requests
from bs4 import BeautifulSoup
import json
import re
# 한글 깨짐 방지
sys.stdout.reconfigure(encoding='utf-8')
# =========================================================
# ⚙️ 설정 (여기를 수정하여 종목 변경)
# =========================================================
TICKER = "000660.KS" # 야후 파이낸스용 (SK하이닉스)
NAVER_CODE = "000660" # 네이버 파이낸스용
STOCK_NAME = "SK하이닉스"
print("\n" + "="*60)
print(f"🚀 [{STOCK_NAME}] 하이브리드 자동매매 시스템 가동")
print("="*60)
# =========================================================
# 1. ⚡ 네이버 실시간 시세 (API)
# =========================================================
def get_naver_realtime(code):
# --- [시도 1] 모바일 앱 API ---
try:
print(f"[Step 2] 실시간 시세 조회 중 (Method A: Mobile API)...")
url = f"https://m.stock.naver.com/api/stock/{code}/basic"
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36',
'Referer': 'https://m.stock.naver.com/'
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
data = response.json()
# ClosePrice가 없으면 실패로 간주
if 'closePrice' not in data:
raise Exception("closePrice key missing")
return {
'price': int(data['closePrice'].replace(',', '')),
'rate': float(data['fluctuationsRatio']),
# .get()을 써서 키가 없어도 에러 안 나고 0으로 처리
'vol': int(data.get('accumulatedTradingVolume', '0').replace(',', '')),
'status': 'OPEN', # API는 장 상태를 명확히 안 줄 때가 많아 일단 OPEN
'method': 'Mobile API'
}
except Exception as e:
print(f" ⚠️ Method A 실패 ({e}), Method B로 전환합니다.")
# --- [시도 2] PC 웹 HTML 파싱 (최후의 수단) ---
try:
print(f" 🔄 Method B 시도 중 (HTML Scraping)...")
url = f"https://finance.naver.com/item/main.naver?code={code}"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36'}
response = requests.get(url, headers=headers, timeout=5)
soup = BeautifulSoup(response.text, 'html.parser')
no_today = soup.select_one('.no_today .blind')
if no_today:
price = int(no_today.text.replace(',', ''))
# 등락률 안전하게 추출
rate = 0.0
exday = soup.select_one('.no_exday')
if exday:
rate_text = exday.get_text().strip()
match = re.search(r'([+-]?\d+\.\d+)%', rate_text)
if match:
rate = float(match.group(1))
if soup.select_one('.ico_down') and rate > 0:
rate = -rate
return {
'price': price,
'rate': rate,
'vol': 0, # HTML에서 거래량 긁기 힘들면 그냥 0
'status': 'OPEN', # ★ 중요: 에러 방지용 키 추가
'method': 'HTML Parsing'
}
except Exception as e:
print(f" ❌ 모든 방법 실패: {e}")
return None
# =========================================================
# 2. 📰 네이버 뉴스 크롤링
# =========================================================
def get_naver_news(code):
print(f"[Step 3] 네이버 뉴스 수집 중...")
url = f"https://finance.naver.com/item/news_news.naver?code={code}"
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': f'https://finance.naver.com/item/main.naver?code={code}'
}
try:
response = requests.get(url, headers=headers)
response.encoding = 'euc-kr' # 인코딩 필수
soup = BeautifulSoup(response.text, 'html.parser')
# 선생님이 찾으신 태그 경로
titles = soup.select('a.tit')
news_list = []
for link in titles[:5]: # 상위 5개만
title = link.get_text().strip()
if title:
news_list.append(title)
return news_list
except Exception as e:
print(f" ⚠️ 뉴스 수집 실패: {e}")
return []
# =========================================================
# 🚀 메인 로직 실행
# =========================================================
# [Step 1] 야후 파이낸스 차트 데이터 (기술적 분석용)
print(f"\n[Step 1] 과거 차트 데이터 분석 ({TICKER})...")
try:
df = yf.download(TICKER, period="6mo", progress=False, auto_adjust=True)
if df.empty:
print("❌ 데이터 다운로드 실패 (빈 데이터)")
exit()
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
# 보조지표 계산
df['RSI'] = df.ta.rsi(length=14)
df['SMA5'] = df.ta.sma(length=5)
df['SMA20'] = df.ta.sma(length=20)
# 볼린저밴드
bbands = df.ta.bbands(length=20, std=2)
if bbands is not None:
df = pd.concat([df, bbands], axis=1)
lower_cols = [c for c in bbands.columns if c.startswith('BBL')]
if lower_cols:
df['BB_LOWER'] = df[lower_cols[0]]
print(f" ✅ 차트 데이터 및 보조지표 계산 완료")
except Exception as e:
print(f"❌ 차트 처리 중 오류: {e}")
exit()
# [Step 2 & 3] 실시간 데이터 및 뉴스 수집 (함수 호출)
realtime_data = get_naver_realtime(NAVER_CODE)
news_titles = get_naver_news(NAVER_CODE)
# [Step 4] AI에게 보낼 통합 데이터 구성
# 여기가 제일 중요합니다. AI에게 차트+실시간+뉴스를 섞어서 줍니다.
final_context = ""
# 1. 실시간 시세 정보 입력
if realtime_data:
print(f" ⚡ 실시간 현재가: {realtime_data['price']:,}원 ({realtime_data['rate']}%)")
final_context += (
f"[실시간 시장 데이터 (최우선 기준)]\n"
f"현재가: {realtime_data['price']}원\n"
f"등락률: {realtime_data['rate']}%\n"
f"거래량: {realtime_data['vol']}\n"
f"상태: {realtime_data['status']}\n"
f"주의: 위 데이터는 1초 단위 실시간 데이터입니다. 차트의 종가보다 이것을 우선하세요.\n\n"
)
else:
print(" ⚠️ 실시간 데이터를 가져오지 못해 차트 종가로 대체합니다.")
final_context += "[실시간 데이터 조회 실패. 차트 데이터만 참고하세요.]\n\n"
# 2. 뉴스 정보 입력
final_context += "[최신 뉴스 헤드라인]\n"
if news_titles:
for t in news_titles:
final_context += f"- {t}\n"
print(f" 📰 {t}")
else:
final_context += "특이 뉴스 없음.\n"
# [Step 5] AI 분석 요청
print(f"\n[Step 4] Gemini AI 종합 판단 요청...")
ai_result = get_ai_decision(df, final_context)
# [Step 6] 최종 결과 출력
print("\n" + "="*60)
print(f"🤖 AI {STOCK_NAME} 분석 리포트")
print("="*60)
if realtime_data:
print(f"💰 기 준 가 : {realtime_data['price']:,}원 (실시간)")
else:
print(f"💰 기 준 가 : {df['Close'].iloc[-1]:,.0f}원 (종가)")
print("-" * 60)
print(f"📊 결 과 : {ai_result.get('decision', 'ERROR').upper()}")
print(f"📝 상세이유 : {ai_result.get('reason', '이유 없음')}")
print("="*60)
결과!!!
============================================================
🚀 [SK하이닉스] 하이브리드 자동매매 시스템 가동
============================================================
[Step 1] 과거 차트 데이터 분석 (000660.KS)...
✅ 차트 데이터 및 보조지표 계산 완료
[Step 2] 실시간 시세 조회 중 (Method A: Mobile API)...
[Step 3] 네이버 뉴스 수집 중...
⚡ 실시간 현재가: 860,000원 (2.26%)
📰 역대 최고 실적 경신한 SK하이닉스
📰 삼성, 반도체 판도 뒤집는다…"올해 HBM 매출 3배"
📰 SK, HBM4도 압도적 주도…"단기간 추월 불가능"
📰 SK하이닉스 추가배당 결정 이튿날 삼성전자, 5년 만에 특별배당 발표
[Step 4] Gemini AI 종합 판단 요청...
[🔍 AI_BRAIN] AI 분석 모듈 진입
[🔍 AI_BRAIN] 마지막 데이터 행 확인:
Close 8.570000e+05
High 8.840000e+05
Low 8.190000e+05
Open 8.790000e+05
Volume 5.434346e+06
RSI 7.663345e+01
SMA5 8.002000e+05
SMA20 7.539000e+05
BBL_20_2.0_2.0 6.718425e+05
BBM_20_2.0_2.0 7.539000e+05
BBU_20_2.0_2.0 8.359575e+05
BBB_20_2.0_2.0 2.176880e+01
BBP_20_2.0_2.0 1.128218e+00
BB_LOWER 6.718425e+05
Name: 2026-01-29 00:00:00, dtype: float64
[🔍 AI_BRAIN] AI에게 보낼 차트 요약 데이터:
- 현재가: 857000.0
- RSI: 76.63
- 5일선: 800200
- 20일선: 753900
[🔍 AI_BRAIN] Gemini에게 질문 전송 중...
[🔍 AI_BRAIN] 📩 Gemini 원본 응답:
```json
{
"decision": "buy",
"reason": "역대 최고 실적 및 HBM4 압도적 주도권으로 강력한 상승 추세 지속."
}
```
[🔍 AI_BRAIN] JSON 변환 성공!
============================================================
🤖 AI SK하이닉스 분석 리포트
============================================================
💰 기 준 가 : 860,000원 (실시간)
------------------------------------------------------------
📊 결 과 : BUY
📝 상세이유 : 역대 최고 실적 및 HBM4 압도적 주도권으로 강력한 상승 추세 지속.
============================================================
종료 코드 0(으)로 완료된 프로세스
'프로젝트 > 개인프로젝트' 카테고리의 다른 글
| 7. 주식 살까?말까? AI가 결정해주는 프로그램 - 전략결정(변동성돌파, 골든크로스, 볼린저밴드) (0) | 2026.02.25 |
|---|---|
| 6. 주식 살까?말까? AI가 결정해주는 프로그램 - 단타 후기... (0) | 2026.02.13 |
| 4. 주식 살까?말까? AI가 결정해주는 프로그램-파이썬 제미나이 연결 (0) | 2026.01.29 |
| 3. 주식 살까?말까? AI가 결정해주는 프로그램만들기 - Gemini API발급 (1) | 2026.01.29 |
| 2. 주식 살까?말까? AI가 결정해주는 프로그램 만들기 - AI 모델 비교 (0) | 2026.01.29 |
댓글