Как спрогнозировать поведение цены по предсказаниям модели на неделю вперед?Python

Программы на Python
Anonymous
Как спрогнозировать поведение цены по предсказаниям модели на неделю вперед?

Сообщение Anonymous »

Я написал простейшую модель линейной регрессии (я нуб, не ругайте меня, это моя первая модель) для прогнозирования цены соланы, хотелось бы получить совет или подсказку, как ее улучшить . Главный вопрос: как сделать прогноз, например, на неделю вперед, и визуализировать его?

Код: Выделить всё

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import (
accuracy_score,
mean_absolute_error,
mean_squared_error,
confusion_matrix,
r2_score,
precision_score,
recall_score
)
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

from IPython.display import display
pd.options.display.width = None
pd.options.display.float_format = '{:,.1f}'.format

df = pd.read_csv('C:/Users/1/Desktop/data_ml/solana-historical-data.csv')
price_sol_pred = pd.read_csv('C:/Users/1/Desktop/data_ml/solana-historical-data-test-ml.csv')
display(df)

df = df.rename(columns={'Дата': 'date',
'Открытие': 'opening_price',
'Макс': 'max_price',
'Мин': 'min_price',
'Средняя': 'avg_price',
'Закрытие': 'closing_price',
'Изм.': 'change_%',
'Объём': 'volume',
'Изм. Объема': 'change_volume',
'Капитализ.': 'market_cap',
'change_volume Капитализ.': 'change_market_cap'
})

price_sol_pred = price_sol_pred.rename(columns={'Дата': 'date',
'Открытие': 'opening_price',
'Макс': 'max_price',
'Мин': 'min_price',
'Средняя': 'avg_price',
'Закрытие': 'closing_price',
'Изм.': 'change_%',
'Объём': 'volume',
'Изм.  Объема': 'change_volume',
'Капитализ.': 'market_cap',
'change_volume Капитализ.': 'change_market_cap'
})

def convert_to_float(ds, columns):
for column in columns:
ds[column] = (ds[column].str.replace('$', '').str.replace(',', '').astype('float'))
return ds

df['date'] = pd.to_datetime(df['date'])
df['day_num'] = df['date'].dt.dayofweek

price_sol_pred['date'] = pd.to_datetime(price_sol_pred['date'])
price_sol_pred['day_num'] = price_sol_pred['date'].dt.dayofweek

df = convert_to_float(df,
['opening_price',
'max_price',
'min_price',
'avg_price',
'closing_price',
'volume',
'market_cap'])

price_sol_pred = convert_to_float(price_sol_pred,
['opening_price',
'max_price',
'min_price',
'avg_price',
'closing_price',
'volume',
'market_cap'])

df.dropna(inplace=True)
price_sol_pred.dropna(inplace=True)
price_sol_pred = price_sol_pred.drop('closing_price', axis=1)

RANDOM_STATE = 42

X = df.drop('closing_price', axis=1)
y = df['closing_price']

X_train, X_test, y_train, y_test = train_test_split(
X,
y,
random_state=RANDOM_STATE)

cat_col_names = ['day_num']
num_col_names = ['opening_price', 'change_%', 'volume', 'change_volume']

encoder = OneHotEncoder(drop='first', sparse_output=False)
X_train_ohe = encoder.fit_transform(X_train[cat_col_names])
X_test_ohe = encoder.transform(X_test[cat_col_names])
encoder_col_names = encoder.get_feature_names_out()

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train[num_col_names])
X_test_scaled = scaler.transform(X_test[num_col_names])

X_train_ohe = pd.DataFrame(X_train_ohe, columns=encoder_col_names)
X_test_ohe = pd.DataFrame(X_test_ohe, columns=encoder_col_names)

X_train_scaled = pd.DataFrame(X_train_scaled, columns=num_col_names)
X_test_scaled = pd.DataFrame(X_test_scaled, columns=num_col_names)

X_train = pd.concat([X_train_ohe, X_train_scaled], axis=1)
X_test = pd.concat([X_test_ohe, X_test_scaled], axis=1)

model_lr = LinearRegression()
model_lr.fit(X_train, y_train)
predictions = model_lr.predict(X_test)

print(model_lr.coef_, model_lr.intercept_)
r2 = r2_score(y_test, predictions)
print(f'R2 = {r2:.3f}')
mae = mean_absolute_error(y_test, predictions)
print(f'MAE = {mae:.3f}')
mse = mean_squared_error(y_test, predictions)
print(f'MSE = {mse:.3f}')
rmse = np.sqrt(mse)
print(f'RMSE = {rmse:.3f}')

residuals = y_test - predictions
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 10))
axes[0].hist(residuals)
axes[0].set_title('Histogram of residual distribution')
axes[0].set_xlabel('Remains')

axes[1].scatter(predictions, residuals)
axes[1].set_xlabel('Model predictions')
axes[1].set_ylabel('Remains')
axes[1].set_title('Scatterplot')
plt.show()

cat_col_names = ['day_num']
num_col_names = ['opening_price', 'change_%', 'volume', 'change_volume']

sol_ml_ohe = encoder.transform(price_sol_pred[cat_col_names])
encoder_col_names = encoder.get_feature_names_out()

sol_ml_scaled = scaler.transform(price_sol_pred[num_col_names])
X_test_ohe = pd.DataFrame(sol_ml_ohe, columns=encoder_col_names)
X_test_scaled = pd.DataFrame(sol_ml_scaled, columns=num_col_names)

X_test = pd.concat([X_test_ohe, X_test_scaled], axis=1)

predictions_sol_price = model_lr.predict(X_test)
price_sol_pred['predicted_price'] = predictions_sol_price

display(price_sol_pred.sample(5))
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(price_sol_pred.index, price_sol_pred['predicted_price'], label='Predicted Closing Price')
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.set_title('Actual vs Predicted Closing Prices')
ax.legend()
plt.show()
В любом случае, я просто хотел услышать хороший совет. Я вообще не умею предсказывать будущее.

Подробнее здесь: https://stackoverflow.com/questions/786 ... week-ahead

Вернуться в «Python»