강화학습 성능지표 모니터링 하기

카테고리 없음|2025. 7. 13. 15:44
반응형

1. TensorBoard 실행 및 접속

  1. 터미널(또는 PowerShell)에서 프로젝트 루트로 이동한 뒤,
  2. bash
    복사편집
    python -m tensorboard.main --logdir=./tensorboard_logs
  3. 브라우저에서 http://localhost:6006 에 접속
  4. 왼쪽 사이드바에서 SCALARS 탭을 선택하면,
    • train/episode_reward
    • train/cumulative_return
    • train/policy_loss, train/value_loss 등
    기본적으로 기록된 지표들이 그래프로 보여집니다.

2. 추가로 로깅할 커스텀 지표

현재 RewardLoggingCallback 에서 에피소드 보상을, CustomMetricsLoggingCallback 에서 cumulative_return 을 기록하도록 설정하셨는데,
훈련 평가에서 계산하는 Sharpe ratio, Max Drawdown, Accuracy 등도 TensorBoard에 남기면 더욱 편리합니다.

python
복사편집
from stable_baselines3.common.callbacks import BaseCallback class FullMetricsCallback(BaseCallback): def __init__(self, eval_env, verbose=0): super().__init__(verbose) self.eval_env = eval_env def _on_training_end(self) -> None: # 학습이 끝난 뒤 성능 지표 계산 perf = self.model.envs[0].calculate_performance_metrics(self.model, self.eval_env.envs[0].data) # TensorBoard에 기록 self.logger.record("eval/sharpe_ratio", perf["sharpe_ratio"]) self.logger.record("eval/max_drawdown", perf["max_drawdown"]) self.logger.record("eval/accuracy", perf["accuracy"]) # flush to make sure they appear immediately self.logger.dump(self.num_timesteps)
  • model.learn(..., callback=[RewardLoggingCallback(), FullMetricsCallback(eval_env)]) 처럼 주입하면,
    훈련이 끝난 시점에 eval/ 네임스페이스 아래에 커스텀 지표들이 남습니다.

3. 로그 포맷·출력 옵션 확장

만약 콘솔 출력이나 CSV 파일로도 보고 싶다면, configure 에 로그 타입을 추가할 수 있습니다.

python
복사편집
from stable_baselines3.common.logger import configure # tensorboard + stdout(console) + csv tmp_path = "./tensorboard_logs" new_logger = configure(tmp_path, ["tensorboard", "stdout", "csv"]) model.set_logger(new_logger)
  • stdout : 터미널에 실시간 지표 출력
  • csv : ./tensorboard_logs/progress.csv 에 기록

이렇게 하면 TensorBoard, 콘솔 로그, CSV 모두에 성능 지표가 남아 다양한 방식으로 분석할 수 있습니다.


4. 요약

  1. ./tensorboard_logs 에 잘 기록되니, TensorBoard로 그래프 확인
  2. BaseCallback 를 활용해 Sharpe, Drawdown, Accuracy 같은 커스텀 지표도 self.logger.record 로 남기기
  3. configure(..., ["tensorboard","stdout","csv"]) 로 콘솔/CSV 출력까지 확장

이 흐름을 적용하시면 훈련 전후, 하이퍼파라미터 변화에 따른 지표 변화를 한눈에 비교·분석하기 훨씬 수월해집니다.

 

반응형

댓글()

강화학습 모델의 성능평가 방법

AI주식자동매매|2025. 7. 13. 15:34
반응형

훈련 전·후 모델의 “성능이 정말 좋아졌는지”를 판단하려면, 단순히 “매도의견이 사라졌다” 수준이 아니라 다음의 정량적 지표들을 비교·분석해 보셔야 합니다.

1. 핵심 성능 지표

  1. 누적 수익률 (Cumulative Return)
    • 평가 구간 전체에서 에이전트가 얻은 총 보상합(또는 net_worth 변화량)
    • performance_metrics['cumulative_return'] 에 저장된 값
  2. 샤프 비율 (Sharpe Ratio)
    • (평균 수익률) ÷ (수익률의 표준편차)
    • 보상(수익) 대비 변동성(위험)을 같이 고려
    • performance_metrics['sharpe_ratio']
  3. 최대 낙폭 (Max Drawdown)
    • 최고 자산가치 고점 대비 최저 자산가치까지의 하락폭 비율
    • 큰 손실 구간이 얼마나 있었는지 파악
    • performance_metrics['max_drawdown']
  4. 정확도 (Accuracy)
    • 에이전트가 “이동 방향(익절/손절)”을 제대로 맞춘 비율
    • performance_metrics['accuracy']

이 네 가지 지표를 훈련 전, 훈련 후, 혹은 하이퍼파라미터(Optuna/Bayesian) 최적화 이전·이후 모델로 각각 계산해서 표로 비교해 보세요.


2. 지표 비교를 위한 간단한 워크플로우

  1. Baseline 기록
    • 현재 학습 로직으로 먼저 한 번 돌려서 performance_metrics 를 저장 (baseline_metrics).
  2. 변경 적용 후 재훈련
    • 학습률·스텝수·보상구조 등을 조정해서 재훈련 → new_metrics 기록.
  3. DataFrame으로 정리
  4. python
    복사편집
    import pandas as pd df = pd.DataFrame([ {'model':'baseline', **baseline_metrics}, {'model':'new', **new_metrics} ]) print(df)
  5. 비교 시각화
    • df.plot.bar(x='model', y=['cumulative_return','sharpe_ratio','max_drawdown','accuracy'])
    • 혹은 표 형태로 눈으로 빠르게 확인

3. 훈련 과정 로깅 활용

  • 이미 RewardLoggingCallback 에서 TensorBoard에 train/episode_reward, train/cumulative_return 등을 기록하도록 설정하셨으니,
    1. 터미널에서
    2. bash
      복사편집
      python -m tensorboard.main --logdir=./tensorboard_logs
    3. 브라우저에서 http://localhost:6006 접속
    4. Training → Scalars 탭에서 에피소드 리워드 곡선, cumulative return curve, 정책/가치 손실(policy_loss, value_loss) 등을 모니터링
  • 학습 곡선이 우상향하는지, 후반부에 흔들림(과적합) 없이 안정적인지를 체크하면 “학습이 잘 되고 있는지” 알 수 있습니다.

4. 검증용 데이터에 대한 평가

  • 학습 중 train_df 외에 검증용 eval_df 를 분리하셨으니,
    • 학습용 vs 평가용 지표를 각각 계산해 과적합 여부를 파악
    • 예를 들어 df_eval_metrics['sharpe_ratio'] < df_train_metrics['sharpe_ratio'] 처럼 평가 성능 하락 유무

요약

  1. 정량적 지표(누적 수익률·샤프·낙폭·정확도)를 훈련 전·후 비교
  2. TensorBoard훈련 곡선(episode_reward, loss 등)을 모니터링
  3. 학습 vs 검증 지표 차이로 과적합 여부 관찰
  4. 지표들을 표나 차트로 시각화해서 한눈에 비교

이 흐름을 통해 “매도의견이 없어졌다”가 아니라, “누적 수익률 +24% → +30%, 샤프 0.8 → 1.2, 최대 낙폭 15% → 10%, 정확도 52% → 60%” 와 같은 구체적 개선 수치를 얻을 수 있습니다.

 

반응형

댓글()

NewsAPI.org에서 미국, 한국 주식시황 및 주요 관심 Category 뉴스 Summary하기

AI주식자동매매|2025. 7. 4. 17:12
반응형

파이썬 프로그램 로직 분석 문서

1. 프로그램 개요

이 문서는 make_summary.py 파이썬 스크립트의 내부 로직과 구조를 설명합니다. 이 스크립트는 NewsAPI.org를 활용하여 미국 및 한국 주식 시장과 관련된 주요 뉴스 기사를 수집하고, 수집된 기사들을 OpenAI의 o4-mini 모델을 사용하여 요약합니다. 최종적으로 요약된 내용은 JSON 형식으로 저장되며, 필요에 따라 외부 백엔드 API로 업로드될 수 있습니다.

주요 기능:

뉴스 수집: NewsAPI를 통해 비즈니스 헤드라인 및 특정 키워드(경제 지표, AI 소프트웨어, AI 반도체, 양자 컴퓨팅, 항공우주, 소형 원전, 스테이블 코인 등)와 관련된 뉴스 기사를 수집합니다.
기사 내용 보완: 수집된 기사 중 이미지 URL이 없거나 스니펫이 불완전한 경우, 웹 크롤링을 통해 이미지 및 본문 내용을 보완합니다.
AI 기반 요약: OpenAI 모델을 사용하여 수집된 뉴스 기사들을 종합적으로 분석하고, 미국 또는 한국 시장 동향 및 각 분야별 주요 소식을 요약합니다. 요약 시 호재 및 악재 종목 심볼(또는 종목 코드)을 식별하여 포함합니다.
JSON 저장: 요약된 결과를 구조화된 JSON 파일로 로컬에 저장합니다.
백엔드 연동: (선택 사항) 생성된 JSON 요약 파일을 외부 백엔드 서버로 업로드하거나, 추천 시스템을 초기화하는 기능을 포함합니다.

사용 목적:

이 스크립트는 금융 시장 분석가, 투자자 또는 관련 분야 연구자들이 매일 업데이트되는 뉴스 기사를 효율적으로 요약하고 분석하는 데 도움을 주기 위해 설계되었습니다. 자동화된 뉴스 수집 및 AI 요약 기능을 통해 시장 동향을 빠르게 파악하고 의사 결정에 필요한 정보를 얻을 수 있습니다.

개발 환경 및 의존성:

Python 3: 스크립트의 기본 실행 환경입니다.
외부 라이브러리: requests, BeautifulSoup4, PyYAML, pandas, newspaper3k, python-dateutil, pytz, openai, urllib3 등이 사용됩니다. 이 라이브러리들은 pip install 명령어를 통해 설치할 수 있습니다.
API 키: NewsAPI 및 OpenAI API를 사용하기 위한 유효한 API 키가 config.yaml 파일에 설정되어 있어야 합니다.

파일 구조:

make_summary.py: 본 스크립트 파일.
config.yaml: API 키와 같은 환경 설정 정보를 저장하는 파일.
summaries/: 생성된 JSON 요약 파일이 저장될 디렉토리.

2. 주요 기능 설명

2.1. 환경 설정 및 API 키 로드

프로그램은 config.yaml 파일에서 OPENAI_SEC_KEYNEWS_API_KEY를 로드하여 사용합니다. 이 키들은 NewsAPI와 OpenAI 서비스에 접근하기 위한 인증 정보로 사용됩니다. 키가 없거나 유효하지 않은 경우 프로그램은 실행을 중단합니다.
Python
 
 
with open(\'config.yaml\', encoding=\'UTF-8\') as f: _cfg = yaml.load(f, Loader=yaml.FullLoader) OPENAI_API_KEY = _cfg.get(\'OPENAI_SEC_KEY\', "") NEWS_API_KEY = _cfg.get(\'NEWS_API_KEY\', "") if not OPENAI_API_KEY or not NEWS_API_KEY or OPENAI_API_KEY.startswith("<") or NEWS_API_KEY.startswith("<"): print("🔴 API 키를 설정해주세요. efriendly_config.yaml 내부에 OPENAI_SEC_KEY, NEWS_API_KEY를 입력해야 합니다.") sys.exit(1)

2.2. 날짜 계산

get_target_and_start_dates() 함수는 현재 뉴욕 시간과 서울 시간을 기준으로 뉴스 수집에 필요한 target_date_str (대상 날짜), curr_datetime_kr (현재 한국 시간), start_date_str (시작 날짜)를 계산합니다. 이는 뉴스 API 호출 시 fromto 파라미터로 사용됩니다.
Python
 
 
def get_target_and_start_dates(): ny_tz = timezone(\'America/New_York\') kr_tz = timezone(\'Asia/Seoul\') now_ny = datetime.datetime.now(ny_tz) now_kr = datetime.datetime.now(kr_tz) target_date_str = now_ny.strftime("%Y-%m-%d") start_date_str = (now_ny - datetime.timedelta(days=5)).strftime("%Y-%m-%d") curr_datetime_kr = now_kr.strftime("%Y-%m-%d %H:%M") return target_date_str, curr_datetime_kr, start_date_str, now_ny

2.3. 뉴스 수집 및 처리

뉴스 수집은 fetch_headlines() 함수를 통해 이루어지며, 이는 NewsAPI의 top-headlines (미국) 또는 everything (한국 및 키워드 기반) 엔드포인트를 호출합니다. API 호출 시 429 Too Many Requests 오류에 대한 재시도 로직이 포함되어 있어 안정성을 높였습니다.
Python
 
 
def fetch_headlines(category, country, page_size=20, max_retries=3): # ... (생략) ... # NewsAPI 호출 로직 # ... (생략) ...
수집된 기사 중 이미지 URL이 없거나 스니펫이 불완전한 경우, fetch_og_image()fetch_top_image_newspaper() 함수를 사용하여 이미지 URL을 보완하고, fetch_full_text() 함수를 사용하여 기사 본문을 크롤링하여 스니펫을 보완합니다. 이는 fetch_headlines_with_fallback() 함수에서 통합적으로 처리됩니다.
Python
 
 
def fetch_full_text(url: str, max_chars: int=5000) -> str: # ... (생략) ... def fetch_og_image(url, timeout=10): # ... (생략) ... def fetch_top_image_newspaper(url): # ... (생략) ... def fetch_headlines_with_fallback(category, country, page_size=20): # ... (생략) ...

2.4. OpenAI를 이용한 뉴스 요약

수집된 모든 뉴스 기사는 OpenAI 모델에 전달될 프롬프트로 구성됩니다. system_msg는 모델의 역할을 정의하고, user_msg는 실제 뉴스 기사 내용과 함께 요약 요청 및 출력 JSON 형식을 지정합니다. 이 프로그램은 o4-mini 모델을 사용하며, 미국 또는 한국 시장에 맞춰 다른 시스템 메시지를 사용합니다.
Python
 
 
# ... (생략) ... if country_code == \'us\': system_msg = { "role": "system", "content": ( f"당신은 미국 금융 시장 리포터입니다. 오늘({curr_datetime_kr}) 기준으로 아래 데이터를 참고하여 " "🇺🇸미국 주식시장 동향, 📊주요 경제지표, 🤖AI 소프트웨어, 💽AI 반도체, ⚛양자 컴퓨팅·네트워킹, " "🤖AI 로보틱스, 🚀항공우주·방산, ☢소형 원전, ₿스테이블 코인, 분야 주요 기업 소식을 " "각 섹션별 최소 3개씩 뽑고, 각각의 소식에서 호재에 해당되는 종목과 악재에 해당되는 종목을 goodSymbol과 badSymbol 리스트로 구분하여 만들어 넣고, 전체 2000자 이내로 요약해 주세요." ) } else: system_msg = { "role": "system", "content": ( f"당신은 한국 금융 시장 리포터입니다. 오늘({curr_datetime_kr}) 기준으로 아래 데이터를 참고하여 " "🇰🇷국내 주식시장 동향, 📊주요 경제지표, 🤖AI 소프트웨어, 💽AI 반도체, ⚛양자 컴퓨팅·네트워킹, " "🤖AI 로보틱스, 🚀항공우주·방산, ☢소형 원전, ₿스테이블 코인, 분야 주요 기업 소식을 " "각 섹션별 최소 3개씩 뽑고, 각각의 소식에서 KOSPI와 KOSDAQ에 상장된 호재에 해당되는 종목코드와 악재에 해당되는 종목코드를 goodSymbol과 badSymbol 리스트로 구분하여 만들어 넣고, 전체 2000자 이내로 요약해 주세요." ) } # ... (생략) ... resp = client.chat.completions.create( model="o4-mini", messages=[system_msg, user_msg] ) summary_text = resp.choices[0].message.content # ... (생략) ...

2.5. 결과 저장 및 백엔드 연동

OpenAI로부터 받은 요약 결과는 JSON 형식으로 파싱되어 summaries 디렉토리에 [country_code]_market_summary_YYYY-MM-DD.json 파일명으로 저장됩니다. 또한, backend_api_send() 함수를 통해 이 JSON 파일을 외부 서버로 업로드하거나, reset_recommendations() 함수를 통해 추천 시스템을 초기화할 수 있는 기능이 포함되어 있습니다. 이 두 함수는 현재 주석 처리되어 있어 필요 시 활성화하여 사용할 수 있습니다.
Python
 
 
def backend_api_send(country_code: str): # ... (생략) ... def reset_recommendations(): # ... (생략) ... # ... (생략) ... save_dir = os.path.join(os.getcwd(), "summaries") os.makedirs(save_dir, exist_ok=True) curr_date_kr = curr_datetime_kr[:10] file_path = os.path.join(save_dir, f"{country_code}_market_summary_{curr_date_kr}.json") try: with open(file_path, "w", encoding="utf-8") as f: json.dump(stock_market_summary_json, f, ensure_ascii=False, indent=2) print(f"✅ {country_code} 시황 요약을 파일로 저장했습니다: {file_path}") except Exception as e: print(f"❌ {country_code} 시황 요약 파일 저장 중 오류 발생: {e}")

3. 코드 구조 및 함수별 설명

이 섹션에서는 make_summary.py 스크립트의 전체적인 코드 구조와 각 주요 함수의 역할 및 내부 로직을 상세히 설명합니다.

3.1. 모듈 임포트 및 초기 설정

스크립트는 os, sys, json, datetime, time, traceback, re, dateutil.tz, pytz.timezone, requests, bs4.BeautifulSoup, yaml, pandas, newspaper.Article, dateutil.parser, urllib3 등 다양한 표준 및 외부 라이브러리를 임포트합니다. 이들은 파일 시스템 접근, 날짜/시간 처리, 웹 요청, HTML 파싱, YAML 파일 처리, 데이터 처리, 뉴스 기사 파싱, 예외 처리, 정규 표현식 등에 사용됩니다.
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 코드는 SSL 인증서 경고를 비활성화하는 데 사용됩니다. 이는 개발 또는 특정 환경에서 SSL 인증서 검증 문제를 회피하기 위함일 수 있으나, 프로덕션 환경에서는 보안상 주의가 필요합니다.
openai 라이브러리가 설치되어 있지 않은 경우, 사용자에게 설치를 안내하고 프로그램을 종료합니다.
Python
 
 
import os import sys import json import datetime import time import traceback import re from dateutil import tz from pytz import timezone import requests from bs4 import BeautifulSoup import yaml import pandas as pd from newspaper import Article from dateutil import parser import urllib3 # InsecureRequestWarning 경고 끄기 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) try: from openai import OpenAI except ImportError: print("Error: openai 라이브러리가 설치되어 있지 않습니다.") print(" pip install openai>=0.27.0 후 다시 실행하세요.") sys.exit(1)

3.2. config.yaml 파일 처리

config.yaml 파일은 API 키와 같은 민감한 정보를 저장하는 데 사용됩니다. 스크립트는 이 파일을 열어 OPENAI_SEC_KEYNEWS_API_KEY를 로드합니다. 로드된 키의 유효성을 검사하여, 키가 비어 있거나 기본 플레이스홀더 값("<"로 시작하는 문자열)인 경우 사용자에게 설정을 요청하고 프로그램을 종료합니다.
Python
 
 
with open(\'config.yaml\', encoding=\'UTF-8\') as f: _cfg = yaml.load(f, Loader=yaml.FullLoader) OPENAI_API_KEY = _cfg.get(\'OPENAI_SEC_KEY\', "") NEWS_API_KEY = _cfg.get(\'NEWS_API_KEY\', "") if not OPENAI_API_KEY or not NEWS_API_KEY or OPENAI_API_KEY.startswith("<") or NEWS_API_KEY.startswith("<"): print("🔴 API 키를 설정해주세요. efriendly_config.yaml 내부에 OPENAI_SEC_KEY, NEWS_API_KEY를 입력해야 합니다.") sys.exit(1) client = OpenAI(api_key=OPENAI_API_KEY) pd.options.mode.chained_assignment = None # pandas 경고 비활성화
pd.options.mode.chained_assignment = Nonepandas 라이브러리에서 발생하는 SettingWithCopyWarning 경고를 비활성화하는 설정입니다. 이는 데이터프레임의 복사본에 대한 연산 시 발생할 수 있는 경고를 무시하도록 합니다.

3.3. get_target_and_start_dates() 함수

이 함수는 현재 시간을 기준으로 뉴욕과 서울의 시간대를 고려하여 뉴스 수집 기간을 설정합니다. target_date_str은 뉴욕 시간대의 현재 날짜를, start_date_str은 뉴욕 시간대의 현재 날짜로부터 5일 전의 날짜를 나타냅니다. curr_datetime_kr은 현재 서울 시간대의 날짜와 시간을 반환합니다.
Python
 
 
def get_target_and_start_dates(): ny_tz = timezone(\'America/New_York\') kr_tz = timezone(\'Asia/Seoul\') now_ny = datetime.datetime.now(ny_tz) now_kr = datetime.datetime.now(kr_tz) target_date_str = now_ny.strftime("%Y-%m-%d") start_date_str = (now_ny - datetime.timedelta(days=5)).strftime("%Y-%m-%d") curr_datetime_kr = now_kr.strftime("%Y-%m-%d %H:%M") return target_date_str, curr_datetime_kr, start_date_str, now_ny

3.4. fetch_full_text() 함수 (웹 크롤링)

이 함수는 주어진 URL에서 웹 페이지의 전체 텍스트를 추출합니다. requests 라이브러리를 사용하여 HTTP GET 요청을 보내고, BeautifulSoup를 사용하여 응답받은 HTML을 파싱합니다. 모든 <p> 태그의 텍스트를 추출하여 합치고, max_chars로 지정된 길이만큼만 반환합니다. 에러 발생 시 빈 문자열을 반환합니다.
Python
 
 
def fetch_full_text(url: str, max_chars: int=5000) -> str: try: resp = requests.get(url, headers={"User-Agent":"Mozilla/5.0"}, verify="C:\Windows\Temp\LGCNS_CA_v3.crt") soup = BeautifulSoup(resp.text, "html.parser") paragraphs = soup.find_all("p") text = "\n".join(p.get_text(strip=True) for p in paragraphs) return text[:max_chars] except: return ""

3.5. fetch_headlines() 함수 (NewsAPI 호출)

이 함수는 NewsAPI를 통해 뉴스 헤드라인을 가져옵니다. country 인수에 따라 미국(us)인 경우 top-headlines 엔드포인트를, 그 외의 경우(kr) everything 엔드포인트를 사용합니다. 한국 뉴스의 경우 query_keywords (경제, 경제지표, 주식시황)를 사용하여 여러 쿼리를 수행하고 결과를 합칩니다. API 호출 실패 시 (특히 429 Too Many Requests) 지수 백오프 방식으로 재시도합니다. SSL 인증서 검증을 위해 verify="C:\Windows\Temp\LGCNS_CA_v3.crt" 경로의 인증서를 사용합니다.
Python
 
 
def fetch_headlines(category, country, page_size=20, max_retries=3): query_keywords = ["경제", "경제지표", "주식시황"] all_articles = [] for attempt in range(1, max_retries + 1): if country.lower() == \'us\': # ... (top-headlines 호출 로직) ... else: # ... (everything 호출 로직 및 중복 제거) ... print("🔴 NewsAPI 호출 실패: 429 rate limit or other error.") return []

3.6. 이미지 추출 보조 함수 (fetch_og_image, fetch_top_image_newspaper)

이 두 함수는 뉴스 기사의 대표 이미지를 추출하는 데 사용됩니다. fetch_og_image()는 웹 페이지의 Open Graph (og:image) 또는 Twitter (twitter:image) 메타 태그를 파싱하여 이미지 URL을 찾습니다. fetch_top_image_newspaper()newspaper3k 라이브러리를 사용하여 기사의 본문에서 가장 적합한 이미지를 추출합니다. 이들은 fetch_headlines_with_fallback() 함수에서 이미지 URL이 없는 기사를 보완하는 데 활용됩니다.
Python
 
 
def fetch_og_image(url, timeout=10): # ... (생략) ... def fetch_top_image_newspaper(url): # ... (생략) ...

3.7. fetch_headlines_with_fallback() 함수

이 함수는 fetch_headlines()를 호출하여 뉴스를 가져온 후, 각 기사에 urlToImage 필드가 없는 경우 fetch_og_image()fetch_top_image_newspaper()를 순차적으로 사용하여 이미지 URL을 찾아 보완합니다. 이는 요약 결과에 시각적 정보를 포함하기 위함입니다.
Python
 
 
def fetch_headlines_with_fallback(category, country, page_size=20): print(f"{country} fetch_headlines_with_fallback..") articles = fetch_headlines(category, country, page_size) for art in articles: if not art.get("urlToImage"): img = fetch_og_image(art["url"]) if not img: img = fetch_top_image_newspaper(art["url"]) art["urlToImage"] = img return articles

3.8. backend_api_send()reset_recommendations() 함수

이 함수들은 외부 백엔드 API와 통신하는 역할을 합니다. backend_api_send()는 생성된 JSON 요약 파일을 https://howardkim.pythonanywhere.com/summaries 엔드포인트로 POST 요청을 통해 업로드합니다. reset_recommendations()https://howardkim.pythonanywhere.com/reset_recommendations 엔드포인트로 POST 요청을 보내 추천 시스템을 초기화합니다. 현재 코드에서는 이 함수들이 if __name__ == "__main__" 블록에서 주석 처리되어 있어 기본적으로는 실행되지 않습니다.
Python
 
 
def backend_api_send(country_code: str): # ... (생략) ... def reset_recommendations(): # ... (생략) ...

3.9. main() 함수 (핵심 로직)

main() 함수는 스크립트의 전체적인 실행 흐름을 제어합니다. 주요 단계는 다음과 같습니다.
1.날짜 설정: get_target_and_start_dates()를 호출하여 현재 날짜 및 뉴스 검색 기간을 설정합니다. 주말 여부에 따라 조회 대상 날짜를 조정하는 로직이 있으나, 현재는 주석 처리되어 항상 현재 날짜를 기준으로 합니다.
2.뉴스 수집: fetch_headlines_with_fallback()를 사용하여 비즈니스 헤드라인 뉴스를 가져옵니다. 또한, country_code에 따라 미국 또는 한국의 주요 분야별 키워드(topic_queries 또는 CATEGORIES)를 사용하여 NewsAPIeverything 엔드포인트에서 추가 뉴스를 수집합니다.
3.기사 통합 및 필터링: 수집된 모든 기사를 all_articles 리스트에 통합하고, publishedAt 날짜를 기준으로 정렬합니다. start_date 이전의 기사는 필터링하여 제외합니다. snippet이 짧은 기사는 fetch_full_text()를 통해 본문을 크롤링하여 보완합니다.
4.OpenAI 프롬프트 구성: 수집된 기사들을 바탕으로 OpenAI 모델에 전달할 system_msguser_msg를 동적으로 생성합니다. 이 프롬프트는 요약 요청과 함께 원하는 JSON 출력 형식을 상세히 정의합니다.
5.OpenAI API 호출: client.chat.completions.create()를 호출하여 OpenAI 모델로부터 요약된 텍스트를 받습니다.
6.JSON 파싱 및 저장: OpenAI 응답에서 JSON 문자열을 추출하고 json.loads()를 사용하여 Python 딕셔너리로 변환합니다. 이 딕셔너리는 summaries 디렉토리에 [country_code]_market_summary_YYYY-MM-DD.json 파일로 저장됩니다.
7.예외 처리: 전체 main 함수는 try-except 블록으로 감싸져 있어, 실행 중 발생하는 예외를 catch하고 traceback을 출력하여 디버깅에 도움을 줍니다.
Python
 
 
def main(country_code: str): try: # ... (생략) ... target_date, curr_datetime_kr, start_date, now_ny = get_target_and_start_dates() # ... (생략) ... biz_raw = fetch_headlines_with_fallback("business", country_code, page_size=20) # ... (생략) ... if country_code == \'us\': # ... (미국 토픽 쿼리) ... else: # ... (한국 카테고리 쿼리) ... # ... (생략) ... all_articles = sorted(all_articles, key=lambda x: x["date"], reverse=True) # ... (생략) ... resp = client.chat.completions.create( model="o4-mini", messages=[system_msg, user_msg] ) summary_text = resp.choices[0].message.content # ... (생략) ... stock_market_summary_json = summary_json # ... (생략) ... with open(file_path, "w", encoding="utf-8") as f: json.dump(stock_market_summary_json, f, ensure_ascii=False, indent=2) # ... (생략) ... except Exception: print("❌ 예외 발생:") traceback.print_exc()

3.10. if __name__ == "__main__": 블록

이 블록은 스크립트가 직접 실행될 때 호출되는 부분입니다. 현재는 미국(us)과 한국(kr) 두 국가에 대해 main() 함수를 순회하며 실행합니다. 각 국가별 요약 생성 후에는 API rate limit을 고려하여 1초의 지연(time.sleep(1))을 둡니다. backend_api_send()reset_recommendations() 호출은 주석 처리되어 있습니다.
Python
 
 
if __name__=="__main__": for code in [\'us\', \'kr\']: try: main(code) # backend_api_send(code) # API rate limit 대비 지연 time.sleep(1) except Exception as e: print(f"Error building summary for {code}: {e}") # # recommendations 초기화 # reset_recommendations()

4. 사용 방법 및 설정 가이드

이 스크립트를 실행하기 위한 단계별 가이드와 필요한 설정에 대해 설명합니다.

4.1. 사전 준비 사항

1.Python 설치: Python 3.x 버전이 시스템에 설치되어 있어야 합니다.
2.필수 라이브러리 설치: 다음 명령어를 사용하여 필요한 Python 라이브러리를 설치합니다.
3.NewsAPI.org 계정 및 API 키: NewsAPI.org 웹사이트에서 계정을 생성하고 API 키를 발급받아야 합니다.
4.OpenAI 계정 및 API 키: OpenAI 웹사이트에서 계정을 생성하고 API 키를 발급받아야 합니다.

4.2. config.yaml 파일 설정

스크립트와 동일한 디렉토리에 config.yaml 파일을 생성하고, 발급받은 NewsAPI 및 OpenAI API 키를 다음과 같이 입력합니다. OPENAI_SEC_KEYNEWS_API_KEY는 실제 키 값으로 대체해야 합니다.
YAML
 
 
OPENAI_SEC_KEY: "YOUR_OPENAI_API_KEY_HERE" NEWS_API_KEY: "YOUR_NEWSAPI_API_KEY_HERE"

4.3. 스크립트 실행

터미널 또는 명령 프롬프트에서 스크립트가 있는 디렉토리로 이동한 후 다음 명령어를 실행합니다.
Bash
 
 
python make_summary.py

4.4. 실행 결과

스크립트가 성공적으로 실행되면, 현재 디렉토리에 summaries라는 새로운 디렉토리가 생성되고 그 안에 요약된 JSON 파일이 저장됩니다. 파일명은 [country_code]_market_summary_YYYY-MM-DD.json 형식입니다. 예를 들어, 2025년 7월 4일에 실행했다면 summaries/us_market_summary_2025-07-04.jsonsummaries/kr_market_summary_2025-07-04.json 파일이 생성됩니다.

4.5. SSL 인증서 설정 (선택 사항)

코드 내에서 verify="C:\Windows\Temp\LGCNS_CA_v3.crt"와 같이 특정 경로의 SSL 인증서 파일을 참조하는 부분이 있습니다. 만약 이 경로에 해당 인증서 파일이 없거나 SSL 관련 오류가 발생한다면, 다음 중 하나의 조치를 취해야 합니다.
인증서 파일 확보: 지정된 경로에 LGCNS_CA_v3.crt 파일을 배치합니다.
인증서 검증 비활성화 (권장하지 않음): 보안 위험을 감수하고 SSL 인증서 검증을 완전히 비활성화하려면, requests.get() 호출 시 verify=False로 변경하거나 urllib3.disable_warnings() 호출을 제거하고 requests 호출 시 verify=False를 명시적으로 추가합니다. 이 방법은 보안상 취약점을 야기할 수 있으므로 프로덕션 환경에서는 권장되지 않습니다.

4.6. 백엔드 API 연동 활성화 (선택 사항)

만약 생성된 JSON 파일을 외부 백엔드 서버로 업로드하거나 추천 시스템을 초기화하는 기능을 사용하고 싶다면, if __name__ == "__main__": 블록 내의 해당 함수 호출 주석을 해제해야 합니다.
Python
 
 
if __name__=="__main__": for code in [\'us\', \'kr\']: try: main(code) backend_api_send(code) # 이 줄의 주석을 해제 time.sleep(1) except Exception as e: print(f"Error building summary for {code}: {e}") reset_recommendations() # 이 줄의 주석을 해제

5. 결론

make_summary.py 스크립트는 NewsAPI와 OpenAI를 효과적으로 결합하여 금융 시장 뉴스를 자동으로 수집, 요약 및 저장하는 강력한 도구입니다. 이 문서는 스크립트의 주요 기능, 데이터 흐름, 코드 구조 및 사용 방법을 상세히 설명하여 사용자가 프로그램을 이해하고 활용하는 데 필요한 정보를 제공합니다. 적절한 API 키 설정과 의존성 설치를 통해 이 스크립트를 즉시 실행하고 시장 분석에 활용할 수 있습니다.

4. 데이터 흐름 다이어그램

다음 다이어그램은 make_summary.py 스크립트의 주요 데이터 흐름을 시각적으로 보여줍니다.
 

5. 사용 방법 및 설정 가이드

이 스크립트를 실행하기 위한 단계별 가이드와 필요한 설정에 대해 설명합니다.

5.1. 사전 준비 사항

1.Python 설치: Python 3.x 버전이 시스템에 설치되어 있어야 합니다.
2.필수 라이브러리 설치: 다음 명령어를 사용하여 필요한 Python 라이브러리를 설치합니다.
3.NewsAPI.org 계정 및 API 키: NewsAPI.org 웹사이트에서 계정을 생성하고 API 키를 발급받아야 합니다.
4.OpenAI 계정 및 API 키: OpenAI 웹사이트에서 계정을 생성하고 API 키를 발급받아야 합니다.

5.2. config.yaml 파일 설정

스크립트와 동일한 디렉토리에 config.yaml 파일을 생성하고, 발급받은 NewsAPI 및 OpenAI API 키를 다음과 같이 입력합니다. OPENAI_SEC_KEYNEWS_API_KEY는 실제 키 값으로 대체해야 합니다.
YAML
 
 
OPENAI_SEC_KEY: "YOUR_OPENAI_API_KEY_HERE" NEWS_API_KEY: "YOUR_NEWSAPI_API_KEY_HERE"

5.3. 스크립트 실행

터미널 또는 명령 프롬프트에서 스크립트가 있는 디렉토리로 이동한 후 다음 명령어를 실행합니다.
Bash
 
 
python make_summary.py

5.4. 실행 결과

스크립트가 성공적으로 실행되면, 현재 디렉토리에 summaries라는 새로운 디렉토리가 생성되고 그 안에 요약된 JSON 파일이 저장됩니다. 파일명은 [country_code]_market_summary_YYYY-MM-DD.json 형식입니다. 예를 들어, 2025년 7월 4일에 실행했다면 summaries/us_market_summary_2025-07-04.jsonsummaries/kr_market_summary_2025-07-04.json 파일이 생성됩니다.

5.5. SSL 인증서 설정 (선택 사항)

코드 내에서 verify="C:\Windows\Temp\LGCNS_CA_v3.crt"와 같이 특정 경로의 SSL 인증서 파일을 참조하는 부분이 있습니다. 만약 이 경로에 해당 인증서 파일이 없거나 SSL 관련 오류가 발생한다면, 다음 중 하나의 조치를 취해야 합니다.
인증서 파일 확보: 지정된 경로에 LGCNS_CA_v3.crt 파일을 배치합니다.
인증서 검증 비활성화 (권장하지 않음): 보안 위험을 감수하고 SSL 인증서 검증을 완전히 비활성화하려면, requests.get() 호출 시 verify=False로 변경하거나 urllib3.disable_warnings() 호출을 제거하고 requests 호출 시 verify=False를 명시적으로 추가합니다. 이 방법은 보안상 취약점을 야기할 수 있으므로 프로덕션 환경에서는 권장되지 않습니다.

5.6. 백엔드 API 연동 활성화 (선택 사항)

만약 생성된 JSON 파일을 외부 백엔드 서버로 업로드하거나 추천 시스템을 초기화하는 기능을 사용하고 싶다면, if __name__ == "__main__": 블록 내의 해당 함수 호출 주석을 해제해야 합니다.
Python
 
 
if __name__=="__main__": for code in [\"us\", \"kr\"]: try: main(code) backend_api_send(code) # 이 줄의 주석을 해제 time.sleep(1) except Exception as e: print(f\"Error building summary for {code}: {e}\") reset_recommendations() # 이 줄의 주석을 해제

6. 결론

make_summary.py 스크립트는 NewsAPI와 OpenAI를 효과적으로 결합하여 금융 시장 뉴스를 자동으로 수집, 요약 및 저장하는 강력한 도구입니다. 이 문서는 스크립트의 주요 기능, 데이터 흐름, 코드 구조 및 사용 방법을 상세히 설명하여 사용자가 프로그램을 이해하고 활용하는 데 필요한 정보를 제공합니다. 적절한 API 키 설정과 의존성 설치를 통해 이 스크립트를 즉시 실행하고 시장 분석에 활용할 수 있습니다.
반응형

댓글()

미국 주식시장 뉴스API를 통한 Daily 증시 시황정리 프로그램

AI주식자동매매|2025. 6. 3. 18:20
반응형

make_summary.py 데이터 플로우 프로세스 메뉴얼

📋 프로그램 개요

목적: 미국 뉴스 API에서 분야별 Top-뉴스를 수집하고, OpenAI를 통해 섹션별 요약 및 추천 업종·종목을 생성하여 JSON 파일로 저장

주요 기능:

  • NewsAPI.org를 통한 미국 비즈니스 뉴스 수집
    Developer price 0$ 사용중: 100 requests over a 24 hour period (50 requests available every 12 hours)
  • OpenAI(o4-mini) 모델을 이용한 뉴스 요약 및 시장 분석
  • 섹션별 정리된 JSON 결과물 생성

🔄 전체 데이터 플로우

 
[시작] → [날짜 계산] → [뉴스 수집] → [데이터 통합] → [AI 분석] → [JSON 저장] → [종료]

📅 STEP 1: 날짜 계산 및 설정

🎯 목적

뉴욕 시간 기준으로 분석 대상 날짜 범위를 설정

📊 데이터 플로우

 
현재 시점(뉴욕 시간)
    ↓
target_date = 현재 - 5일 (분석 기준일)
    ↓
start_date = target_date - 5일 (검색 시작일)
    ↓
target_datetime = 타임스탬프 생성

🔧 함수: get_target_and_start_dates()

입력: 없음
출력:

  • target_date_str: "2025-05-29" (파일명용)
  • start_datetime_str: "2025-05-24 10:30:00" (정렬용)
  • start_date_str: "2025-05-24" (API 검색용)
  • now_ny: 뉴욕 현재 시간 객체

📝 실행 로그 예시

 
▶ Target date (NY 기준): 2025-05-29
▶ Target datetime (NY 기준): 2025-05-29 10:30:00
▶ Start date (5일 전): 2025-05-24

📰 STEP 2: 뉴스 데이터 수집

🎯 목적

NewsAPI를 통해 비즈니스 뉴스와 주요 키워드별 뉴스를 수집

📊 데이터 플로우

2-1. 비즈니스 헤드라인 수집

 
NewsAPI (top-headlines)
    ↓ category="business", country="us"
biz_raw (최대 20개 기사)
    ↓ publishedAt 기준 내림차순 정렬
biz_articles (상위 3개 선택)
    ↓
market_headlines 리스트 생성

2-2. 키워드별 뉴스 수집

 
6개 키워드 검색:
├── economics: "economic indicators"
├── ai_software: "AI software"  
├── ai_semiconductor: "AI semiconductor"
├── quantum: "quantum computing OR quantum networking"
├── ai_robotics: "AI robotics"
└── aerospace: "Aerospace & Defense"
    ↓
각 키워드별 NewsAPI (everything) 호출
    ↓ start_date ~ target_date 범위
raw_articles (최대 30개씩)
    ↓ publishedAt 기준 내림차순 정렬  
topics_articles[키워드] (상위 3개씩)

🔧 주요 함수들

fetch_headlines_with_image(category, country, page_size)

  • 입력: 카테고리, 국가, 페이지 크기
  • 출력: 정제된 기사 리스트
  • API: /v2/top-headlines

fetch_everything(query, from_date, to_date, page_size)

  • 입력: 검색어, 시작일, 종료일, 페이지 크기
  • 출력: 원본 기사 리스트
  • API: /v2/everything

📝 실행 로그 예시

 
▶ fetch_headlines_with_image 반환 기사 개수: 17
▶ biz_articles (상위 3개) 개수: 3
▶ economics 키워드, 상위 3개 뉴스 개수: 3
▶ ai_software 키워드, 상위 3개 뉴스 개수: 3

🔍 STEP 3: 콘텐츠 보강 (크롤링)

🎯 목적

NewsAPI에서 제공하는 짧은 스니펫을 실제 기사 본문으로 보강

📊 데이터 플로우

 
기사 스니펫 검사
    ↓ (길이 < 100자 OR 끝이 "…")
해당 기사 URL 크롤링
    ↓ BeautifulSoup으로 <p> 태그 추출
본문 텍스트 (최대 5,000자)
    ↓
기존 snippet 대체

🔧 함수: fetch_full_text(url, max_chars=5000)

  • 입력: 기사 URL, 최대 문자 수
  • 출력: 추출된 본문 텍스트
  • 오류 처리: 크롤링 실패 시 빈 문자열 반환

🗂️ STEP 4: 데이터 통합 및 구조화

🎯 목적

수집된 모든 기사를 섹션별로 분류하고 통합 데이터 구조 생성

📊 데이터 플로우

4-1. 전체 기사 리스트 생성

 
market_headlines (비즈니스 3개)
    ↓ category="미국 주식시장 동향" 추가
topics_articles (키워드별 3개씩)
    ↓ 한글 섹션명 매핑
        ├── economics → "주요 경제지표"
        ├── ai_software → "AI 소프트웨어"
        ├── ai_semiconductor → "AI 반도체"
        ├── quantum → "양자 컴퓨팅·네트워킹"
        ├── ai_robotics → "AI 로보틱스"
        └── aerospace → "항공우주 방산"
    ↓
all_articles (전체 기사 통합, 총 21개)

4-2. 섹션별 그룹핑

 
sections_map 초기화 (6개 섹션)
    ↓
all_articles 순회
    ↓ category별 분류
sections_map[섹션명] = [기사1, 기사2, 기사3]
    ↓
JSON 직렬화 (간결한 형태)

📋 데이터 구조

 
python
# 각 기사 객체 구조
{
    "category": "섹션명(한글)",
    "headline": "기사 제목",
    "source": "출처명",
    "url": "기사 URL",
    "urlToImage": "이미지 URL",
    "snippet": "기사 내용",
    "date": "발행일시"
}

🤖 STEP 5: AI 분석 및 요약

🎯 목적

OpenAI를 통해 섹션별 기사 요약 및 시장 분석 리포트 생성

📊 데이터 플로우

 
sections_map (JSON 직렬화)
    ↓
OpenAI 프롬프트 구성
    ├── System Message: 역할 및 출력 형식 지정
    └── User Message: 실제 뉴스 데이터 전달
    ↓
OpenAI API 호출 (o4-mini 모델)
    ↓
JSON 응답 파싱
    ├── 성공: 요약 섹션 + 추천 종목
    └── 실패: 원본 기사 + 빈 추천 리스트

🔧 AI 프롬프트 구조

System Message 핵심 내용

  • 역할: "미국 금융 시장 리포터"
  • 작업: 6개 섹션 기사 요약 + 추천 업종·종목 3선
  • 형식: 순수 JSON 객체만 출력
  • 키 구조: date, sections, recommendations

User Message 구성

  • 현재 날짜 명시: target_date
  • 실제 뉴스 데이터: sections_map JSON
  • 출력 요구사항 재강조

📝 응답 파싱 및 오류 처리

 
python
try:
    parsed = json.loads(content)
    found_sections = parsed.get("summary_sections", [])
    found_recommendations = parsed.get("recommendations", [])
except json.JSONDecodeError:
    # 파싱 실패 시 원본 데이터 사용
    found_sections = 원본_sections_map
    found_recommendations = []

💾 STEP 6: 최종 JSON 생성 및 저장

🎯 목적

분석 결과를 구조화된 JSON 파일로 저장

📊 데이터 플로우

 
AI 분석 결과
    ↓
summary_obj 객체 생성
    ├── date: target_datetime
    ├── sections: 요약된 섹션 리스트
    └── recommendations: 추천 업종·종목
    ↓
summaries 디렉터리 생성
    ↓
JSON 파일 저장: us_market_summary_{target_date}.json

📋 최종 JSON 구조

 
json
{
  "date": "2025-05-29 10:30:00",
  "sections": [
    {
      "title": "미국 주식시장 동향",
      "items": [
        {
          "headline": "기사 제목",
          "source": "출처명",
          "url": "기사 URL",
          "urlToImage": "이미지 URL",
          "snippet": "기사 내용",
          "date": "2025-05-29T08:00:00Z"
        }
      ]
    }
  ],
  "recommendations": [
    {
      "sector": "AI 소프트웨어",
      "stocks": ["AAPL", "MSFT", "GOOGL"]
    }
  ]
}

📝 파일 저장 규칙

  • 디렉터리: summaries/
  • 파일명: us_market_summary_{target_date}.json
  • 인코딩: UTF-8
  • 형식: 들여쓰기 2칸으로 가독성 향상

⚠️ 예외 처리 및 오류 대응

🔧 주요 오류 처리 포인트

1. API 호출 실패

 
NewsAPI 응답 오류
    ↓
빈 리스트 반환
    ↓
다음 단계 정상 진행

2. 크롤링 실패

 
URL 접근 오류
    ↓
빈 문자열 반환
    ↓
원본 snippet 유지

3. OpenAI 파싱 실패

 
JSON 파싱 오류
    ↓
경고 메시지 출력
    ↓
원본 sections_map 사용

4. AttributeError 방지

  • 원인: art.get("source", {}).get("name", "")에서 source가 문자열일 때
  • 해결: 섹션별로 데이터 구조 분리 처리

🚀 실행 방법

📋 사전 준비

  1. 설정 파일: efriend_config.yaml에 API 키 설정
     
    yaml
    OPENAI_SEC_KEY: "your-openai-api-key"
    NEWS_API_KEY: "your-news-api-key"
  2. 패키지 설치:
     
    bash
    pip install openai requests beautifulsoup4 PyYAML pandas python-dateutil pytz

🎯 실행 명령

 
bash
python make_summary.py

📊 실행 결과

  • 성공: summaries/us_market_summary_YYYY-MM-DD.json 파일 생성
  • 로그: 각 단계별 진행 상황 출력
  • 오류: 상세한 에러 메시지와 함께 traceback 출력

📈 확장 및 개선 아이디어

🔧 설정 변경 가능 항목

  • 키워드 추가: topic_queries에 새로운 검색어 추가
  • 기사 개수 조정: 상위 3개 → 5개 또는 다른 개수로 변경
  • AI 모델 설정: 토큰 수, 온도 등 파라미터 조절
  • 크롤링 범위: 최대 문자 수 조정

🚀 자동화 방안

  • 스케줄링: Cron Job, AWS Lambda, Kubernetes CronJob
  • 알림 기능: 오류 발생 시 Email/SMS 알림
  • 모니터링: 실행 상태 및 결과 품질 모니터링

📞 문제 해결 가이드

❓ 자주 발생하는 문제

  1. API 키 오류: efriend_config.yaml 파일 확인
  2. 네트워크 오류: 인터넷 연결 및 방화벽 설정 확인
  3. JSON 파싱 실패: OpenAI 응답 로그 확인 후 프롬프트 조정
  4. 파일 저장 실패: summaries 디렉터리 권한 확인

🔍 디버깅 팁

  • 각 단계별 로그 메시지 확인
  • serialized_sections 출력으로 데이터 구조 검증
  • OpenAI 응답 내용 직접 확인
  • 예외 발생 시 traceback 전체 내용 분석

이 메뉴얼은 make_summary.py 프로그램의 전체 데이터 플로우를 단계별로 설명하여, 프로그램의 동작 원리를 쉽게 이해할 수 있도록 구성되었습니다.

위처럼 생성된 json파일은 하기의 웹앱으로 보내집니다. 참조하시기 바랍니다.

https://howardkim.pythonanywhere.com/

 

반응형

댓글()

뉴스요약 시스템 구축

AI주식자동매매|2025. 6. 2. 16:48
반응형

안녕하세요? 드디어 저도 웹사이트를 하나 갖게되었습니다.

https://howardkim.pythonanywhere.com 에 저의 집을 만들었습니다. 

 

gold_stock

 

howardkim.pythonanywhere.com

 

 

내용은 다음과 같습니다.

 

 

 

반응형

댓글()

ImportError: DLL load failed while importing QtWidgets

AI주식자동매매|2024. 10. 12. 15:16
반응형

anaconda 64bit 설치후`
>python -m pip install --upgrade pip

>set CONDA_FORCE_32BIT=1
>conda create -n py38_32 python=3.8
>activate py38_32

>pip install pyqt5

 

 

ImportError: DLL load failed while importing QtWidgets 지정된 모듈을 찾을 수 없습니다.

라는 메세지가 뜰때는 하기 link에서 직접 관련 파일을 다운받습니다.

https://www.riverbankcomputing.com/pypi/simple/pyqt5/

 

Links for pyqt5

 

www.riverbankcomputing.com

저는 kiwoom api 사용하므로 32bit env환경에서 사용하므로 , 32bit용을 다운 받았습니다.

>pip install c:\PyQt5-5.15.12.dev2408131152-cp38-abi3-win32.whl

이렇게 직접 다운받은 파일을 이용해서 설치를 합니다.

그리고, 계속 합니다.

 

>pip install pytz
>pip install numpy pandas requests
>pip install numpy>=1.21.2 pandas>=1.3.0 requests>=2.31

>pip install numpy

>pip install --user pandas==1.5.3 

pandas2.0은 matplotlib 최신버젼과 호환이 되지 않아서 지정된 버젼으로 설치합니다.

>pip install c:\TA_Lib-0.4.24-cp38-cp38-win32.whl

>pip install c:\TA_Lib-0.4.24-cp37-cp37m-win_amd64.whl

 

>pip install mpl_finance
# >pip install pycurl  #
>pip install c:\pycurl-7.45.1-cp38-cp38-win32.whl
  
# Successfully installed PyQt5-5.15.9
>pip install PyQt5Singleton
>pip install slacker
>pip install telegram

>conda install -c conda-forge finance-datareader


#>pip uninstall python-telegram-bot telegram -y
>pip install python-telegram-bot
>pip install python-telegram-bot --upgrade
>pip install python-telegram-bot==13.3 # 20.0a0버젼부터는 dispatcher를 더이상 사용불가합니다. 계속사용하려면13.3을 설치합니다.
>pip install holidays
>pip install gtts
>pip install pyglet==1.5 #2.0이상부터는 python 3.8 이상 사용해야 한다.
>pip install mplfinance #ERROR: Could not build wheels for pillow which use PEP 517 and cannot be installed directly
>pip install lxml
>pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
>pip install yfinance
>pip install pandas_datareader
>pip install bs4
>pip install matplotlib 대신 >conda install matplotlib 사용해야 한

>pip install Pillow==9.5.0 #Requirement already satisfied: Pillow==9.5.0 in c:\users\howto\appdata\roaming\python\python38\site-packages (9.5.0)
>pip install pyautogui
>pip install selenium
>pip install scikit-learn #scikit-learn이란 python을 대표하는 머신러닝 라이브러리이다. '사이킷런'이라고 부르기도 한다
>pip install PyYAML #yaml파일의 내용을 딕셔너리로 만들어준다.

 

>conda deactivate

 

여기서부터는 64비트 env환경에서 사용할 환경설정을 시작합니다.
>set CONDA_FORCE_64BIT=1
>conda create -n py38_64 python=3.8 
>activate py38_64

 

>pip install numpy pandas

> pip install pyqt5

> pip install slacker

>pip install telegram

> pip install mplfinance

> pip install pyupbit

>pip install pybithumb

> pip install torch torchvision

> pip install torch torchvision

> pip uninstall python-telegram-bot telegram -y
>pip install python-telegram-bot

> pip install yfinance

> pip install sklearn

> pip install stable_baselines3

> pip install bayes_opt

> pip install bayesian-optimization # bayes_opt 패키지는 **bayesian-optimization**으로 설치해야 합니다.

> pip install gym

> pip install openai

> pip install python-telegram-bot

> pip install python-telegram-bot --upgrade

 


># pip install torch===1.3.1 torchvision===0.4.2 -f https://download.pytorch.org/whl/torch_stable.html #No matching distribution found for torch===1.3.1

>pip install holidays
>pip install gtts
>pip install pyglet #pyglet 2.0.1 requires Python 3.8 or newer.
>
>pip install lxml
>pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
>pip install yfinance
>pip install pandas_datareader
>pip install gym==0.25.2
>pip install pygame
>pip install pytz
>pip install -U finance-datareader
>CUDA download
>pip install -U scikit-learn or conda install scikit-learn
>Visual Studio Downloadde
>pip install sklearn 

>set CONDA_FORCE_64BIT=1
>conda create -n py39_64 python=3.9 anaconda
>activate py39_64

>pip install torch
#최신버전의 tensrflow를 설치한다.
>pip install tensorflow
or 
>py -m pip install tensorflow
or
>python -m pip install --user --upgrade pip
Collecting pip
  Using cached pip-20.1.1-py2.py3-none-any.whl (1.5 MB)
Installing collected packages: pip
  WARNING: The scripts pip.exe, pip3.7.exe and pip3.exe are installed in 'C:\Users\howto\AppData\Roaming\Python\Python37\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-20.1.1

PATH에 추가해도 안됨..

(env 삭제)
>conda env remove -n ENV_NAME



또는
If you are using python-3

>py -m pip install --upgrade pip
>py -m pip install tensorflow

> pip install --upgrade tensorflow

$ pip install numpy scipy
$ pip install scikit-learn
$ pip install pillow
$ pip install h5py
talling Keras with TensorFlow backendShell
$ pip install keras
$ workon keras_tf

>pip install pyinstaller

>pyinstaller --version
3.6
# PyQt5를 포함하여 main.exe 실행파일 만들기
>pyinstaller --windowed --onefile main.py
  exe실행시 ("Fatal error detected","Failed to execute script main") 메세지 뜸.
그래서, 이번엔..
>pyinstaller --onefile main.py

다시..
>pyinstaller myfile.py --upx-dir=..\upx391w -y --onefile

=> cannot import name 'pywrap_tensorflow' from 'tensorflow_core.python'


결국, 
"if you are using anaconda, python 3.7 is installed by default, so you have to downgrade it to 3.6:"
그래서..
>conda install python=3.6
실행함...
그리고, 다시..
# Requires the latest pip
>pip install --upgrade pip

# Current stable release for CPU and GPU
>pip install --ignore-installed --upgrade tensorflow

# Or try the preview build (unstable)
>pip install tf-nightly

반응형

댓글()

GPT 4o Vision 활용하기(3)

AI주식자동매매|2024. 10. 6. 14:36
반응형

안녕하세요? 

이번에는  ChatGPT Vision을 어떤 곳에서 활용할 수 있을까를 생각해 봤습니다.

이 글을 읽으신 분들도 한번 같이 생각해 봐 주시고, 의견 달아주시면 정말 감사하겠습니다.

 

1) 주식 차트정보를 보여주고, 이 주식 매수해도 될지 ChtGPT에게 물어보기

    - 제가 지금 API를 통해서 구현하면서 얼마나 정확성이 있는지 테스트 해보고 있는 방법이죠.

      GPT 4o Vision 활용하기(1)을 참조해 주세요.

 

2) 인물 사진을 보여주고, 누구인지, 어디사는 사람인지, 한국인인지 일본인지, 중국인지 등 물어볼 수 있겠죠?

 

3) 식물, 동물 사진 보여주고, 식물이름이나, 동물이름, 해조류 이름 등 맞추기

 

4) 분해되어 있거나, 아직 조립하지 않은 물건을 어떻게 조립하면 될지 물어볼수도 있겠죠?

 

5) 생산제품 외관사진을 보여주고 불량인지 아닌지 판별해 달라고 할 수 도 있겠죠?

 

6) 두장의 사진을 비교해서 보여주고, 어떤 문제가 있는지 분석요청도 할 수 있겠죠?

 

7) 어떤 사고현장 사진을 보여주고, 현 상황을 설명하게 하고, 119나 112에 전화하는 기능과 연결할 수도 있겠죠?

 

이 밖에 다양하게 인공지능 생성형 AI Vision 기능을 통해서 할 수 있는 일들이 무궁무진할 것 같긴합니다.

여러분들은 어떤 곳에서 사용될 수 있을거라고 생각하시나요?

 

반응형

댓글()

GPT 4o Vision 활용하기(2)

AI주식자동매매|2024. 10. 6. 14:25
반응형

이번에는 ChatGPT Vision을 사용할 경우, 각 버젼별 비용을 알아볼거에요.

 

1) GPT-4o( GPT-4o-2024-05-13 )

    1일 사용 token 2,292,425 token(input&output)

    1일 사용 Cost 11.52$

    ------------------------------

     1 token당 약 0.006784원(Won) => 1회당 약 300 token 사용한다고 할때, 1회 API요청시 약 2원이 사용됨.

9월25일 Activity Tokens
9월25일 Costs

2) GPT-4o-mini GPT-4o-2024-05-13

    1일 사용 token 146,851,547 token(input&output)

    1일 사용 Cost 22.04$

     ------------------------------

     1 token당 약 0.0002026원 => 1회당 약 300 token 사용한다고 할때, 1회 API요청시 약 0.06원이 사용됨.

9/25일 Activity Tokens

   

9월25일 Costs

 

결국, GPT-4o는 GPT-4o-mini보다 약 33배 비싸다고 할 수 있겠네요.

 

이용에 참조하세요.

반응형

댓글()