|
|
|
|
移动端
创建专栏

手把手:用Python搭建机器学习模型预测黄金价格

自古以来,黄金一直作为货币而存在,就是在今天,黄金也具有非常高的储藏价值,那么有没有可能预测出黄金价格的变化趋势呢?答案是肯定的,让我们使用机器学习中的回归算法来预测世界上贵重金属之一,黄金的价格吧。

作者:文摘菌|2018-02-25 19:02

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


编译:小明同学君、吴双、Yawei xia

新年总是跟黄金密不可分。新年第一天,让我们尝试用python搭建一个机器学习线性回归模型,预测金价!

自古以来,黄金一直作为货币而存在,就是在今天,黄金也具有非常高的储藏价值,那么有没有可能预测出黄金价格的变化趋势呢?

答案是肯定的,让我们使用机器学习中的回归算法来预测世界上贵重金属之一,黄金的价格吧。

我们将建立一个机器学习线性回归模型,它将从黄金ETF (GLD)的历史价格中获取信息,并返回黄金ETF价格在第二天的预测值。

GLD 是最大的以黄金进行直接投资的ETF交易基金。

在python的开发环境下用机器学习预测黄金价格的步骤:

  • 导入Python库并读取黄金ETF 的数据
  • 定义解释变量
  • 将数据切分为模型训练数据集和测试数据集
  • 建立线性回归模型
  • 预测黄金ETF的价格

导入Python库并读取黄金 ETF 的数据

首先:导入实现此策略所需的所有必要的库(LinearRegression,pandas,numpy,matplotlib,seaborn和fix_yahoo_finance)

  1. # LinearRegression is a machine learning library for linear regression   
  2. from sklearn.linear_model import LinearRegression   
  3. # pandas and numpy are used for data manipulation   
  4. import pandas as pd   
  5. import numpy as np   
  6. # matplotlib and seaborn are used for plotting graphs   
  7. import matplotlib.pyplot as plt   
  8. import seaborn   
  9. # fix_yahoo_finance is used to fetch data import f 

然后我们读取过去10年间每天黄金ETF的价格数据,并将数据储存在Df中。我们移除那些不相关的变量并使用dropna函数删除NaN值。然后我们绘制出黄金ETF的收盘价格。

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

输出

定义解释变量

解释变量是被用来决定第二天黄金ETF价格数值的变量。简单地说,就是我们用来预测黄金ETF价格的特征值。本例中的解释变量是过去3天和9天的价格移动平均值。我们使用dropna()函数删除NaN值,并将特征变量存于X中。

然而,你还可以在X中放入更多你认为对于预测黄金ETF价格有用的变量。这些变量可以是技术指标,也可以是另一种ETF的价格(如黄金矿工ETF (简称GDX)或石油ETF(简称USO))或美国经济数据。

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

输出

定义因变量

同样,因变量是取决于解释变量的“被解释变量”。简单地说,在这里就是我们试图预测的黄金ETF价格。我们将黄金ETF的价格赋值为y。

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

输出

  1. 2008-02-08    91.000000  
  2. 2008-02-11    91.330002  
  3. 2008-02-12    89.330002  
  4. 2008-02-13    89.440002  
  5. 2008-02-14    89.709999  
  6. Name: Close, dtype: float64 

将数据切分为模型训练数据集和测试数据集

在此步骤中,我们将预测变量(解释变量)数据和输出(因变量)数据拆分为训练数据集和测试数据集。训练数据用于建立线性回归模型,将输入与预期输出配对。测试数据用于评估模型的训练效果。

  • 前80%的数据用于训练模型,其余的数据用来测试模型。
  • X_train 和y_train是训练数据集。
  • X_test & y_test是测试数据集。
  1. t=.8   
  2. t = int(t*len(Df))   
  3. # Train dataset   
  4. XX_train = X[:t]   
  5. yy_train = y[:t]    
  6. # Test dataset   
  7. XX_test = X[t:]   
  8. yy_test = y[t:] 

建立线性回归模型

接下来我们将建立一个线性回归模型。什么是线性回归呢?

如果我们试图捕捉可以最优解释Y观测值的X变量和Y变量之间的数学关系,我们将在X的观测值形成的散点图中去拟合一条线,那么这条线,也就是x和y之间的方程就被称为线性回归分析。

再进一步地说,回归解释了因变量在自变量上的变化。因变量y是你想要预测的变量。自变量x是用来预测因变量的解释变量。下面的回归方程描述了这种关系:

  1. Y = m1 * X1 + m2 * X2 + CGold ETF price = m1 * 3 days moving average + m2 * 15 days moving average + c 

然后我们利用拟合方法来拟合自变量和因变量(x和y),从而生成系数和回归常数。

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

输出

黄金ETF价格=1.2×3天的移动平均价-0.2×9天的移动平均价+0.39

预测黄金ETF的价格

现在,是时候检查模型是否在测试数据集中有效了。我们使用由训练数据集建立的线性模型来预测黄金ETF的价格。预测模型可以得到给定解释变量X后相应的黄金ETF价格(y)。

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

输出

图表显示了黄金ETF价格的预测值和实际值(蓝线是预测值,绿线是实际值)。

现在,让我们使用score()函数来计算模型的拟合优度。

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

可以看出,模型的R²是95.81%。R²总是在0到100%之间。接近100%的分数表明该模型能很好地解释黄金ETF的价格。

祝贺你,你刚刚学会了一种基本而又强大的机器学习技巧。

原文链接:

https://www.quantinsti.com/blog/gold-price-prediction-using-machine-learning-python/

【本文是51CTO专栏机构大数据文摘的原创译文,微信公众号“大数据文摘( id: BigDataDigest)”】

     大数据文摘二维码

戳这里,看该作者更多好文

【编辑推荐】

  1. 如何做好文本关键词提取?从达观数据应用的三种算法说起
  2. 利用神经网络算法的C#手写数字识别
  3. 区块链主流共识算法的浅析
  4. 外媒速递:Cython——以C语言速度狂奔的Python
  5. 小白学数据:教你用Python实现简单监督学习算法
【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

热门职位+更多