公司介绍
用 Python 古板深造瞻望黄金价格
发布日期:2022-08-07 16:24    点击次数:196
 

 

读取黄金 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 

输出以下: