Прогнозируем курс EURUSD используя фундаментальные факторы
Я провел небольшое исследование о влиянии уровня безработицы, уровня инфляции и процентной ставки на обменный курс EURUSD. Это было довольно простое упражнение.
Данные
Прежде всего я подготовил данные. Это невероятно маленький набор данных (годовые данные с 2009 по 2017 год), к которому никто не должен относиться серьезно, но я думаю, что он достаточен для демонстрационных целей. В основном, я находил данные на Kaggle, а затем без каких-либо статистических тестов просто брал разницы первого порядка, вычитая текущее значение из предыдущего (насколько я помню, это нужно делать, чтобы сделать временной ряд стационарным).
eu_inf и us_inf — уровень инфляции, eu_unem и us _unem — уровень безработицы, а eu_ir и us_ir — процентные ставки ЕЦБ и ФРС соответственно.
+------------+--------+--------+---------+---------+-------+-------+----------------+
| date | eu_inf | us_inf | eu_unem | us_unem | eu_ir | us_ir | eurusd |
+------------+--------+--------+---------+---------+-------+-------+----------------+
| 01.01.2009 | -2.7 | -5.2 | 2.06 | 3.47 | -1.5 | -0.04 | 0.03471052647 |
| 01.01.2010 | 1.1 | 3.4 | 0.53 | 0.38 | 0 | 0.06 | -0.1025825739 |
| 01.01.2011 | 1 | 1.3 | 0.04 | -0.68 | 0 | -0.11 | -0.03451800346 |
| 01.01.2012 | -0.5 | -1.7 | 1.18 | -0.88 | -0.75 | 0.09 | 0.02716350555 |
| 01.01.2013 | -1.1 | -0.9 | 0.64 | -0.7 | -0.2 | -0.07 | 0.05823683739 |
| 01.01.2014 | -0.9 | 0 | -0.33 | -1.2 | 0 | 0.03 | -0.1648008823 |
| 01.01.2015 | -0.5 | -2.1 | -0.76 | -0.89 | -0.05 | 0.12 | -0.1228066683 |
| 01.01.2016 | 0.1 | 1.3 | -0.83 | -0.41 | 0 | 0.3 | -0.04139769077 |
| 01.01.2017 | 1.5 | 1.2 | -0.96 | -0.51 | 0 | 0.12 | 0.006424665451 |
+------------+--------+--------+---------+---------+-------+-------+----------------+
Код
После очистки данных и выравнивания их по дате я сохранил их в Excel и загрузил через pandas, на всякий случай удалил NaN, чтобы точно не скопировать какие-нибудь пустые ячейки.
X — это все наши факторы — инфляция, процентная ставка, безработица, Y — обменный курс. Теперь нам нужно разделить эти данные на обучающую и тестовую выборку. Я выбрал Random Forest Regression, которая, вроде бы, лучше подходит для прогнозирования наборов временных рядов, и оценил модель.
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
import matplotlib.pyplot as plt
# Step 1: Load the data
data = pd.read_excel('eur_usd_data_3.xlsx', parse_dates=['date'])
# Step 3: Preprocessing
data = data.dropna() # Drop rows with missing values
data['eurusd'] = data['eurusd'].shift(-1) # Predict next day's rate
data = data.dropna() # Drop rows again after shifting
# Step 4: Feature and Target
X = data.drop(columns=['date', 'eurusd'])
y = data['eurusd']
# Step 5: Split into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Step 6: Train the model
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Step 7: Evaluate the model
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Absolute Error: {mae}")
print(f"Mean Squared Error: {mse}")
# Step 8: Plot predictions vs actual values
plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label='Actual')
plt.plot(y_pred, label='Predicted')
plt.legend()
plt.title('EUR/USD Exchange Rate Prediction')
plt.show()
# Step 9: Feature Importance
feature_importance = pd.DataFrame({'Feature': X.columns, 'Importance': model.feature_importances_})
feature_importance = feature_importance.sort_values(by='Importance', ascending=False)
print(feature_importance)

Я думаю, что ошибка небольшая — MAE (Mean Absolute Error) 0.05, MSE(Mean Squared Error) 0.0025. А под графиком можно увидеть коэффиценты для каждого фактора.
Результаты
Итак, давайте сделаем прогноз на основе последних данных, опубликованных по состоянию на 29.12.2024. Это снова разница между последним и предыдущим значением.

Модель предполагает, что в 2025 году пара EURUSD будет торговаться на уровне 1,02791873. Это соответствует фундаментальным предпосылкам и ожиданиям рынка с точки зрения тренда. ЕЦБ хочет снизить ставки в следующем году, в то время как ФРС стал более осторожен в своих прогнозах, процентная ставка ЕЦБ ниже, чем процентная ставка ФРС, поэтому рынок ожидает, что евро будет слабее, чем доллар США.
