Spaces:
Sleeping
Sleeping
Анастасия
commited on
Commit
·
246a07c
1
Parent(s):
bc2783e
- .DS_Store +0 -0
- images/img.png +2 -2
- pages/1_📈_Прогноз_индекса. Prophet.py +3 -18
- pages/2_💲 _Прогноз_акций. Prophet.py +5 -4
- pages/3_🪙_Прогноз_Bitcoin USD. BiLSTM.py +8 -6
- pages/__init__.py +0 -0
.DS_Store
CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
|
|
images/img.png
CHANGED
Git LFS Details
|
Git LFS Details
|
pages/1_📈_Прогноз_индекса. Prophet.py
CHANGED
@@ -18,7 +18,7 @@ st.image('images/img.png')
|
|
18 |
START = "2021-01-01"
|
19 |
TODAY = date.today().strftime("%Y-%m-%d")
|
20 |
|
21 |
-
period = st.slider('Количество дней прогноза:',
|
22 |
|
23 |
# @st.cache_data
|
24 |
def load_data():
|
@@ -35,20 +35,6 @@ def load_data():
|
|
35 |
dji, data_500, sse, imoex = load_data()
|
36 |
latest_date = dji['Date'].iloc[-1].strftime('%Y-%m-%d')
|
37 |
st.markdown(f"<h3 style='text-align: center;'>Цены актуальны на последнюю дату закрытия торгов {latest_date}</h3>", unsafe_allow_html=True)
|
38 |
-
# # Добавляем кнопку обновления данных
|
39 |
-
# if st.button("Обновить данные", type="primary"):
|
40 |
-
# dji = yf.download('^DJI', START, TODAY)
|
41 |
-
# dji.reset_index(inplace=True)
|
42 |
-
# data_500 = yf.download('^GSPC', START, TODAY)
|
43 |
-
# data_500.reset_index(inplace=True)
|
44 |
-
# sse = yf.download('000001.SS', START, TODAY)
|
45 |
-
# sse.reset_index(inplace=True)
|
46 |
-
# imoex = yf.download('IMOEX.ME', START, TODAY)
|
47 |
-
# imoex.reset_index(inplace=True)
|
48 |
-
# st.success("Данные успешно обновлены!")
|
49 |
-
|
50 |
-
# if st.button("или Обновить данные", type="primary"):
|
51 |
-
# dji, data_500, sse, imoex = load_data()
|
52 |
|
53 |
def evaluate_trend_first_day(predicted_value, actual_value):
|
54 |
# Разница между первым днем прогноза и последним днем тестовых данных
|
@@ -227,9 +213,8 @@ def index(ind, holidays_df, text1, text2, k=0):
|
|
227 |
if check:
|
228 |
col1, col2 = st.columns([1, 1])
|
229 |
with col1:
|
230 |
-
st.write("**Информация.** \
|
231 |
-
|
232 |
-
Дополнительно приведен прогноз для будущего периода с указанием тенденции дельнейшего развития.")
|
233 |
st.markdown("**Метрики для тестовой выборки:**")
|
234 |
st.write(f"MAPE: {mape_test:.2f}%")
|
235 |
st.write(f"RMSE: {rmse_test:.2f}")
|
|
|
18 |
START = "2021-01-01"
|
19 |
TODAY = date.today().strftime("%Y-%m-%d")
|
20 |
|
21 |
+
period = st.slider('Количество дней прогноза:', 7, 14, 14)
|
22 |
|
23 |
# @st.cache_data
|
24 |
def load_data():
|
|
|
35 |
dji, data_500, sse, imoex = load_data()
|
36 |
latest_date = dji['Date'].iloc[-1].strftime('%Y-%m-%d')
|
37 |
st.markdown(f"<h3 style='text-align: center;'>Цены актуальны на последнюю дату закрытия торгов {latest_date}</h3>", unsafe_allow_html=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
|
39 |
def evaluate_trend_first_day(predicted_value, actual_value):
|
40 |
# Разница между первым днем прогноза и последним днем тестовых данных
|
|
|
213 |
if check:
|
214 |
col1, col2 = st.columns([1, 1])
|
215 |
with col1:
|
216 |
+
st.write(f"**Информация.** \
|
217 |
+
Горизонт планирования {period} дней. Валидация модели на тестовой выборке ({period} дней).")
|
|
|
218 |
st.markdown("**Метрики для тестовой выборки:**")
|
219 |
st.write(f"MAPE: {mape_test:.2f}%")
|
220 |
st.write(f"RMSE: {rmse_test:.2f}")
|
pages/2_💲 _Прогноз_акций. Prophet.py
CHANGED
@@ -22,7 +22,7 @@ TODAY = date.today().strftime("%Y-%m-%d")
|
|
22 |
stocks = ('AAPL', 'UNH', 'MSFT', 'GS', 'HD', 'AMGN', 'MCD', 'CAT', 'CRM', 'V', 'BA', 'HON', 'TRV', 'AXP', 'JPM', 'IBM', 'JNJ', 'WMT', 'PG', 'CVX', 'MRK', 'MMM', 'NKE', 'DIS', 'KO', 'DOW', 'CSCO', 'INTC', 'VZ', 'WBA')
|
23 |
selected_stock = st.selectbox('Выберите тикер из индекса Dow Jones', stocks)
|
24 |
|
25 |
-
period = st.slider('Количество дней прогноза:',
|
26 |
|
27 |
# @st.cache_data
|
28 |
def load_data(ticker):
|
@@ -154,9 +154,8 @@ def ticker(data, holidays_df, text1, text2, k):
|
|
154 |
if check:
|
155 |
col1, col2 = st.columns([1, 1])
|
156 |
with col1:
|
157 |
-
st.write("**Информация.** \
|
158 |
-
|
159 |
-
Дополнительно приведен прогноз для будущего периода с указанием тенденции дельнейшего развития.")
|
160 |
st.markdown("**Метрики для тестовой выборки:**")
|
161 |
st.write(f"RMSE: {rmse_test:.2f}")
|
162 |
st.write(f"MAPE: {mape_test:.2f}%")
|
@@ -167,6 +166,8 @@ def ticker(data, holidays_df, text1, text2, k):
|
|
167 |
# Оценка тренда на период прогноза
|
168 |
trend_evaluation_period = evaluate_trend_period(forecast_14_days[['ds', 'yhat']])
|
169 |
st.write(trend_evaluation_period)
|
|
|
|
|
170 |
with col2:
|
171 |
forecast_results = pd.DataFrame({
|
172 |
'Дата': forecast_14_days['ds'].iloc[-period:].values,
|
|
|
22 |
stocks = ('AAPL', 'UNH', 'MSFT', 'GS', 'HD', 'AMGN', 'MCD', 'CAT', 'CRM', 'V', 'BA', 'HON', 'TRV', 'AXP', 'JPM', 'IBM', 'JNJ', 'WMT', 'PG', 'CVX', 'MRK', 'MMM', 'NKE', 'DIS', 'KO', 'DOW', 'CSCO', 'INTC', 'VZ', 'WBA')
|
23 |
selected_stock = st.selectbox('Выберите тикер из индекса Dow Jones', stocks)
|
24 |
|
25 |
+
period = st.slider('Количество дней прогноза:', 7, 14, 14)
|
26 |
|
27 |
# @st.cache_data
|
28 |
def load_data(ticker):
|
|
|
154 |
if check:
|
155 |
col1, col2 = st.columns([1, 1])
|
156 |
with col1:
|
157 |
+
st.write(f"**Информация.** \
|
158 |
+
Горизонт планирования {period} дней. Валидация модели на тестовой выборке ({period} дней).")
|
|
|
159 |
st.markdown("**Метрики для тестовой выборки:**")
|
160 |
st.write(f"RMSE: {rmse_test:.2f}")
|
161 |
st.write(f"MAPE: {mape_test:.2f}%")
|
|
|
166 |
# Оценка тренда на период прогноза
|
167 |
trend_evaluation_period = evaluate_trend_period(forecast_14_days[['ds', 'yhat']])
|
168 |
st.write(trend_evaluation_period)
|
169 |
+
st.info("📌 Кастомная метрика “weighted MAPE’’ - \
|
170 |
+
взвешенное среднее абсолютных процентных ошибок 1 дня прогноза по отношению к значениям крайних 7 дней.")
|
171 |
with col2:
|
172 |
forecast_results = pd.DataFrame({
|
173 |
'Дата': forecast_14_days['ds'].iloc[-period:].values,
|
pages/3_🪙_Прогноз_Bitcoin USD. BiLSTM.py
CHANGED
@@ -19,7 +19,7 @@ st.image('images/img.png')
|
|
19 |
|
20 |
START = "2021-01-01"
|
21 |
TODAY = date.today().strftime("%Y-%m-%d")
|
22 |
-
period = st.slider('Количество дней прогноза:',
|
23 |
|
24 |
df = yf.download('BTC-USD', START, TODAY)
|
25 |
df.reset_index(inplace=True)
|
@@ -119,7 +119,7 @@ fig.add_trace(go.Scatter(x=formatted_dates,
|
|
119 |
name='Прогноз будущее',
|
120 |
line=dict(color='red', width=2, dash='dash')))
|
121 |
|
122 |
-
fig.update_layout(title=f'
|
123 |
xaxis_title='Дата',
|
124 |
yaxis_title='Цена закрытия',
|
125 |
xaxis=dict(tickangle=45),
|
@@ -141,7 +141,7 @@ fig.add_trace(go.Scatter(x=formatted_dates,
|
|
141 |
name='Прогноз будущее',
|
142 |
line=dict(color='red', width=2, dash='dash')))
|
143 |
|
144 |
-
fig.update_layout(title=f'
|
145 |
xaxis_title='Дата',
|
146 |
yaxis_title='Цена закрытия',
|
147 |
xaxis=dict(tickangle=45),
|
@@ -153,7 +153,7 @@ fig.update_layout(title=f'Прогноз по Bitcoin на {period} дней (в
|
|
153 |
st.plotly_chart(fig, use_container_width=True)
|
154 |
|
155 |
# Генерация дат для будущих педсказаний
|
156 |
-
future_dates = [df['Date'].values[-1] + np.timedelta64(i+1, 'D') for i in range(
|
157 |
|
158 |
# Расчет тренда на первый день
|
159 |
trend_first_day = adjusted_future_predictions[0] - df['Adj Close'].iloc[-1]
|
@@ -169,8 +169,8 @@ check = st.checkbox('Результаты прогноза Bitcoin')
|
|
169 |
if check:
|
170 |
col1, col2 = st.columns([1, 1])
|
171 |
with col1:
|
172 |
-
st.write("**Информация.** \
|
173 |
-
|
174 |
st.markdown("**Метрики для тестовой выборки:**")
|
175 |
st.write(f"RMSE: {test_rmse:.2f}")
|
176 |
st.write(f"MAPE: {test_mape:.2f}%")
|
@@ -179,6 +179,8 @@ if check:
|
|
179 |
st.write(f'Тенденция на первый день: {trend_first_day_text}')
|
180 |
# Оценка тренда на период прогноза
|
181 |
st.write(f'Тенденция на период прогноза: {trend_last_day_text}')
|
|
|
|
|
182 |
with col2:
|
183 |
results = pd.DataFrame({
|
184 |
'Дата': future_dates,
|
|
|
19 |
|
20 |
START = "2021-01-01"
|
21 |
TODAY = date.today().strftime("%Y-%m-%d")
|
22 |
+
period = st.slider('Количество дней прогноза:', 7, 14, 14)
|
23 |
|
24 |
df = yf.download('BTC-USD', START, TODAY)
|
25 |
df.reset_index(inplace=True)
|
|
|
119 |
name='Прогноз будущее',
|
120 |
line=dict(color='red', width=2, dash='dash')))
|
121 |
|
122 |
+
fig.update_layout(title=f'График прогноза для {period} дней по Bitcoin, USD 🇺🇸',
|
123 |
xaxis_title='Дата',
|
124 |
yaxis_title='Цена закрытия',
|
125 |
xaxis=dict(tickangle=45),
|
|
|
141 |
name='Прогноз будущее',
|
142 |
line=dict(color='red', width=2, dash='dash')))
|
143 |
|
144 |
+
fig.update_layout(title=f'График прогноза для {period} дней по Bitcoin, USD (в интервале месяца)🇺🇸',
|
145 |
xaxis_title='Дата',
|
146 |
yaxis_title='Цена закрытия',
|
147 |
xaxis=dict(tickangle=45),
|
|
|
153 |
st.plotly_chart(fig, use_container_width=True)
|
154 |
|
155 |
# Генерация дат для будущих педсказаний
|
156 |
+
future_dates = [df['Date'].values[-1] + np.timedelta64(i+1, 'D') for i in range(period)]
|
157 |
|
158 |
# Расчет тренда на первый день
|
159 |
trend_first_day = adjusted_future_predictions[0] - df['Adj Close'].iloc[-1]
|
|
|
169 |
if check:
|
170 |
col1, col2 = st.columns([1, 1])
|
171 |
with col1:
|
172 |
+
st.write(f"**Информация.** \
|
173 |
+
Горизонт планирования {period} дней. Валидация модели на тестовой выборке ({period} дней).")
|
174 |
st.markdown("**Метрики для тестовой выборки:**")
|
175 |
st.write(f"RMSE: {test_rmse:.2f}")
|
176 |
st.write(f"MAPE: {test_mape:.2f}%")
|
|
|
179 |
st.write(f'Тенденция на первый день: {trend_first_day_text}')
|
180 |
# Оценка тренда на период прогноза
|
181 |
st.write(f'Тенденция на период прогноза: {trend_last_day_text}')
|
182 |
+
st.info("📌 Кастомная метрика “weighted MAPE’’ - \
|
183 |
+
взвешенное среднее абсолютных процентных ошибок 1 дня прогноза по отношению к значениям крайних 7 дней.")
|
184 |
with col2:
|
185 |
results = pd.DataFrame({
|
186 |
'Дата': future_dates,
|
pages/__init__.py
ADDED
File without changes
|