Python机器学习之预测黄金价格

 更新时间:2022年01月19日 11:06:03   作者:老贡讲Python  
这篇文章主要介绍了如何使用机器学习方法来预测最重要的贵金属之一黄金的价格,文中的示例代码讲解详细,感兴趣的小伙伴可以试一试

读取黄金 ETF 数据

本文使用机器学习方法来预测最重要的贵金属之一黄金的价格。我们将创建一个线性回归模型,该模型从过去的黄金 ETF (GLD) 价格中获取信息,并返回对第二天黄金 ETF 价格的预测。GLD是直接投资实物黄金的最大ETF。(扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。)

首先要做的是:导入所有必要库。

# LinearRegression 是一个用于线性回归的机器学习库  
from sklearn.linear_model import LinearRegression  
# pandas 和 numpy 用于数据操作  
import pandas as pd  
import numpy as np  
# matplotlib 和 seaborn 用于绘制图形  
import matplotlib.pyplot as plt  
%matplotlib inline  
plt.style.use('seaborn-darkgrid')  
# yahoo Finance用于获取数据  
import yfinance as yf 

然后,我们读取过去 12 年的每日黄金 ETF 价格数据并将其存储在 Df 中。我们删除不相关的列并使用 dropna() 函数删除 NaN 值。然后,我们绘制黄金 ETF 收盘价。

Df = yf.download('GLD', '2008-01-01', '2020-6-22', auto_adjust=True)  
DfDf = Df[['Close']]  
DfDf = Df.dropna()  
Df.Close.plot(figsize=(10, 7),color='r')  
plt.ylabel("Gold ETF Prices")  
plt.title("Gold ETF Price Series")  
plt.show() 

定义解释变量

解释变量是一个被操纵以确定第二天黄金 ETF 价格的变量。简单地说,它们是我们想要用来预测黄金 ETF 价格的特征。

该策略中的解释变量是过去 3 天和 9 天的移动平均线。我们使用 dropna() 函数删除 NaN 值并将特征变量存储在 X 中。

但是,您可以向 X 添加更多您认为对预测黄金 ETF 价格有用的变量。这些变量可以是技术指标、其他 ETF 的价格,例如黄金矿工 ETF (GDX) 或石油 ETF (USO),或美国经济数据。

定义因变量

同样,因变量取决于解释变量的值。简而言之,这是我们试图预测的黄金 ETF 价格。我们将黄金 ETF 价格存储在 y 中。

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

将数据拆分为训练和测试数据集

在这一步中,我们将预测变量和输出数据拆分为训练数据和测试数据。通过将输入与预期输出配对,训练数据用于创建线性回归模型。

测试数据用于估计模型的训练效果。

•前 80% 的数据用于训练,剩余的数据用于测试

•X_train & y_train 是训练数据集

•X_test & y_test 是测试数据集

t = .8  
t = int(t*len(Df))  
XX_train = X[:t]  
yy_train = y[:t]  
XX_test = X[t:]  
yy_test = y[t:] 

创建线性回归模型

我们现在将创建一个线性回归模型。但是,什么是线性回归?

如果我们试图捕捉“x”和“y”变量之间的数学关系,通过对散点图拟合一条线,“最好”根据“x”的观察值解释“y”的观察值,那么这样的方程 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 和 y)以生成回归系数和常数。

linear = LinearRegression().fit(X_train, y_train)  
print("Linear Regression model")  
print("Gold ETF Price (y) = %.2f * 3 Days Moving Average (x1) \  
+ %.2f * 9 Days Moving Average (x2) \  
+ %.2f (constant)" % (linear.coef_[0], linear.coef_[1], linear.intercept_)) 

输出线性回归模型:

黄金 ETF 价格 (y) = 1.20 * 3 天移动平均线 (x1) + -0.21 * 9 天移动平均线 (x2) + 0.43(常数)

预测黄金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, 7))  
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)) 

输出:

99.21

可以看出,模型的 R 平方为 99.21%。R 平方始终介于 0 和 100% 之间。接近 100% 的分数表明该模型很好地解释了黄金 ETF 的价格。

