|
|
|
!pip install --upgrade pip |
|
!pip install --upgrade openai yfinance gradio matplotlib Pillow |
|
|
|
|
|
import requests |
|
import gradio as gr |
|
import yfinance as yf |
|
import matplotlib.pyplot as plt |
|
import io |
|
from PIL import Image |
|
from datetime import datetime, timedelta |
|
from openai import OpenAI |
|
import os |
|
|
|
|
|
API_KEY = "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" |
|
|
|
def get_real_news_summary(company, date): |
|
|
|
client = OpenAI(api_key=API_KEY, base_url="https://api.perplexity.ai") |
|
|
|
|
|
messages = [ |
|
{"role": "system", "content": "You are a helpful assistant that summarizes stock news in Korean."}, |
|
{"role": "user", "content": f"Summarize the latest stock news for {company} on {date} in Korean. If there's no specific news for that date, provide the most recent relevant information."} |
|
] |
|
|
|
try: |
|
|
|
response = client.chat.completions.create( |
|
model="llama-3.1-sonar-large-128k-online", |
|
messages=messages |
|
) |
|
|
|
|
|
summary = response.choices[0].message.content |
|
return summary |
|
except Exception as e: |
|
return f"λ΄μ€ μμ½ μ€ μλ¬κ° λ°μνμ΅λλ€: {str(e)}" |
|
|
|
|
|
def handle_click(input_value, date_clicked): |
|
return get_real_news_summary(input_value, date_clicked) |
|
|
|
|
|
def update_news(input_value, selected_date): |
|
if selected_date == "" or selected_date is None: |
|
return "λ μ§λ₯Ό μ νν΄μ£ΌμΈμ." |
|
else: |
|
return handle_click(input_value, selected_date) |
|
|
|
|
|
name_to_ticker = { |
|
"μΌμ±μ μ": "005930.KS", |
|
"SKλ°μ΄μ€ν": "326030.KS", |
|
"Apple": "AAPL", |
|
|
|
} |
|
|
|
|
|
def display_stock_with_highlight(input_value, change_type, percent_change): |
|
try: |
|
ticker = name_to_ticker.get(input_value, input_value) |
|
stock = yf.Ticker(ticker) |
|
stock_data = stock.history(period="5y") |
|
|
|
if stock_data.empty: |
|
return "μ£Όκ° λ°μ΄ν°λ₯Ό μ°Ύμ μ μμ΅λλ€.", [] |
|
|
|
stock_data['Change'] = stock_data['Close'].pct_change() * 100 |
|
|
|
percent_change = float(percent_change) |
|
|
|
if change_type == "μμΉ": |
|
highlight_data = stock_data[stock_data['Change'] >= percent_change] |
|
color = "darkorange" |
|
elif change_type == "νλ½": |
|
highlight_data = stock_data[stock_data['Change'] <= -percent_change] |
|
color = "purple" |
|
else: |
|
return "Invalid change type", [] |
|
|
|
dates = stock_data.index.to_numpy() |
|
closing_prices = stock_data['Close'].to_numpy() |
|
|
|
plt.figure(figsize=(10, 6)) |
|
plt.plot(dates, closing_prices, color='gray', label=input_value) |
|
plt.scatter(highlight_data.index, highlight_data['Close'], color=color, label=f'{change_type} ν¬μΈνΈ') |
|
|
|
for index, row in highlight_data.iterrows(): |
|
plt.text(index, row['Close'], index.strftime('%Y-%m-%d'), fontsize=10, fontweight='bold', color=color, ha='right') |
|
plt.axvline(x=index, color=color, linestyle='--', linewidth=1) |
|
|
|
plt.title(f'{input_value} μ£Όκ° μΆμ΄ ({change_type} νμ)') |
|
plt.xlabel('λ μ§') |
|
plt.ylabel('μ’
κ°') |
|
plt.legend() |
|
|
|
buf = io.BytesIO() |
|
plt.savefig(buf, format='png') |
|
plt.close() |
|
buf.seek(0) |
|
img = Image.open(buf) |
|
|
|
highlight_dates = highlight_data.index.strftime('%Y-%m-%d').tolist() |
|
|
|
return img, gr.update(choices=highlight_dates) |
|
except Exception as e: |
|
return f"Error processing data: {e}", gr.update(choices=[]) |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("## μ£Όκ° κ·Έλνμ λ΄μ€ μμ½") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
input_value = gr.Textbox(label="μ’
λͺ©λͺ
λλ ν°μ»€ μ
λ ₯", placeholder="μ: SKλ°μ΄μ€ν, AAPL") |
|
change_type = gr.Dropdown(choices=["μμΉ", "νλ½"], label="μμΉ λλ νλ½ μ ν", value="μμΉ") |
|
percent_change = gr.Textbox(label="λ³λ νΌμΌνΈ (%)", placeholder="μ: 10", value="10") |
|
|
|
submit_btn = gr.Button("Submit") |
|
|
|
|
|
examples = [["SKλ°μ΄μ€ν"], |
|
["λμ€λ₯ μμ΄ 1μ"], |
|
["λμ€λ₯ μ μ½μ£Ό μμ΄ 1μ"], |
|
["λμ€λ₯ λ°μ΄μ€ν
μμ΄ 1μ"], |
|
["μ½μ€νΌ μμ΄ 1μ"], |
|
["μ½μ€λ₯ μμ΄ 1μ"]] |
|
gr.Examples(examples=examples, inputs=[input_value]) |
|
|
|
with gr.Column(): |
|
plot = gr.Image(label="μ£Όκ° κ·Έλν") |
|
date_dropdown = gr.Dropdown(label="쑰건μ ν΄λΉνλ λ μ§ μ ν", choices=[]) |
|
|
|
with gr.Column(): |
|
news_output = gr.Textbox(label="λ΄μ€ μμ½") |
|
|
|
|
|
submit_btn.click( |
|
fn=display_stock_with_highlight, |
|
inputs=[input_value, change_type, percent_change], |
|
outputs=[plot, date_dropdown] |
|
) |
|
|
|
|
|
date_dropdown.change( |
|
fn=update_news, |
|
inputs=[input_value, date_dropdown], |
|
outputs=[news_output] |
|
) |
|
|
|
|
|
demo.launch() |
|
|