[译] 用 Python 搭建机器学习模型预测黄金价格

314719755 7年前
   <p><img src="https://simg.open-open.com/show/f1a9cca9a5e9bdcb16f084a13df4850e.jpg"></p>    <p>大数据文摘作品</p>    <p><strong>编译</strong> <strong>:</strong> <strong>小明同学君、吴双、Y</strong> <strong>awei xia</strong></p>    <p>新年总是跟黄金密不可分。新年第一天,让我们尝试用python搭建一个机器学习线性回归模型,预测金价!</p>    <p>自古以来,黄金一直作为货币而存在,就是在今天,黄金也具有非常高的储藏价值,那么有没有可能预测出黄金价格的变化趋势呢?</p>    <p>答案是肯定的,让我们使用机器学习中的回归算法来预测世界上贵重金属之一,黄金的价格吧。</p>    <p>我们将建立一个机器学习线性回归模型,它将从黄金ETF (GLD)的历史价格中获取信息,并返回黄金ETF价格在第二天的预测值。</p>    <p>GLD 是最大的以黄金进行直接投资的ETF交易基金。</p>    <p>( 详见: http://www.etf.com/GLD )</p>    <p>在python的开发环境下用机器学习预测黄金价格的步骤:</p>    <ul>     <li> <p>导入Python库并读取黄金ETF 的数据</p> </li>     <li> <p>定义解释变量</p> </li>     <li> <p>将数据切分为模型训练数据集和测试数据集</p> </li>     <li> <p>建立线性回归模型</p> </li>     <li> <p>预测黄金ETF的价格</p> </li>    </ul>    <p>导入Python库并读取黄金 ETF 的数据</p>    <p>首先:导入实现此策略所需的所有必要的库( LinearRegression,pandas,numpy,matplotlib,seaborn和fix_yahoo_finance )</p>    <p># LinearRegression is a machine learning library for linear regression<br> from sklearn.linear_model import LinearRegression<br> # pandas and numpy are used for data manipulation<br> import pandas as pd<br> import numpy as np<br> # matplotlib and seaborn are used for plotting graphs<br> import matplotlib.pyplot as plt<br> import seaborn<br> # fix_yahoo_finance is used to fetch data import fix_yahoo_finance as yf</p>    <p>然后我们读取过去10年间每天黄金ETF的价格数据,并将数据储存在Df中。我们移除那些不相关的变量并使用dropna函数删除NaN值。然后我们绘制出黄金ETF的收盘价格。</p>    <p># Read data<br> Df = yf.download( 'GLD' , '2008-01-01' , '2017-12-31' )<br> # Only keep close columns<br> Df=Df[[ 'Close' ]]<br> # Drop rows with missing values<br> Df= Df.dropna()<br> # Plot the closing price of GLD<br> Df.Close.plot(figsize=( 10 , 5 ))<br> plt.ylabel( "Gold ETF Prices" )<br> plt.show()</p>    <p>输出</p>    <p><img src="https://simg.open-open.com/show/d80e2669f082d9060e113094d349d376.jpg"></p>    <p>定义解释变量</p>    <p>解释变量是被用来决定第二天黄金ETF价格数值的变量。简单地说,就是我们用来预测黄金ETF价格的特征值。本例中的解释变量是过去3天和9天的价格移动平均值。我们使用dropna()函数删除NaN值,并将特征变量存于X中。</p>    <p>然而,你还可以在X中放入更多你认为对于预测黄金ETF价格有用的变量。这些变量可以是技术指标,也可以是另一种ETF的价格(如黄金矿工ETF (简称GDX)或石油ETF(简称USO))或美国经济数据。</p>    <p>Df[ 'S_3' ] = Df[ 'Close' ].shift( 1 ).rolling(window= 3 ).mean()<br> Df[ 'S_9' ]= Df[ 'Close' ].shift( 1 ).rolling(window= 9 ).mean()<br> Df= Df.dropna()<br> X = Df[[ 'S_3' , 'S_9' ]]<br> X.head()</p>    <p>输出</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/57582310e02325a84fa644e39112d9af.jpg"></p>    <p>定义因变量</p>    <p>同样, <strong>因变量是取决于解释变量的“被解释变量”。</strong> 简单地说,在这里就是我们试图预测的黄金ETF价格。我们将黄金ETF的价格赋值为y。</p>    <p>y = Df[ 'Close' ]<br> y.head()</p>    <p>输出</p>    <p>2008-02-08 91.000000<br> 2008-02-11 91.330002<br> 2008-02-12 89.330002<br> 2008-02-13 89.440002<br> 2008-02-14 89.709999<br> Name: Close, dtype: float64</p>    <p>将数据切分为模型训练数据集和测试数据集</p>    <p>在此步骤中, 我们将预测变量(解释变量)数据和输出(因变量)数据拆分为训练数据集和测试数据集。 训练数据用于建立线性回归模型,将输入与预期输出配对。测试数据用于评估模型的训练效果。</p>    <p><img src="https://simg.open-open.com/show/83c0f6a0f1fa18190087c30c67970332.jpg"></p>    <ul>     <li> <p>前80%的数据用于训练模型,其余的数据用来测试模型。</p> </li>     <li> <p>X_train 和y_train是训练数据集。</p> </li>     <li> <p>X_test & y_test是测试数据集。</p> </li>    </ul>    <p>t= .8<br> t = int (t*len(Df))<br> # Train dataset<br> X_train = X[:t]<br> y_train = y[:t]  <br> # Test dataset<br> X_test = X[t:]<br> y_test = y[t:]</p>    <p>建立线性回归模型</p>    <p>接下来我们将建立一个线性回归模型。什么是线性回归呢?</p>    <p>如果我们试图捕捉可以最优解释Y观测值的X变量和Y变量之间的数学关系,我们将在X的观测值形成的散点图中去拟合一条线,那么这条线,也就是 <strong>x和y之间的方程就被称为线性回归分析。</strong></p>    <p><img src="https://simg.open-open.com/show/eda1612126f04e582d6ee4984b77ca13.jpg"></p>    <p>再进一步地说,回归解释了因变量在自变量上的变化。因变量y是你想要预测的变量。自变量x是用来预测因变量的解释变量。下面的回归方程描述了这种关系:</p>    <p>Y = m1 * X1 + m2 * X2 + CGold ETF price = m1 * 3 days moving average + m2 * 15 days moving average + c</p>    <p>然后我们利用拟合方法来拟合自变量和因变量(x和y),从而生成系数和回归常数。</p>    <p>linear = LinearRegression().fit(X_train,y_train)<br> print "Gold ETF Price =" , round(linear.coef_[ 0 ], 2 ), \<br> "* 3 Days Moving Average" , round(linear.coef_[ 1 ], 2 ), \<br> "* 9 Days Moving Average +" , round(linear.intercept_, 2 )</p>    <p>输出</p>    <p>黄金ETF价格=1.2×3天的移动平均价-0.2×9天的移动平均价+0.39</p>    <p>预测黄金ETF的价格</p>    <p>现在,是时候检查模型是否在测试数据集中有效了。我们使用由训练数据集建立的线性模型来预测黄金ETF的价格。预测模型可以得到给定解释变量X后相应的黄金ETF价格(y)。</p>    <p>predicted_price = linear.predict(X_test)  <br> predicted_price = pd.DataFrame(predicted_price,index=y_test.index,columns = [ 'price' ])  <br> predicted_price.plot(figsize=( 10 , 5 ))  <br> y_test.plot()  <br> plt.legend([ 'predicted_price' , 'actual_price' ])  <br> plt.ylabel( "Gold ETF Price" )  <br> plt.show()</p>    <p>输出</p>    <p><img src="https://simg.open-open.com/show/208d2f0018e170fe1ea23a3737e8dd8a.jpg"></p>    <p>图表显示了黄金ETF价格的预测值和实际值(蓝线是预测值,绿线是实际值)。</p>    <p>现在,让我们使用score()函数来计算模型的拟合优度。</p>    <p>r2_score = linear.score(X[t:],y[t:])* 100<br> float ( "{0:.2f}" .format(r2_score))</p>    <p>可以看出,模型的R²是95.81%。R²总是在0到100%之间。接近100%的分数表明该模型能很好地解释黄金ETF的价格。</p>    <p>祝贺你,你刚刚学会了一种基本而又强大的机器学习技巧。</p>    <p>原文链接:</p>    <p>https://www.quantinsti.com/blog/gold-price-prediction-using-machine-learning-python/</p>    <p>【今日机器学习概念】</p>    <p>Have a Great Definition</p>    <p><img src="https://simg.open-open.com/show/5fb7a0f034e6b77eb08d2f31bcf545b5.jpg"></p>    <p>志愿者介绍</p>    <p><img src="https://simg.open-open.com/show/f1d1015068e3347a0f162cacf72ca612.jpg"></p>    <p><img src="https://simg.open-open.com/show/01432a0449f063f5dd2a7cde298f7a2a.jpg"></p>    <p><img src="https://simg.open-open.com/show/f27a7b35130652a95bf0befd87dc01af.jpg"></p>    <p><img src="https://simg.open-open.com/show/a3cce16006fb0dc80c9892ed70196175.jpg"></p>    <p> </p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s/HGLBPA9Ob7-3DzSNuF39Mg</p>    <p> </p>