本文使用机器学习方法来预测最重要的贵金属之一黄金的价格。我们将创建一个线性回归模型,该模型从过去的黄金ETF(GLD)价格中获取信息,并返回对第二天黄金ETF价格的预测。GLD是直接投资实物黄金的最大ETF。(扫描本文最下方二维码获取全部完整源码和JupyterNotebook文件打包下载。)
首先要做的是:导入所有必要库。
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("GoldETFPrices")plt.title("GoldETFPriceSeries")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=.8t=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+CGoldETFprice=m1*3daysmovingaverage+m2*15daysmovingaverage+c然后我们使用拟合方法拟合自变量和因变量(x和y)以生成回归系数和常数。
linear=LinearRegression().fit(X_train,y_train)print("LinearRegressionmodel")print("GoldETFPrice(y)=%.2f*3DaysMovingAverage(x1)\+%.2f*9DaysMovingAverage(x2)\+%.2f(constant)"%(linear.coef_[0],linear.coef_[1],linear.intercept_))输出线性回归模型:
黄金ETF价格(y)=1.20*3天移动平均线(x1)+-0.21*9天移动平均线(x2)+0.43(常数)
现在,是时候检查模型是否在测试数据集中工作了。我们使用使用训练数据集创建的线性模型来预测黄金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("GoldETFPrice")plt.show()
该图显示了黄金ETF的预测价格和实际价格。
现在,让我们使用score()函数计算拟合优度。
r2_score=linear.score(X[t:],y[t:])*100float("{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_pricegold['actual_price_next_day']=y_testgold['gold_returns']=gold['price'].pct_change().shift(-1)gold['signal']=np.where(gold.predicted_price_next_day.shift(1) 我们还将计算夏普比: sharpe=gold['strategy_returns'].mean()/gold['strategy_returns'].std()*(252**0.5)'SharpeRatio%.2f'%(sharpe)输出如下: 您可以使用以下代码来预测黄金价格,并给出我们应该购买GLD还是不持仓的交易信号: importdatetimeasdtcurrent_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)