Можно ли предсказать, куда пойдет цена на золото?

Да, давайте воспользуемся техникой регрессии машинного обучения, чтобы спрогнозировать цену одного из самых важных драгоценных металлов - Золота.

Мы создадим модель линейной регрессии машинного обучения, которая берет информацию из прошлых цен Gold ETF (GLD) и возвращает прогноз цены Gold ETF на следующий день.

GLD - крупнейший ETF для прямых инвестиций в физическое золото. (источник: http://www.etf.com/GLD)

Шаги по прогнозированию цен на золото с помощью машинного обучения на Python

  1. Импортируйте библиотеки и прочтите данные Gold ETF
  2. Определите независимые переменные
  3. Определить зависимую переменную
  4. Разделите данные на обучающий и тестовый набор данных
  5. Создайте модель линейной регрессии
  6. Прогнозируйте цены Gold ETF

Импортируйте библиотеки и прочтите данные Gold ETF

Перво-наперво: импортируйте все необходимые библиотеки, которые требуются для реализации этой стратегии.

# LinearRegression is a machine learning library for linear regression 
from sklearn.linear_model import LinearRegression 
# pandas and numpy are used for data manipulation 
import pandas as pd 
import numpy as np 
# matplotlib and seaborn are used for plotting graphs 
import matplotlib.pyplot as plt 
import seaborn 
# fix_yahoo_finance is used to fetch data 
import fix_yahoo_finance as yf

Затем мы читаем ежедневные данные о ценах на ETF на золото за последние 10 лет и сохраняем их в Df. Мы удаляем ненужные столбцы и удаляем значения NaN с помощью функции dropna (). Затем мы строим график цены закрытия Gold ETF.

# Read data 
Df = yf.download('GLD','2008-01-01','2017-12-31')
# Only keep close columns 
Df=Df[['Close']] 
# Drop rows with missing values 
Df= Df.dropna() 
# Plot the closing price of GLD 
Df.Close.plot(figsize=(10,5)) 
plt.ylabel("Gold ETF Prices")
plt.show()

Вывод:

Определите независимые переменные

Объясняющая переменная - это переменная, которой манипулируют для определения стоимости Gold ETF на следующий день. Проще говоря, это функции, которые мы хотим использовать для прогнозирования цены Gold ETF. Объясняющими переменными в этой стратегии являются скользящие средние за последние 3 и 9 дней. Мы сбрасываем значения NaN с помощью функции dropna () и сохраняем переменные функции в X.

Однако вы можете добавить к X больше переменных, которые, по вашему мнению, полезны для прогнозирования цен Gold ETF. Эти переменные могут быть техническими индикаторами, ценой другого ETF, такого как Gold miners ETF (GDX) или Oil ETF (USO), или экономическими данными США.

Df['S_3'] = Df['Close'].shift(1).rolling(window=3).mean() 
Df['S_9']= Df['Close'].shift(1).rolling(window=9).mean() 
Df= Df.dropna() 
X = Df[['S_3','S_9']] 
X.head()

Вывод:

Определить зависимую переменную

Точно так же зависимая переменная зависит от значений независимых переменных. Проще говоря, мы пытаемся предсказать цену Gold ETF. Мы храним цену Gold ETF в y.

y = Df['Close']
y.head()

Вывод:

Дата

2008–02–08 91.000000

2008–02–11 91.330002

2008–02–12 89.330002

2008–02–13 89.440002

2008–02–14 89.709999

Имя: Close, dtype: float64

Разделите данные на обучающий и тестовый набор данных

На этом этапе мы разделяем предикторы и выходные данные на обучающие и тестовые данные. Данные обучения используются для создания модели линейной регрессии путем объединения входных данных с ожидаемыми выходными данными. Данные теста используются для оценки того, насколько хорошо модель обучена.

  1. Первые 80% данных используются для обучения, а остальные - для тестирования.
  2. X_train и y_train - набор данных для обучения
  3. X_test и y_test - набор тестовых данных
t=.8 
t = int(t*len(Df)) 
# Train dataset 
X_train = X[:t] 
y_train = y[:t]  
# Test dataset 
X_test = X[t:] 
y_test = y[t:]

Создайте модель линейной регрессии

Теперь мы создадим модель линейной регрессии. Но что такое линейная регрессия?

Если мы попытаемся уловить математическую связь между переменными «x» и «y», которая «лучше всего» объясняет наблюдаемые значения «y» в терминах наблюдаемых значений «x», подгоняя линию через диаграммы разброса, то такое уравнение между x и y называется линейным регрессионным анализом.

Чтобы разбить это дальше, регрессия объясняет изменение зависимой переменной в терминах независимых переменных. Зависимая переменная - «y» - это переменная, которую вы хотите предсказать. Независимые переменные - «x» - это независимые переменные, которые вы используете для прогнозирования зависимой переменной. Следующее уравнение регрессии описывает эту связь:

Y = m1 * X1 + m2 * X2 + C
Gold ETF price = m1 * 3 days moving average + m2 * 15 days moving average + c

Затем мы используем метод подбора, чтобы подобрать независимые и зависимые переменные (x’s и y’s), чтобы получить коэффициент и константу для регрессии.

linear = LinearRegression().fit(X_train,y_train) 
print "Gold ETF Price =", round(linear.coef_[0],2), \ 
"* 3 Days Moving Average", round(linear.coef_[1],2), \ 
"* 9 Days Moving Average +", round(linear.intercept_,2)

Вывод:

Цена Gold ETF = 1,2 * 3-дневная скользящая средняя - 0,2 * 9-дневная скользящая средняя + 0,39

Прогнозирование цен Gold ETF

Теперь пора проверить, работает ли модель в тестовом наборе данных. Мы прогнозируем цены Gold ETF, используя линейную модель, созданную с использованием набора данных поезда. Метод прогнозирования находит цену Gold ETF (y) для данной объясняющей переменной X.

predicted_price = linear.predict(X_test)  
predicted_price = pd.DataFrame(predicted_price,index=y_test.index,columns = ['price'])  
predicted_price.plot(figsize=(10,5))  
y_test.plot()  
plt.legend(['predicted_price','actual_price'])  
plt.ylabel("Gold ETF Price")  
plt.show()

Вывод:

График показывает прогнозируемую и фактическую цену Gold ETF.

Теперь давайте вычислим степень соответствия с помощью функции score ().

r2_score = linear.score(X[t:],y[t:])*100  
float("{0:.2f}".format(r2_score))

Вывод:

95.81%

Как видно, R-квадрат модели составляет 95,81%. R-квадрат всегда находится в диапазоне от 0 до 100%. Оценка, близкая к 100%, указывает на то, что модель хорошо объясняет цены Gold ETF.

Поздравляю! Вы только что освоили фундаментальную, но сильную технику машинного обучения. Спасибо за прочтение!