[*********************100%***********************]  1 of 1 completed
Оптимальное количество шагов: 8
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-e672a9833b59> in <cell line: 95>()
     93 # Создание дат для будущих прогнозов
     94 last_date = close_prices.index[-1]
---> 95 future_dates = pd.date_range(last_date, periods=n_future+1, closed='right')
     96 
     97 # Объединение исторических данных и прогнозов

/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/datetimes.py in date_range(start, end, periods, freq, tz, normalize, name, inclusive, unit, **kwargs)
   1006         freq = "D"
   1007 
-> 1008     dtarr = DatetimeArray._generate_range(
   1009         start=start,
   1010         end=end,

TypeError: DatetimeArray._generate_range() got an unexpected keyword argument 'closed'

вот код 

# Импорт необходимых библиотек
import yfinance as yf
import numpy as np
import pandas as pd
from scipy.optimize import differential_evolution
import matplotlib.pyplot as plt

# Загрузка данных EUR/USD
data = yf.download('EURUSD=X', start='2010-01-01', end='2023-10-01')
close_prices = data['Close']

# Проверка на наличие пропущенных значений
close_prices = close_prices.dropna()

# Преобразование цен закрытия в numpy массив
prices = close_prices.values

# Нормализация данных
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
prices_scaled = scaler.fit_transform(prices.reshape(-1,1)).flatten()

# Разделение на обучающую и тестовую выборки
split = int(len(prices_scaled) * 0.8)
train_data = prices_scaled[:split]
test_data = prices_scaled[split:]

# Функция для создания обучающих данных
def create_dataset(data, n_steps):
    X, y = [], []
    for i in range(len(data)-n_steps):
        X.append(data[i:i+n_steps])
        y.append(data[i+n_steps])
    return np.array(X), np.array(y)

# Целевая функция для оптимизации
def objective(n_steps):
    n_steps = int(n_steps[0])
    # Ограничиваем n_steps от 1 до 20
    if n_steps < 1 or n_steps > 20:
        return np.inf
    X_train, y_train = create_dataset(train_data, n_steps)
    # Проверяем, есть ли достаточно данных для обучения
    if len(X_train) == 0:
        return np.inf
    # Обучаем простую линейную регрессию
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    model.fit(X_train, y_train)
    # Проверяем на тестовых данных
    X_test, y_test = create_dataset(test_data, n_steps)
    if len(X_test) == 0:
        return np.inf
    predictions = model.predict(X_test)
    # Вычисляем ошибку
    from sklearn.metrics import mean_squared_error
    mse = mean_squared_error(y_test, predictions)
    return mse

# Запуск оптимизации
bounds = [(1, 20)]  # Границы для n_steps

result = differential_evolution(objective, bounds, strategy='best1bin', maxiter=10, popsize=15, tol=0.01, seed=42)

optimal_n_steps = int(result.x[0])
print(f"Оптимальное количество шагов: {optimal_n_steps}")

# Создание обучающего и всего набора данных с оптимальным n_steps
X_train, y_train = create_dataset(train_data, optimal_n_steps)
X_full, y_full = create_dataset(prices_scaled, optimal_n_steps)

# Обучение модели на всех данных
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_full, y_full)

# Функция для прогнозирования будущих значений
def forecast_future(model, data, n_steps, n_future):
    last_steps = data[-n_steps:].tolist()
    predictions = []
    for _ in range(n_future):
        X = np.array(last_steps[-n_steps:]).reshape(1, -1)
        y_pred = model.predict(X)[0]
        predictions.append(y_pred)
        last_steps.append(y_pred)
    return predictions

# Прогнозирование будущих значений
n_future = 30  # Количество дней для прогнозирования
future_predictions_scaled = forecast_future(model, prices_scaled, optimal_n_steps, n_future)
future_predictions = scaler.inverse_transform(np.array(future_predictions_scaled).reshape(-1,1)).flatten()

# Создание дат для будущих прогнозов
last_date = close_prices.index[-1]
future_dates = pd.date_range(last_date, periods=n_future+1, closed='right')

# Объединение исторических данных и прогнозов
all_dates = close_prices.index.append(future_dates)
all_prices = np.concatenate((prices, future_predictions))

# Визуализация результатов
plt.figure(figsize=(14,7))
plt.plot(close_prices.index, prices, label='Исторические данные', color='blue')
plt.plot(future_dates, future_predictions, label='Прогнозы', color='red', linestyle='--')
plt.legend()
plt.title('Прогнозирование EUR/USD на будущее')
plt.xlabel('Дата')
plt.ylabel('Цена EUR/USD')
plt.grid(True)
plt.show()