4.15, 4.16 ๊ฐ์๋ฅผ ๋ฐ๋ผํ๋๋ฐ ์ฃผ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ด์ํฉ๋๋ค
์ปค์ ai ํด๋ก๋-4-์๋ทํํ
๋ฌผ์ด๋ด์ ํด๊ฒฐํ์ต๋๋ค yfinance ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ๊ฐ ์๋๊ณ stock.py ์ฝ๋ ๋ก์ง ๋ฌธ์ ์์ต๋๋ค ์๋๋ ์ปค์ ai ๋ต๋ณ ์
๋๋ค ์์ ํด์ผ ํ ๋ถ๋ถ์ฐ์ ์์ 1: stock.py์ download_yahoo_chart ํจ์ ์์ ์ด ํจ์๊ฐ ์ ๋๋ก ์๋ํ์ง ์์์ ๋ชจ๋ ๋ ์ง์ ๋น ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๊ณ , economic_service.py์ ์ด์ ๋ฐ์ดํฐ ์ฑ์ฐ๊ธฐ ๋ก์ง์ด ๊ณ์ ๋์ํ๊ณ ์์ต๋๋ค.stock.py์ 189๋ฒ ๋ผ์ธ ๊ทผ์ฒ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ธํด๋ณด๊ฒ ์ต๋๋ค:Read stock.py and thought for 5s๋ฌธ์ ๋ฅผ ์ฐพ์์ต๋๋ค! stock.py์ download_yahoo_chart ํจ์์์ ๋ ์ง ํํฐ๋ง ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.Yahoo Finance API๊ฐ 2019๋
๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋๋ฐ 2025๋
์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ ์์ต๋๋ค!๐ง ๋ฌธ์ ์์ธ ๋ฐ ํด๊ฒฐ ๋ฐฉ์stock.py์ Yahoo Finance API ํธ์ถ ๋ฐฉ์์ด ์๋ชป๋์์ต๋๋ค. range: max๋ ์ต์ ๋ฐ์ดํฐ๋ง ๋ฐํํ๋ฏ๋ก ๊ณผ๊ฑฐ ํน์ ๊ธฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด period1, period2 ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.stock.py ์ฝ๋์์ download_yahoo_chart ํจ์ ๋ถ๋ถ์ ์๋์ ๊ฐ์ด ์์ ํด์ ํด๊ฒฐ ํ์ต๋๋ค# yfinance.py์์ ๊ฐ์ ธ์จ ํจ์ def download_yahoo_chart(symbol, start_date, end_date, interval="1d"): """ Yahoo Finance Chart API๋ฅผ ํตํด ์ฃผ์ด์ง symbol์ ์ข
๊ฐ(Close) ์๊ณ์ด์ ๊ฐ์ ธ์ต๋๋ค. - symbol: Yahoo Finance ํฐ์ปค ๋ฌธ์์ด (์: "^GSPC", "AAPL") - start_date: ์์์ผ (YYYY-MM-DD) - end_date: ์ข
๋ฃ์ผ (YYYY-MM-DD) - interval: "1d", "1wk", "1mo" """ sess = requests.Session() sess.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" }) # ๋ ์ง๋ฅผ Unix ํ์์คํฌํ๋ก ๋ณํ start_dt = datetime.strptime(start_date, '%Y-%m-%d') end_dt = datetime.strptime(end_date, '%Y-%m-%d') # ํ๋ฃจ ๋ ์ถ๊ฐํ์ฌ ์ข
๋ฃ์ผ ํฌํจ end_dt = end_dt + timedelta(days=1) start_timestamp = int(start_dt.timestamp()) end_timestamp = int(end_dt.timestamp()) url = f"https://query1.finance.yahoo.com/v8/finance/chart/{symbol}" params = { "period1": start_timestamp, "period2": end_timestamp, "interval": interval, "includePrePost": "false", "events": "div|split" } r = sess.get(url, params=params) r.raise_for_status() result = r.json().get("chart", {}).get("result", [None])[0] if not result: raise ValueError(f"No data for symbol: {symbol}") timestamps = result["timestamp"] closes = result["indicators"]["quote"][0]["close"] # ์์ - ์์ ๋ ๋ถ๋ถ: ๋ ์ง๋ง ์ฌ์ฉํ๋๋ก ์ฒ๋ฆฌ # ๊ฐ ํ์์คํฌํ๋ฅผ datetime์ผ๋ก ๋ณํํ๊ณ ๋ ์ง ๋ถ๋ถ๋ง ์ฌ์ฉ date_only = [pd.Timestamp.fromtimestamp(ts).date() for ts in timestamps] # ๋ฐ์ดํฐํ๋ ์ ์์ฑ ์ ๋ ์ง๋ง ํฌํจํ๋๋ก ์์ df = pd.DataFrame({ "Close": closes }, index=pd.DatetimeIndex(date_only)) # ์ค๋ณต๋ ๋ ์ง๊ฐ ์๋ ๊ฒฝ์ฐ ๋ง์ง๋ง ๊ฐ๋ง ์ ์ง if df.index.duplicated().any(): df = df[~df.index.duplicated(keep='last')] # ์ข
๋ฃ - ์์ ๋ ๋ถ๋ถ # ์์์ผ๊ณผ ์ข
๋ฃ์ผ ์ฌ์ด์ ๋ฐ์ดํฐ๋ง ํํฐ๋ง df = df[(df.index >= pd.Timestamp(start_date)) & (df.index