Spaces:
Sleeping
Sleeping
File size: 4,014 Bytes
4be2d4d | 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 | """
๊ฒฝ์ ์งํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ด๋ จ ํจ์
"""
import pandas as pd
import yfinance as yf
import FinanceDataReader as fdr
from fredapi import Fred
from statsmodels.tsa.holtwinters import ExponentialSmoothing
def get_economic_data(start_date, end_date, fred_api_key):
"""
๊ฒฝ์ ์งํ์ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ํจ์
"""
# ๊ฒฝ์ ์งํ ๋ฐ์ดํฐ ๋ค์ด๋ก๋ (FRED API)
fred = Fred(api_key=fred_api_key)
# ๊ตญ์ฑ ์์ต๋ฅ
DGS = pd.concat([
fred.get_series('DGS2', start_date, end_date),
fred.get_series('DGS5', start_date, end_date),
fred.get_series('DGS10', start_date, end_date)
], axis=1)
DGS.columns = ['2-year', '5-year', '10-year']
# ๊ธฐํ ๊ฒฝ์ ์งํ
T10Y2Y = fdr.DataReader('FRED:T10Y2Y', start_date, end_date)
VIX = fdr.DataReader('FRED:VIXCLS', start_date, end_date)
Unemployment_Rate = fdr.DataReader('FRED:UNRATE', start_date, end_date)
CPI = fdr.DataReader('FRED:CPIAUCSL', start_date, end_date)
FEDFUNDS = fdr.DataReader('FRED:FEDFUNDS', start_date, end_date)
GDP = pd.DataFrame(fred.get_series('GDP', start_date, end_date), columns=['GDP'])
# ์ฃผ์ ์ฃผ์ ์ง์
index_tickers = {
"^DJI": "DJI Close",
"NDAQ": "NDAQ Close",
"^GSPC": "SPX Close",
"^RUT": "RUT Close"
}
index_data = {}
for ticker, name in index_tickers.items():
df = yf.download(ticker, start=start_date, end=end_date)
df = df[['Close']].rename(columns={'Close': name})
index_data[name] = df
Index_data = pd.concat(index_data.values(), axis=1)
# ์ฐ์
๋ณ ETF
sectors = {
"VDE": "Energy",
"MXI": "Materials",
"VIS": "Industrials",
"VCR": "Consumer Cyclical",
"XLP": "Consumer Staples",
"VHT": "Health Care",
"XLF": "Financials",
"VGT": "Information Technology",
"VOX": "Communication Services",
"XLU": "Utilities",
"VNQ": "Real Estate"
}
sector_data = {}
for etf, sector_name in sectors.items():
df = yf.download(etf, start=start_date, end=end_date)
df.rename(columns={'Close': f'{sector_name} Close'}, inplace=True)
sector_data[sector_name] = df[[f'{sector_name} Close']]
ETF_data = pd.concat(sector_data.values(), axis=1)
# ๋ฐ์ดํฐ ๋ณด๊ฐ ๋ฐ ์์ธก
def interpolate_and_forecast(df, col_name, stock_end_date):
df = df.resample('D').asfreq().interpolate()
forecast_steps = (pd.to_datetime(stock_end_date) - df.index[-1]).days
if forecast_steps > 0:
forecast_df = pd.DataFrame(index=pd.date_range(df.index[-1] + pd.Timedelta(days=1), stock_end_date))
model = ExponentialSmoothing(df[col_name], trend='add').fit()
forecast_df[col_name] = model.forecast(steps=forecast_steps)
df = pd.concat([df, forecast_df])
return df
# ๋ชจ๋ ๊ฒฝ์ ๋ฐ ์์ฅ ์งํ ๊ฒฐํฉ
econ_df = (
interpolate_and_forecast(DGS, '2-year', end_date)
.join(interpolate_and_forecast(T10Y2Y, 'T10Y2Y', end_date), how='left')
.join(interpolate_and_forecast(VIX, 'VIXCLS', end_date), how='left')
.join(interpolate_and_forecast(Unemployment_Rate, 'UNRATE', end_date), how='left')
.join(interpolate_and_forecast(CPI, 'CPIAUCSL', end_date), how='left')
.join(interpolate_and_forecast(FEDFUNDS, 'FEDFUNDS', end_date), how='left')
.join(interpolate_and_forecast(GDP, 'GDP', end_date), how='left')
)
# ๋ฉํฐ์ธ๋ฑ์ค ์ฒ๋ฆฌ
if isinstance(Index_data.columns, pd.MultiIndex):
Index_data.columns = Index_data.columns.get_level_values(1)
if isinstance(ETF_data.columns, pd.MultiIndex):
ETF_data.columns = ETF_data.columns.get_level_values(1)
econ_df = econ_df.join(Index_data, how='left').join(ETF_data, how='left')
econ_df.fillna(method='ffill', inplace=True)
econ_df.fillna(method='bfill', inplace=True)
return econ_df |