文档
  • PyCaret 3.0
  • 开始入门
    • 💻安装
    • 🚀快速入门
    • ⭐教程
    • 📶模块
    • ⚙️数据预处理
      • 数据准备
      • 缩放和转换
      • 特征工程
      • 特征选择
      • 其他设置参数
    • 💡函数
      • 初始化
      • 训练
      • 优化
      • 分析
      • 部署
      • 其他
  • 学习 PYCARET
    • 📖博客
      • 宣布 PyCaret 1.0
      • 宣布 PyCaret 2.0
      • 关于 PyCaret 你不知道的 5 件事
      • 构建和部署你的第一个机器学习 Web 应用
      • 使用 PyCaret 在 Power BI 中构建你自己的 AutoML
      • 在 Google Kubernetes 上部署机器学习管道
      • 在 AWS Fargate 上部署 PyCaret 和 Streamlit
      • 使用 PyCaret 在 Power BI 中进行异常检测
      • 在 Google Kubernetes 上部署机器学习应用
      • 在 GKE 上部署机器学习管道
      • 在 AWS Fargate 上部署机器学习管道
      • 使用 Docker 在云端部署机器学习管道
      • 使用 PyCaret 在 Power BI 中进行聚类分析
      • 使用 ONNX Runtime 在边缘部署 PyCaret 模型
      • GitHub 是你所需的最佳 AutoML
      • 在 AWS Fargate 上部署 PyCaret 和 Streamlit
      • 使用 PyCaret 和 MLflow 轻松实现 MLOps
      • 使用 PyCaret 在 Power BI 中进行聚类分析
      • 使用 PyCaret 在 Alteryx 中进行机器学习
      • 使用 PyCaret 在 KNIME 中进行机器学习
      • 使用 PyCaret 在 SQL 中进行机器学习 第一部分
      • 使用 PyCaret 在 Power BI 中进行机器学习
      • 使用 PyCaret 在 Tableau 中进行机器学习
      • 使用 PyCaret 进行多个时间序列预测
      • 使用 PyCaret 预测客户流失
      • 使用 PyCaret 预测潜在客户分数(正确方法)
      • 使用 PyCaret 在 Python 中进行 NLP 文本分类
      • 使用 PyCaret 预测潜在客户分数(正确方法)
      • 使用 PyCaret 预测黄金价格暴跌
      • 使用机器学习预测黄金价格
      • PyCaret 2.1 功能摘要
      • 使用 PyCaret 将机器学习模型发布到 SQL Server
      • 使用 PyCaret 和 Gradio 为你的机器学习加速
      • 时间序列 101 - 适合初学者
      • 使用 PyCaret 进行时间序列异常检测
      • 使用 PyCaret 回归进行时间序列预测
      • 使用 PyCaret 在 Power BI 中进行主题建模
      • 使用 PyCaret 编写和训练自定义机器学习模型
      • 使用 PyCaret 和 Streamlit 构建和部署机器学习应用
      • PyCaret 2.3.6 发布了!了解新特性?
    • 📺视频
    • 🛩️速查表
    • ❓常见问题解答
    • 👩‍💻示例
  • 重要链接
    • 🛠️版本说明
    • ⚙️API 参考
    • 🙋 讨论
    • 📤问题
    • 👮 许可证
  • 媒体
    • 💻Slack
    • 📺YouTube
    • 🔗LinkedIn
    • 😾GitHub
    • 🔅Stack Overflow
由 GitBook 提供支持
本页内容
  • 使用机器学习预测黄金价格
  • 引言
  • 背景
  • 方法
  • 导入数据
  • 准备数据
  • 使用机器学习预测黄金价格
  • 重要链接

这篇文章有帮助吗?

  1. 学习 PYCARET
  2. 博客

使用机器学习预测黄金价格

上一篇使用 PyCaret 预测黄金价格暴跌下一篇PyCaret 2.1 功能摘要

最后更新于 2 年前

这篇文章有帮助吗?

使用机器学习预测黄金价格

作者:Mohammad Riazuddin

第一部分:导入和准备数据

引言

我研究金融市场已经超过十年,并一直在研究不同的资产类别及其在不同经济条件下的表现。很难找到一个比黄金更具两极分化的资产类别。有人热爱它,有人憎恨它,而且往往他们永远属于同一个阵营。由于黄金本身基本面很少(这又是两极分化的一个原因),在这个多部分系列中,我将尝试使用几种机器学习技术来预测黄金价格回报。以下是我目前设想的系列内容:

第一部分:定义方法、收集和准备数据

第二部分:使用 PyCaret 进行回归建模

第三部分:使用 PyCaret 进行分类建模

第四部分:使用 Prophet (Facebook) 进行时间序列建模

第五部分:评估方法整合

“请注意,黄金是一个在竞争极其激烈的市场中广泛交易的资产。长期持续地从任何策略中赚钱都极其困难,甚至不可能。本文仅分享我的经验,并非投资或交易的建议或倡导。然而,对于像我这样的该领域学生来说,这个想法可以通过个人努力扩展和发展成交易算法。”

背景

黄金几个世纪以来一直是人类最初的价值储存和交换媒介,直到几百年前纸币取而代之。然而,大多数可持续的纸币直到 1971 年布雷顿森林协议被废除、世界货币成为真正的‘法定货币’之前,都仍有黄金储备支持。

然而,黄金不仅作为珠宝首选金属继续受到关注,还作为一种价值储存手段和多元化投资组合中经常被建议的一部分,因为它往往是有效的通胀对冲工具,并在经济困难时期提供避险。

方法

在本系列中,我们将采用不同的方法,使用引言部分重点介绍的**机器学习**来预测黄金价格回报

首先,我们将采用回归方法来预测未来 2 周和 3 周内黄金的回报。我们将利用我认为会影响黄金前景的不同工具的历史回报来实现这一点。根本原因是,我将黄金称为一个*‘反应性’*资产。它本身的基本面很少,价格波动往往是投资者如何看待其他资产类别(股票、大宗商品等)的衍生品。

导入数据

***#Importing Libraries***
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
from yahoofinancials import YahooFinancials
ticker_details = pd.read_excel(“Ticker List.xlsx”)
ticker = ticker_details['Ticker'].to_list()
names = ticker_details['Description'].to_list()
ticker_details.head(20)

一旦我们有了列表,就需要定义导入数据所需的日期范围。我选择的时期是 2010 年 1 月到 2020 年 3 月 1 日。我没有提取此之前的数据是因为 2008-09 年的**全球金融危机 (GFC)** 极大地改变了经济和市场格局。该时期之前的关系现在可能关联性较低。

我们创建一个日期范围,并将其写入一个名为 values 的空数据框中,我们将从中提取并粘贴从 yahoofinancials 拉取的数据。

***#Creating Date Range and adding them to values table***
end_date= “2020–03–01”
start_date = “2010–01–01”
date_range = pd.bdate_range(start=start_date,end=end_date)
values = pd.DataFrame({ ‘Date’: date_range})
values[‘Date’]= pd.to_datetime(values[‘Date’])

一旦我们在数据框中有了日期范围,就需要使用股票代码从 API 中拉取数据。***yahoofinancials ***以 JSON 格式返回输出。以下代码循环遍历股票代码列表,提取所有历史日期的收盘价,并按日期水平合并到数据框中。考虑到这些资产类别可能有不同的区域和交易假期,每次数据拉取的日期范围可能不同。通过合并,我们最终会有一些 NAs,我们将在稍后进行 frontfill。

***#Extracting Data from Yahoo Finance and Adding them to Values table using date as key
***for i in ticker:
 raw_data = YahooFinancials(i)
 raw_data = raw_data.get_historical_price_data(start_date, end_date, “daily”)
 df = pd.DataFrame(raw_data[i][‘prices’])[[‘formatted_date’,’adjclose’]]
 df.columns = [‘Date1’,i]
 df[‘Date1’]= pd.to_datetime(df[‘Date1’])
 values = values.merge(df,how=’left’,left_on=’Date’,right_on=’Date1')
 values = values.drop(labels=’Date1',axis=1)

***#Renaming columns to represent instrument names rather than their ticker codes for ease of readability***
names.insert(0,’Date’)
values.columns = names
print(values.shape)
print(values.isna().sum())


***#Front filling the NaN values in the data set***
values = values.fillna(method="ffill",axis=0)
values = values.fillna(method="bfill",axis=0)
values.isna().sum()

***# Coercing numeric type to all columns except Date***
cols=values.columns.drop('Date')
values[cols] = values[cols].apply(pd.to_numeric,errors='coerce').round(decimals=1)
values.tail()

准备数据

在上述方法中,我们强调将使用所列工具的滞后回报来预测黄金的未来回报。这里我们将计算所有工具的短期历史回报以及少数选定工具的长期历史回报。

其基本思想是,如果某个资产表现出色或表现不佳,则更有可能进行投资组合再平衡,这将影响其他资产类别未来的回报。*例如:如果股票市场(比如 S&P500)在过去 6 个月显示出惊人的回报,资产管理人可能想获利了结,并将部分资金配置到贵金属等资产,并为股市回调做准备。*下表显示了黄金与 S&P500 在不同市场条件下的价格走势和相关性。

我们可以看到,当 S&P500 出现极端负面波动时,黄金表现出负相关性。近期股市的急剧下跌也突显了类似的关系,当时黄金预测下跌而上涨,年初至今录得 11% 的涨幅,而 S&P500 的年初至今亏损为 11%。

imp = [‘Gold’,’Silver’, ‘Crude Oil’, ‘S&P500’,’MSCI EM ETF’]

***# Calculating Short term -Historical Returns***
change_days = [1,3,5,14,21]

data = pd.DataFrame(data=values[‘Date’])
for i in change_days:
 print(data.shape)
 x= values[cols].pct_change(periods=i).add_suffix(“-T-”+str(i))
 data=pd.concat(objs=(data,x),axis=1)
 x=[]
print(data.shape)

***# Calculating Long term Historical Returns***
change_days = [60,90,180,250]

for i in change_days:
 print(data.shape)
 x= values[imp].pct_change(periods=i).add_suffix(“-T-”+str(i))
 data=pd.concat(objs=(data,x),axis=1)
 x=[]
print(data.shape)

除了滞后回报,我们还查看当前黄金价格与其不同窗口期移动平均线的距离。这是技术分析中非常常用的指标,移动平均线为资产价格提供支撑和阻力。我们结合使用简单移动平均线和指数移动平均线。然后我们将这些移动平均线添加到现有特征空间中。

***#Calculating Moving averages for Gold***
moving_avg = pd.DataFrame(values[‘Date’],columns=[‘Date’])
moving_avg[‘Date’]=pd.to_datetime(moving_avg[‘Date’],format=’%Y-%b-%d’)
***#Adding Simple Moving Average***
moving_avg[‘Gold/15SMA’] = (values[‘Gold’]/(values[‘Gold’].rolling(window=15).mean()))-1
moving_avg[‘Gold/30SMA’] = (values[‘Gold’]/(values[‘Gold’].rolling(window=30).mean()))-1
moving_avg[‘Gold/60SMA’] = (values[‘Gold’]/(values[‘Gold’].rolling(window=60).mean()))-1
moving_avg[‘Gold/90SMA’] = (values[‘Gold’]/(values[‘Gold’].rolling(window=90).mean()))-1
moving_avg[‘Gold/180SMA’] = (values[‘Gold’]/(values[‘Gold’].rolling(window=180).mean()))-1

***#Adding Exponential Moving Average
***moving_avg[‘Gold/90EMA’] = (values[‘Gold’]/(values[‘Gold’].ewm(span=90,adjust=True,ignore_na=True).mean()))-1
moving_avg[‘Gold/180EMA’] = (values[‘Gold’]/(values[‘Gold’].ewm(span=180,adjust=True,ignore_na=True).mean()))-1
moving_avg = moving_avg.dropna(axis=0)
print(moving_avg.shape)
moving_avg.head(20)
***#Merging Moving Average values to the feature space***
data[‘Date’]=pd.to_datetime(data[‘Date’],format=’%Y-%b-%d’)
data = pd.merge(left=data,right=moving_avg,how=’left’,on=’Date’)
print(data.shape)
data.isna().sum()

以上是关于特征的内容。现在我们需要创建目标,也就是我们要预测什么。由于我们预测的是回报,我们需要选择一个预测回报的周期。我选择了 14 天和 22 天的周期,因为其他较短的周期往往非常不稳定且缺乏预测能力。当然,也可以尝试其他周期。

***#Calculating forward returns for Target***
y = pd.DataFrame(data=values[‘Date’])
y[‘Gold-T+14’]=values[“Gold”].pct_change(periods=-14)
y[‘Gold-T+22’]=values[“Gold”].pct_change(periods=-22)
print(y.shape)
y.isna().sum()

***# Removing NAs***

data = data[data[‘Gold-T-250’].notna()]
y = y[y[‘Gold-T+22’].notna()]

***#Adding Target Variables***
data = pd.merge(left=data,right=y,how=’inner’,on=’Date’,suffixes=(False,False))
print(data.shape)

现在我们已经准备好完整的数据集,可以开始建模了。下一部分,我们将使用极其创新且高效的 PyCaret 库尝试不同的算法。我还会展示如何创建一个管道,以便持续导入新数据并使用训练好的模型生成预测。

使用机器学习预测黄金价格

第二部分:使用 PyCaret 进行回归建模

!pip install pycaret

22 天模型

我们将 22 天周期作为目标。这意味着,给定历史数据,我们将尝试预测未来三周内黄金的回报。

***#If you are importing downloaded dataset***
data = pd.read_csv("Training Data.csv")

from pycaret.regression import *

***#We have two target columns. We will remove the T+14 day Target
***data_22= data.drop(['Gold-T+14'],axis=1)

设置

在 PyCaret 中开始任何建模工作时,第一步是 ‘setup’ 函数。此处强制要求的变量是数据集和数据集中的目标标签。所有基础和必要的数据转换,如删除 ID、对分类因子进行独热编码以及缺失值填充,都会在后台自动完成。PyCaret 还提供了 20 多种预处理选项。对于本例,我们将从 setup 中的基本功能开始,并在后续实验中尝试不同的预处理技术。

a=setup(data_22,target='Gold-T+22',
        ignore_features=['Date'],session_id=11,
        silent=True,profile=False);

在上面的代码中,数据集作为 ‘data_22’ 传递,目标指向标签为 ‘Gold-T+22’ 的列。我特意指定忽略 ‘Date’ 列,以防止 PyCaret 在日期列上创建基于时间的特征,这在其他情况下可能非常有用,但我们现在不评估这一点。如果你想查看变量之间的分布和相关性,可以保留参数 ‘profile=True’,它会显示一个 panda profiler 输出。我特意提供了 ‘session_id=11’ 以便能够重现结果。

神奇的命令....compare_models( )

下一步,我将使用 PyCaret 我最喜欢的功能之一,它将数百行代码精简为两个词 —— ‘compare_models’。该函数使用所有算法(目前有 25 种)并将其拟合到数据,运行 10 折交叉验证,并为每个模型输出 6 个评估指标。所有这些只需两个词。出于时间考虑,该函数中还可以使用两个附加参数:

a. turbo=False — 默认为 True。当 turbo=True 时,compare_models 不会评估一些成本较高的算法,即 Kernel Ridge (kr)、Automatic Relevance Determination (ard) 和 Multi-level Perceptron (mlp)

b. blacklist — 在这里,可以传递算法缩写的列表(参见 docstring),这些算法已知耗时更长但性能提升不大。例如:下面我将 Theilsen Regressor (tr) 列入了黑名单

compare_models(blacklist=['tr'],turbo=True)

我们将使用 R-Square (R2) 作为首选指标。我们看到 ET、Catboost 和 KNN 是排名前三的模型。下一步我们将对这三个模型的超参数进行调优。

调优模型超参数

PyCaret 为每个算法都有一个预定义的网格,并且 tune_model() 函数使用随机网格搜索来寻找优化指标选择(此处为 Rsquare)的参数集,并显示优化模型的交叉验证得分。它不接受已训练好的模型,需要传入估计器的缩写字符串。我们将调优 Extra Tree (et)、K Nearest Neighbors(knn) 和 CatBoost (catboost) 回归器。

et_tuned = tune_model(‘et’)
catb_tuned = tune_model(‘catboost’)
knn_tuned = tune_model(‘knn’,n_iter=150)

*#I have increased the iteration in knn because increasing iterations have shown to perform better for knn rather than other models in question without significantly increasing the training time.*

从上面我们可以看到,调优后 knn 的 R2 显著增加到 87.86%,远高于 et 和 catboost,它们在调优后没有改善。这可能是由于网格搜索过程中的随机性。在迭代次数非常高的情况下,它们可能会有所改善。

我还会创建一个基础 Extra Tree (et) 模型,因为其原始性能(调优前)与调优后的 knn 非常接近。我们将使用 PyCaret 的 create_model() 函数来创建模型。

et = create_model(‘et’)

评估模型

对训练好的模型进行一些模型诊断非常重要。我们将使用 PyCaret 中的 ***evaluate_model() *** 函数来查看图表集合和其他诊断信息。它接受一个已训练好的模型,并返回一系列模型诊断图表和模型定义。我们将对我们的两个最佳模型 knn_tuned 和 et 进行模型诊断。

从上面我们可以清楚地看到,在前 500 个观察值中,存在许多异常值,这些异常值不仅影响模型性能,还可能影响模型未来的泛化能力。因此,移除这些异常值可能是值得的。但在这样做之前,我们将通过 et 查看特征重要性(knn 不提供特征重要性)。

我们看到白银和新兴市场 ETF 的回报具有最高的特征重要性,这强调了白银和黄金经常同步波动,而投资组合配置确实在新兴市场股票和黄金之间转移。

移除异常值

要移除异常值,我们需要回到 setup 阶段,使用 PyCaret 内置的异常值移除器,并再次创建模型以查看影响。

b=setup(data_22,target=’Gold-T+22', ignore_features=[‘Date’], session_id=11,silent=True,profile=False,remove_outliers=True);

如果将 ***‘remove_outliers’*** 参数设置为 true,PyCaret 将使用奇异值分解 (SVD) 技术通过 PCA 线性降维识别并移除异常值。默认的异常程度是 5%。这意味着它将移除它认为是异常值的 5% 的观察值。

移除异常值后,我们再次运行我们的最佳模型,看看性能是否有任何改进,显然是有改进的。

我们看到 et 的性能从 85.43% 提高到 86.16%,knn_tuned 的性能从 87.86% 提高到 88.3%。各折叠的 SD 也降低了。

集成模型

我们还可以尝试查看 bagging/boosting 是否可以改善模型性能。我们可以使用 PyCaret 中的 ***ensemble_model() *** 函数快速查看集成方法如何通过以下代码改善结果

et_bagged = ensemble_model(et,method=’Bagging’)
knn_tuned_bagged = ensemble_model(knn_tuned, method='Bagging')

上述代码将显示类似的交叉验证得分,但未显示出显著改进。结果可在 repo 中的 notebook 链接中查看。

模型融合

我们可以融合(blending)排名前 2 的模型(et 和 knn_tuned),看看融合后的模型是否能表现更好。通常认为,融合后的模型学习不同的模式,并且它们共同具有更好的预测能力。我将使用 PyCaret 的 ***blend_models() *** 函数来实现此目的。它接受一个已训练模型的列表,并返回一个融合模型和 10 折交叉验证得分。

blend_knn_et = blend_models(estimator_list=[knn_tuned,et])

在上表中,我们看到 ***knn_tuned ***和 et 的融合返回的平均 R2 优于两者。平均 R2 增加了 1.9%,且 R2 的 SD 相较于 ***knn_tuned *** 有所降低,这意味着在各折叠中表现更好且更稳定。

平均 R2 为 90.2% 意味着我们的模型平均能够捕获我们提供的特征中黄金回报变动的 90.2%。

模型堆叠

stack2 = create_stacknet(estimator_list=[[catb,et,knn_tuned],[blend_knn_et]], restack=True)

正如我们在上面看到的,stack2 模型的 R2 比 blend_knn_et 好 1%,因此我们将选择 stack2 作为最佳模型并保存它以进行预测。

保存模型

模型训练完成后,我们需要保存模型以便在新的数据上使用它进行预测。我们可以通过 save_model() 实现这一点。这将模型保存到当前目录或任何定义的路径中。下面的代码将模型和预处理管道保存为名称 ‘22Day Regressor’

save_model(model=stack2, model_name=’22Day Regressor’)

在新数据上进行预测

一旦我们保存了模型,当新数据到来时,我们就会想在新数据上进行预测。我们可以依赖 yahoofinancials 包来获取所有工具的收盘价,但是,我们需要再次准备新数据才能使用模型。步骤将类似于我们在准备训练数据时所做的,唯一的区别是我们会导入最新的数据,并且不会创建标签(我们没有未来价格,所以无法创建)。下面的代码块应该导入并整理数据,使其准备好进行预测。

***#Importing Libraries***
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
from yahoofinancials import YahooFinancials

ticker_details = pd.read_excel("Ticker List.xlsx")
ticker = ticker_details['Ticker'].to_list()
names = ticker_details['Description'].to_list()

***#Preparing Date Range***
end_date= datetime.strftime(datetime.today(),'%Y-%m-%d')
start_date = "2019-01-01"
date_range = pd.bdate_range(start=start_date,end=end_date)
values = pd.DataFrame({ 'Date': date_range})
values['Date']= pd.to_datetime(values['Date'])

***#Extracting Data from Yahoo Finance and Adding them to Values table using date as key***
for i in ticker:
    raw_data = YahooFinancials(i)
    raw_data = raw_data.get_historical_price_data(start_date, end_date, "daily")
    df = pd.DataFrame(raw_data[i]['prices'])[['formatted_date','adjclose']]
    df.columns = ['Date1',i]
    df['Date1']= pd.to_datetime(df['Date1'])
    values = values.merge(df,how='left',left_on='Date',right_on='Date1')
    values = values.drop(labels='Date1',axis=1)

***#Renaming columns to represent instrument names rather than their ticker codes for ease of readability***
names.insert(0,'Date')
values.columns = names

***#Front filling the NaN values in the data set***
values = values.fillna(method="ffill",axis=0)
values = values.fillna(method="bfill",axis=0)

***# Co-ercing numeric type to all columns except Date***
cols=values.columns.drop('Date')
values[cols] = values[cols].apply(pd.to_numeric,errors='coerce').round(decimals=1)
imp = ['Gold','Silver', 'Crude Oil', 'S&P500','MSCI EM ETF']

***# Calculating Short term -Historical Returns***
change_days = [1,3,5,14,21]

data = pd.DataFrame(data=values['Date'])
for i in change_days:
    x= values[cols].pct_change(periods=i).add_suffix("-T-"+str(i))
    data=pd.concat(objs=(data,x),axis=1)
    x=[]

***# Calculating Long term Historical Returns***
change_days = [60,90,180,250]

for i in change_days:
    x= values[imp].pct_change(periods=i).add_suffix("-T-"+str(i))
    data=pd.concat(objs=(data,x),axis=1)
    x=[]

***#Calculating Moving averages for Gold***
moving_avg = pd.DataFrame(values['Date'],columns=['Date'])
moving_avg['Date']=pd.to_datetime(moving_avg['Date'],format='%Y-%b-%d')
moving_avg['Gold/15SMA'] = (values['Gold']/(values['Gold'].rolling(window=15).mean()))-1
moving_avg['Gold/30SMA'] = (values['Gold']/(values['Gold'].rolling(window=30).mean()))-1
moving_avg['Gold/60SMA'] = (values['Gold']/(values['Gold'].rolling(window=60).mean()))-1
moving_avg['Gold/90SMA'] = (values['Gold']/(values['Gold'].rolling(window=90).mean()))-1
moving_avg['Gold/180SMA'] = (values['Gold']/(values['Gold'].rolling(window=180).mean()))-1
moving_avg['Gold/90EMA'] = (values['Gold']/(values['Gold'].ewm(span=90,adjust=True,ignore_na=True).mean()))-1
moving_avg['Gold/180EMA'] = (values['Gold']/(values['Gold'].ewm(span=180,adjust=True,ignore_na=True).mean()))-1
moving_avg = moving_avg.dropna(axis=0)

***#Merging Moving Average values to the feature space***

data['Date']=pd.to_datetime(data['Date'],format='%Y-%b-%d')
data = pd.merge(left=data,right=moving_avg,how='left',on='Date')
data = data[data['Gold-T-250'].notna()]
prediction_data = data.copy()

数据准备好后,我们需要加载模型并进行预测。要加载模型,我们将再次使用 PyCaret 的回归模块。下面的代码将加载模型,在新数据上进行预测,并给出数据集中的每个日期的历史价格、预计回报以及未来 3 周的预测价格。

from pycaret.regression import *

***#Loading the stored model
***regressor_22 = load_model("22Day Regressor");

***#Making Predictions
***predicted_return_22 = predict_model(regressor_22,data=prediction_data)
predicted_return_22=predicted_return_22[['Date','Label']]
predicted_return_22.columns = ['Date','Return_22']

***#Adding return Predictions to Gold Values***
predicted_values = values[['Date','Gold']]
predicted_values = predicted_values.tail(len(predicted_return_22))
predicted_values = pd.merge(left=predicted_values,right=predicted_return_22,on=['Date'],how='inner')
predicted_values['Gold-T+22']=(predicted_values['Gold']*(1+predicted_values['Return_22'])).round(decimals =1)

***#Adding T+22 Date
***from datetime import datetime, timedelta

predicted_values['Date-T+22'] = predicted_values['Date']+timedelta(days = 22)
predicted_values.tail()

重要链接

对于本次和后续练习,我们将需要过去 10 年几种工具的收盘价。有各种付费资源(Reuters, Bloomberg)和免费资源(IEX, Quandl, Yahoofinance, Google finance)可用于导入数据。由于本项目需要不同类型的资产类别(股票、商品、债券和贵金属),我发现 ‘*’ 包非常有用且直观。

我已经准备好需要导入数据的工具列表。yahoofinancials 包需要 Yahoo 股票代码。该列表包含股票代码及其描述。包含该列表的 Excel 文件可以在此处找到名称为 ‘Ticker List’。我们导入该文件并提取股票代码和名称作为单独的列表。(*)

values 表的尾部
来源:Bloomberg, ICE Benchmark Administration, World Gold Council。链接

但是,我们将使用机器学习来评估这个假设。您可以直接从我的文件名为 ‘Training Data_Values’

移动平均数据框的输出

在第一部分中,我们讨论了从开源免费 API 导入数据,并以适合我们的机器学习练习的方式准备了数据。您可以参考第一部分获取代码,或从 repo 中导入文件名为 ‘Training Data’ 的最终数据集.

PyCaret 是一个开源的 Python 机器学习库,可以在任何 notebook 环境中使用,并显著减少编码工作量,使过程变得极其高效和富有成效。在下面一节中,我们将看到******如何极大地提升任何机器学习实验。首先,您需要使用

compare_models 的输出
Cook 距离图 knn_tuned
移除异常值后的 et 和 knn_tuned 结果
融合模型的结果

尽管模型融合的结果很好,但我还是想看看是否有可能从数据中再提取几个百分点(basis points)的 R2。为此,我们将构建一个多层模型堆叠。这与融合不同,堆叠是按顺序堆叠模型层,以便将一层模型的预测与原始特征(如果 restack = True)一起传递给下一层模型。一组模型的预测极大地帮助后续模型进行预测。链条的末端是元模型(默认为线性)。PyCaret 指南提供了更多关于此。在 notebook 中,我尝试了几种架构。下面呈现的是性能最好的一个

stack2 的结果 (多层堆叠)

上面的表格输出显示,2020 年 4 月 17 日黄金收盘价为 1,694.5 美元,模型预测未来 22 天的回报为 -2.3%,目标价格到 2020 年 5 月 9 日将达到 1,655 美元。我创建了一个单独用于预测的 notebook,标题为 “Gold Prediction New Data — Regression”,可以在 repo 中找到.

我们可以使用相同的概念和技术进行 T+14 日预测。代码和输出可以在 repo 中的 Jupyter notebook 中找到,标题为 “Gold Prediction Experiment Regression — PyCaret”.

第三部分链接 —

链接到

关注我

指南

📖
黄金预测
*yahoofinancials
此处
*参见 notebook
GitHub 仓库
GitHub 仓库
PyCaret
主题
此处
此处
预测黄金价格暴跌
GitHub 仓库
LinkedIn
PyCaret