Анастасия commited on
Commit
6c92f5c
·
1 Parent(s): b2512b4

Удалены файл из pages

Browse files
pages/1_📈_Прогноз_индекса.py DELETED
@@ -1,153 +0,0 @@
1
- import streamlit as st
2
- import yfinance as yf
3
- import pandas as pd
4
- import numpy as np
5
- import matplotlib.pyplot as plt
6
- from datetime import date
7
- from sklearn.model_selection import train_test_split
8
- from prophet import Prophet
9
- from prophet.plot import plot_plotly
10
- from plotly import graph_objs as go
11
- from prophet.make_holidays import make_holidays_df
12
- from sklearn.metrics import mean_absolute_error, mean_squared_error
13
-
14
- st.set_page_config(layout='wide', initial_sidebar_state='expanded')
15
- st.set_option('deprecation.showPyplotGlobalUse', False)
16
- st.title('ML Wall Street')
17
- st.image('images/img.png')
18
-
19
- START = "2021-01-01"
20
- TODAY = date.today().strftime("%Y-%m-%d")
21
-
22
- period = st.slider('Количество дней прогноза:', 1, 14, 14)
23
-
24
- # @st.cache_data
25
- def load_data():
26
- dji = yf.download('^DJI', START, TODAY)
27
- dji.reset_index(inplace=True)
28
- data_500 = yf.download('^GSPC', START, TODAY)
29
- data_500.reset_index(inplace=True)
30
- sse = yf.download('000001.SS', START, TODAY)
31
- sse.reset_index(inplace=True)
32
- imoex = yf.download('IMOEX.ME', START, TODAY)
33
- imoex.reset_index(inplace=True)
34
- return dji, data_500, sse, imoex
35
-
36
- def plot_forecast(model, forecast, text):
37
- fig = plot_plotly(model, forecast)
38
- fig.update_layout(title_text=text, xaxis_rangeslider_visible=True, xaxis_title='', yaxis_title='')
39
- st.plotly_chart(fig, use_container_width=True, height=400, range_slider_visible=True)
40
-
41
- dji, data_500, sse, imoex = load_data()
42
- latest_date = dji['Date'].iloc[-1].strftime('%Y-%m-%d')
43
- st.markdown(f"<h3 style='text-align: center;'>Цены актуальны на последнюю дату закрытия торгов {latest_date}</h3>", unsafe_allow_html=True)
44
- # # Добавляем кнопку обновления данных
45
- # if st.button("Обновить данные", type="primary"):
46
- # dji = yf.download('^DJI', START, TODAY)
47
- # dji.reset_index(inplace=True)
48
- # data_500 = yf.download('^GSPC', START, TODAY)
49
- # data_500.reset_index(inplace=True)
50
- # sse = yf.download('000001.SS', START, TODAY)
51
- # sse.reset_index(inplace=True)
52
- # imoex = yf.download('IMOEX.ME', START, TODAY)
53
- # imoex.reset_index(inplace=True)
54
- # st.success("Данные успешно обновлены!")
55
-
56
- # if st.button("или Обновить данные", type="primary"):
57
- # dji, data_500, sse, imoex = load_data()
58
-
59
- def evaluate_trend_first_day(predicted_values, actual_values):
60
- # Разница между первым днем прогноза и последним днем тестовых данных
61
- forecast_diff_first_last = predicted_values[0] - actual_values[-1]
62
- # Оценка тренда на первый день: рост, падение, стабильность
63
- if forecast_diff_first_last > 0:
64
- return "Тенденция на первый день: Рост"
65
- elif forecast_diff_first_last < 0:
66
- return "Тенденция на первый день: Падение"
67
- else:
68
- return "Тенденция на первый день: Стабильность"
69
-
70
- def evaluate_trend_period(predicted_values):
71
- # Разница между первым и последним значением прогноза
72
- forecast_diff = predicted_values[-1] - predicted_values[0]
73
- # Оценка тренда на весь период прогноза: рост, падение, стабильность
74
- print("Разница между первым и последним значением прогноза:", forecast_diff)
75
-
76
- if forecast_diff > 0:
77
- return "Тенденция на период прогноза: Рост"
78
- elif forecast_diff < 0:
79
- return "Тенденция на период прогноза: Падение"
80
- else:
81
- return "Тенденция на период прогноза: Стабильность"
82
-
83
- def index(ind, country_name, text1, text2):
84
- data = ind
85
- data = data.rename(columns={'Date': 'ds', 'Adj Close': 'y'})
86
- # Разделение данных на обучающую и тестовую выборки
87
- full_train_data3, full_test_data3 = train_test_split(data, test_size=period, shuffle=False)
88
-
89
- # Удаляем временную зону из столбца ds
90
- full_train_data3['ds'] = full_train_data3['ds'].dt.tz_localize(None)
91
- full_test_data3['ds'] = full_test_data3['ds'].dt.tz_localize(None)
92
-
93
- # Создаем модель Prophet
94
- model = Prophet(interval_width=0.95)
95
- # Добавляем стандартные праздничные дни для страны
96
- model.add_country_holidays(country_name=country_name)
97
- model.fit(full_train_data3)
98
- future = model.make_future_dataframe(periods=full_test_data3.shape[0] + period, freq='D')
99
- forecast3 = model.predict(future)
100
- # Отрисовка графика
101
- fig = go.Figure()
102
- fig = plot_plotly(model, forecast3)
103
- fig.add_trace(go.Scatter(x=full_test_data3['ds'],
104
- y=full_test_data3['y'],
105
- mode='markers',
106
- marker=dict(color='orchid'),
107
- name='Факт значения'))
108
- fig.add_trace(go.Scatter(x=forecast3['ds'].iloc[-period:], y=forecast3['yhat'].iloc[-period:], mode='lines', name='Прогноз на +14 дней'))
109
- fig.update_layout(title_text=text1, xaxis_rangeslider_visible=True, xaxis_title='', yaxis_title='')
110
- fig.update_traces(showlegend=True)
111
- st.plotly_chart(fig, use_container_width=True, range_slider_visible=True)
112
- # Расчет метрик на тестовой выборке
113
- actual_values_test = full_test_data3['y'].values
114
- predicted_values_test = forecast3['yhat'].iloc[-period:].values
115
- mape_test = np.mean(np.abs((actual_values_test - predicted_values_test) / actual_values_test)) * 100
116
- rmse_test = np.sqrt(mean_squared_error(actual_values_test, predicted_values_test))
117
- check = st.checkbox(text2)
118
- if check:
119
- col1, col2 = st.columns([1, 1])
120
- with col1:
121
- st.write("**Информация.** \
122
- Прогноз сделан по нескольким дням прошлого и нескольким дням будущего периода.")
123
- st.markdown("**Метрики для тестовой выборки:**")
124
- st.write(f"MAPE: {mape_test:.2f}%")
125
- st.write(f"RMSE: {rmse_test:.2f}")
126
- # Оценка тренда на первый день
127
- trend_evaluation_first_day = evaluate_trend_first_day(predicted_values_test, actual_values_test)
128
- st.write(trend_evaluation_first_day)
129
- # Оценка тренда на период прогноза
130
- trend_evaluation_period = evaluate_trend_period(predicted_values_test)
131
- st.write(trend_evaluation_period)
132
- with col2:
133
- forecast_results = pd.DataFrame({
134
- 'Дата': forecast3['ds'].iloc[-period:].values,
135
- 'Прогноз': forecast3['yhat'].iloc[-period:].values.round(2)
136
- })
137
- st.dataframe(forecast_results.set_index('Дата'))
138
-
139
- text1_dji = f'График прогноза для {period} дней по индексу Dow Jones, USD 🇺🇸'
140
- text2_dji = f"Результаты прогноза по Dow Jones Industrial Average"
141
- index(dji, 'US', text1_dji, text2_dji)
142
-
143
- text1_500 = f'График прогноза для {period} дней по индексу S&P 500, USD 🇺🇸'
144
- text2_500 = f"Результаты прогноза по S&P 500"
145
- index(data_500, 'US', text1_500, text2_500)
146
-
147
- text1_sse = f'График прогноза для {period} дней по индексу SSE Composite, CNY 🇨🇳'
148
- text2_sse = f"Результаты прогноза по SSE Composite Index"
149
- index(sse, 'China', text1_sse, text2_sse)
150
-
151
- text1_imoex = f'График прогноза для {period} дней по индексу MOEX Russia, RUB 🇷🇺'
152
- text2_imoex = f"Результаты прогноза по MOEX Russia Index"
153
- index(imoex, 'Russia', text1_imoex, text2_imoex)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/2_💲 _Прогноз_акций.py DELETED
@@ -1,126 +0,0 @@
1
- import streamlit as st
2
- import yfinance as yf
3
- import pandas as pd
4
- import numpy as np
5
- import matplotlib.pyplot as plt
6
- from datetime import date
7
- from sklearn.model_selection import train_test_split
8
- from prophet import Prophet
9
- from prophet.plot import plot_plotly
10
- from plotly import graph_objs as go
11
- from prophet.make_holidays import make_holidays_df
12
- from sklearn.metrics import mean_absolute_error, mean_squared_error
13
-
14
- st.set_page_config(layout='wide', initial_sidebar_state='expanded')
15
- st.set_option('deprecation.showPyplotGlobalUse', False)
16
- st.title('ML Wall Street')
17
- st.image('images/img.png')
18
-
19
- START = "2020-01-01"
20
- TODAY = date.today().strftime("%Y-%m-%d")
21
-
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('Количество дней прогноза:', 1, 14, 14)
26
-
27
- # @st.cache_data
28
- def load_data(ticker):
29
- data = yf.download(ticker, START, TODAY)
30
- data.reset_index(inplace=True)
31
- return data
32
-
33
- data = load_data(selected_stock)
34
- latest_date = data['Date'].iloc[-1].strftime('%Y-%m-%d')
35
- st.markdown(f"<h3 style='text-align: center;'>Цены актуальны на последнюю дату закрытия торгов {latest_date}</h3>", unsafe_allow_html=True)
36
-
37
- def evaluate_trend_first_day(predicted_values, actual_values):
38
- # Разница между первым днем прогноза и последним днем тестовых данных
39
- forecast_diff_first_last = predicted_values[0] - actual_values[-1]
40
- # Оценка тренда на первый день: рост, падение, стабильность
41
- if forecast_diff_first_last > 0:
42
- return "Тенденция на первый день: Рост"
43
- elif forecast_diff_first_last < 0:
44
- return "Тенденция на первый день: Падение"
45
- else:
46
- return "Тенденция на первый день: Стабильность"
47
-
48
- def evaluate_trend_period(predicted_values):
49
- # Разница между первым и последним значением прогноза
50
- forecast_diff = predicted_values[-1] - predicted_values[0]
51
- # Оценка тренда на весь период прогноза: рост, падение, стабильность
52
- print("Разница между первым и последним значением прогноза:", forecast_diff)
53
-
54
- if forecast_diff > 0:
55
- return "Тенденция на период прогноза: Рост"
56
- elif forecast_diff < 0:
57
- return "Тенденция на период прогноза: Падение"
58
- else:
59
- return "Тенденция на период прогноза: Стабильность"
60
-
61
- def ticker(data, text1, text2):
62
- data = data
63
- data = data.rename(columns={'Date': 'ds', 'Adj Close': 'y'})
64
- # Разделение данных на обучающую и тестовую выборки
65
- full_train_data3, full_test_data3 = train_test_split(data, test_size=period, shuffle=False)
66
-
67
- # Удаляем временную зону из столбца ds
68
- full_train_data3['ds'] = full_train_data3['ds'].dt.tz_localize(None)
69
- full_test_data3['ds'] = full_test_data3['ds'].dt.tz_localize(None)
70
-
71
- # Создаем модель Prophet
72
- model = Prophet(interval_width=0.95)
73
- # Добавляем стандартные праздничные дни для страны
74
- model.add_country_holidays(country_name='US')
75
- model.fit(full_train_data3)
76
- future = model.make_future_dataframe(periods=full_test_data3.shape[0] + period, freq='D')
77
- forecast3 = model.predict(future)
78
- # Отрисовка графика
79
- fig = go.Figure()
80
- fig = plot_plotly(model, forecast3)
81
- fig.add_trace(go.Scatter(x=full_test_data3['ds'],
82
- y=full_test_data3['y'],
83
- mode='markers',
84
- marker=dict(color='orchid'),
85
- name='Факт значения'))
86
- fig.add_trace(go.Scatter(x=forecast3['ds'].iloc[-period:], y=forecast3['yhat'].iloc[-period:], mode='lines', name='Прогноз на +14 дней'))
87
- fig.update_layout(title_text=text1, xaxis_rangeslider_visible=True, xaxis_title='', yaxis_title='')
88
- fig.update_traces(showlegend=True)
89
- st.plotly_chart(fig, use_container_width=True, range_slider_visible=True)
90
- # Расчет метрик на тестовой выборке
91
- actual_values_test = full_test_data3['y'].values
92
- predicted_values_test = forecast3['yhat'].iloc[-period:].values
93
- mape_test = np.mean(np.abs((actual_values_test - predicted_values_test) / actual_values_test)) * 100
94
- rmse_test = np.sqrt(mean_squared_error(actual_values_test, predicted_values_test))
95
- # Рассчитываем кастомную метрику точности прогноза для 1 дня с учетом весов предыдущих 7 дней
96
- forecast_values = forecast3['yhat'].tail(period).values
97
- predicted_value = forecast_values[0] # Выбираем первый предсказанный день из последних 14
98
- actual_values = full_test_data3['y'].tail(7).values
99
- weights = np.array([1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4])
100
- custom_mape = np.dot(weights, np.abs((actual_values - predicted_value) / actual_values)) / np.sum(weights) * 100
101
- check = st.checkbox(text2)
102
- if check:
103
- col1, col2 = st.columns([1, 1])
104
- with col1:
105
- st.write("**Информация.** \
106
- Прогноз сделан по нескольким дням прошлого и нескольким дням будущего периода.")
107
- st.markdown("**Метрики для тестовой выборки:**")
108
- st.write(f"RMSE: {rmse_test:.2f}")
109
- st.write(f"MAPE: {mape_test:.2f}%")
110
- st.write(f"Custom MAPE: {custom_mape:.2f}")
111
- # Оценка тренда на первый день
112
- trend_evaluation_first_day = evaluate_trend_first_day(predicted_values_test, actual_values_test)
113
- st.write(trend_evaluation_first_day)
114
- # Оценка тренда на период прогноза
115
- trend_evaluation_period = evaluate_trend_period(predicted_values_test)
116
- st.write(trend_evaluation_period)
117
- with col2:
118
- forecast_results = pd.DataFrame({
119
- 'Дата': forecast3['ds'].iloc[-period:].values,
120
- 'Прогноз': forecast3['yhat'].iloc[-period:].values.round(2)
121
- })
122
- st.dataframe(forecast_results.set_index('Дата'))
123
-
124
- text1 = f'График прогноза для {period} дней по акции {selected_stock}, USD 🇺🇸'
125
- text2 = f"Результаты прогноза {selected_stock}"
126
- ticker(data, text1, text2)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pages/3_📊 _Аналитическая_справка.py DELETED
@@ -1,12 +0,0 @@
1
- import streamlit as st
2
- from datetime import date
3
-
4
- import yfinance as yf
5
- from prophet import Prophet
6
- from prophet.plot import plot_plotly
7
- from plotly import graph_objs as go
8
-
9
- st.set_page_config(layout='wide', initial_sidebar_state='expanded')
10
- st.set_option('deprecation.showPyplotGlobalUse', False)
11
- st.title('ML Wall Street')
12
- st.image('images/img.png')