
读取黄金 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 输出如下: