自古以来, 黄金一直作为货币而存在, 就是在今天, 黄金也具有非常高的储藏价值, 那么有没有可能预测出黄金价格的变化趋势呢?
答案是肯定的, 让我们使用机器学习中的回归算法来预测世界上贵重金属之一, 黄金的价格吧
我们将建立一个机器学习线性回归模型, 它将从黄金 ETF (GLD)的历史价格中获取信息, 并返回黄金 ETF 价格在第二天的预测值
GLD 是最大的以黄金进行直接投资的 ETF 交易基金
(详见: http://www.etf.com/GLD)
在 python 的开发环境下用机器学习预测黄金价格的步骤:
导入 Python 库并读取黄金 ETF 的数据
定义解释变量
将数据切分为模型训练数据集和测试数据集
建立线性回归模型
预测黄金 ETF 的价格
导入 Python 库并读取黄金 ETF 的数据
首先: 导入实现此策略所需的所有必要的库(LinearRegression,pandas,numpy,matplotlib,seaborn 和 fix_yahoo_finance)
- # 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
然后我们读取过去 10 年间每天黄金 ETF 的价格数据, 并将数据储存在 Df 中我们移除那些不相关的变量并使用 dropna 函数删除 NaN 值然后我们绘制出黄金 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()
输出
定义解释变量
解释变量是被用来决定第二天黄金 ETF 价格数值的变量简单地说, 就是我们用来预测黄金 ETF 价格的特征值本例中的解释变量是过去 3 天和 9 天的价格移动平均值我们使用 dropna()函数删除 NaN 值, 并将特征变量存于 X 中
然而, 你还可以在 X 中放入更多你认为对于预测黄金 ETF 价格有用的变量这些变量可以是技术指标, 也可以是另一种 ETF 的价格 (如黄金矿工 ETF (简称 GDX) 或石油 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()
输出
定义因变量
同样, 因变量是取决于解释变量的被解释变量简单地说, 在这里就是我们试图预测的黄金 ETF 价格我们将黄金 ETF 的价格赋值为 y
- y = Df['Close']
- y.head()
输出
将数据切分为模型训练数据集和测试数据集
在此步骤中, 我们将预测变量 (解释变量) 数据和输出 (因变量) 数据拆分为训练数据集和测试数据集训练数据用于建立线性回归模型, 将输入与预期输出配对测试数据用于评估模型的训练效果
前 80% 的数据用于训练模型, 其余的数据用来测试模型
X_train 和 y_train 是训练数据集
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:]
建立线性回归模型
接下来我们将建立一个线性回归模型什么是线性回归呢?
如果我们试图捕捉可以最优解释 Y 观测值的 X 变量和 Y 变量之间的数学关系, 我们将在 X 的观测值形成的散点图中去拟合一条线, 那么这条线, 也就是 x 和 y 之间的方程就被称为线性回归分析
再进一步地说, 回归解释了因变量在自变量上的变化因变量 y 是你想要预测的变量自变量 x 是用来预测因变量的解释变量下面的回归方程描述了这种关系:
Y = m1 * X1 + m2 * X2 + CGold ETF price = m1 * 3 days moving average + m2 * 15 days moving average + c
然后我们利用拟合方法来拟合自变量和因变量(x 和 y), 从而生成系数和回归常数
- 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)
输出
黄金 ETF 价格 = 1.2×3 天的移动平均价-0.2×9 天的移动平均价 + 0.39
预测黄金 ETF 的价格
现在, 是时候检查模型是否在测试数据集中有效了我们使用由训练数据集建立的线性模型来预测黄金 ETF 的价格预测模型可以得到给定解释变量 X 后相应的黄金 ETF 价格(y)
- 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()
输出
图表显示了黄金 ETF 价格的预测值和实际值(蓝线是预测值, 绿线是实际值)
现在, 让我们使用 score()函数来计算模型的拟合优度
- r2_score = linear.score(X[t:],y[t:])*100
- float("{0:.2f}".format(r2_score))
可以看出, 模型的 R² 是 95.81%R² 总是在 0 到 100% 之间接近 100% 的分数表明该模型能很好地解释黄金 ETF 的价格
祝贺你, 你刚刚学会了一种基本而又强大的机器学习技巧
来源: https://yq.aliyun.com/articles/484285