绘制累积收益

让我们计算一下这个策略的累积收益来分析它的表现。

累计收益计算步骤如下:

•  生成黄金价格的每日百分比变化

•  当第二天的预测价格高于当天的预测价格时,创建一个以“1”表示的买入交易信号

•  通过将每日百分比变化乘以交易信号来计算策略回报。

•  最后,我们将绘制累积收益图

gold = pd.DataFrame()  
gold['price'] = Df[t:]['Close']  
gold['predicted_price_next_day'] = predicted_price  
gold['actual_price_next_day'] = y_test  
gold['gold_returns'] = gold['price'].pct_change().shift(-1)  
gold['signal'] = np.where(gold.predicted_price_next_day.shift(1) < gold.predicted_price_next_day,1,0)  
gold['strategy_returns'] = gold.signal * gold['gold_returns']  
((gold['strategy_returns']+1).cumprod()).plot(figsize=(10,7),color='g')  
plt.ylabel('Cumulative Returns')  
plt.show() 

输出如下:

我们还将计算夏普比:

sharpe = gold['strategy_returns'].mean()/gold['strategy_returns'].std()*(252**0.5)  
'Sharpe Ratio %.2f' % (sharpe) 

输出如下:

'Sharpe Ratio 1.06'

预测每日价格

您可以使用以下代码来预测黄金价格,并给出我们应该购买 GLD 还是不持仓的交易信号:

import datetime as dt  
current_date = dt.datetime.now()  
data = yf.download('GLD', '2008-06-01', current_date, auto_adjust=True)  
data['S_3'] = data['Close'].rolling(window=3).mean()  
data['S_9'] = data['Close'].rolling(window=9).mean()  
datadata = data.dropna()  
data['predicted_gold_price'] = linear.predict(data[['S_3', 'S_9']])  
data['signal'] = np.where(data.predicted_gold_price.shift(1) < data.predicted_gold_price,"Buy","No Position")  
data.tail(1)[['signal','predicted_gold_price']].T 

输出如下:

以上就是Python机器学习之预测黄金价格的详细内容,更多关于Python机器学习的资料请关注脚本之家其它相关文章!

相关文章

  • python redis 批量设置过期key过程解析

    python redis 批量设置过期key过程解析

    这篇文章主要介绍了python redis 批量设置过期key过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python中内置库os与sys模块的详细介绍

    python中内置库os与sys模块的详细介绍

    这篇文章主要介绍了python中内置库os与sys模块的详细介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解

    PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解

    这篇文章主要介绍了PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • python中用shutil.move移动文件或目录的方法实例

    python中用shutil.move移动文件或目录的方法实例

    在python操作中大家对os,shutil,sys,等通用库一定不陌生,下面这篇文章主要给大家介绍了关于python中用shutil.move移动文件或目录的相关资料,需要的朋友可以参考下
    2022-12-12
  • Python实现破解12306图片验证码的方法分析

    Python实现破解12306图片验证码的方法分析

    这篇文章主要介绍了Python实现破解12306图片验证码的方法,涉及Python图片截取、调用百度识图及正则截取等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Python写入MySQL数据库的三种方式详解

    Python写入MySQL数据库的三种方式详解

    Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等。本文总结了Python写入MySQL数据库的三种方式,需要的可以参考一下
    2022-06-06
  • python ImageDraw类实现几何图形的绘制与文字的绘制

    python ImageDraw类实现几何图形的绘制与文字的绘制

    这篇文章主要介绍了python ImageDraw类实现几何图形的绘制与文字的绘制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • tensorflow之如何使用GPU而不是CPU问题

    tensorflow之如何使用GPU而不是CPU问题

    这篇文章主要介绍了tensorflow之如何使用GPU而不是CPU问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • python3 flask实现文件上传功能

    python3 flask实现文件上传功能

    这篇文章主要为大家详细介绍了python3 flask实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Python编程基础之输入与输出

    Python编程基础之输入与输出

    这篇文章主要为大家介绍了Python输入与输出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论