阅读黄金ETF数据本文使用机器学习方法预测最重要的贵金属之一黄金的价格。我们将创建一个线性回归模型,该模型从过去的黄金ETF(GLD)价格中获取信息,并返回对第二天黄金ETF价格的预测。GLD是直接投资于实物黄金的最大ETF。(扫描本文底部二维码,获取所有完整源码和打包下载的JupyterNotebook文件。)首先要做的是:导入所有需要的库。#LinearRegression是一个用于线性回归的机器学习库fromsklearn.linear_modelimportLinearRegression#pandas和numpy用于数据操作importpandasapdimportnumpyasnp#matplotlib和seaborn用于绘图,我们读取过去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("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价格现在,是时候检查模型是否适用于测试数据集了。我们使用使用训练数据集创建的线性模型来预测黄金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))output: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)
