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

简介:

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

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

我们将建立一个机器学习线性回归模型,它将从黄金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()

输出

3b71ae1bff8a7993b5517ac310b1f0562bd7151b

定义解释变量

解释变量是被用来决定第二天黄金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()

输出

26cee3f9195361d773f47112adb32d51942e1427

定义因变量

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

y = Df['Close']

y.head()

输出

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

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

851bf1a8c7a4db3bc4fc7eca04ab056e4b96c2ef

  • 前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之间的方程就被称为线性回归分析。

b148a1724d2d41c9748d0c24368241e9becaa4c4

再进一步地说,回归解释了因变量在自变量上的变化。因变量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()

输出

29ed1336d864eb6726cdac171696630fa176f94b

图表显示了黄金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的价格。

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


原文发布时间为:2018-02-16

本文作者:文摘菌

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号

相关文章
|
12月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
391 2
|
数据采集 Web App开发 数据可视化
Python爬取闲鱼价格趋势并可视化分析
Python爬取闲鱼价格趋势并可视化分析
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
611 7
|
11月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
1040 2
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
647 58
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
719 11
200行python代码实现从Bigram模型到LLM
|
11月前
|
算法 安全 新能源
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
760 0
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1460 12
Scikit-learn:Python机器学习的瑞士军刀
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
15921 1
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
12月前
|
机器学习/深度学习 算法 调度
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
523 0

推荐镜像

更多