用 Python 机器学习预测黄金价格
本文使用机器学习方法来预测最重要的贵金属之一黄金的价格。我们将创建一个线性回归模型,该模型从过去的黄金 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
dropna()
函数删除 NaN
值。然后,我们绘制黄金 ETF 收盘价。Df = yf.download('GLD', '2008-01-01', '2020-6-22', auto_adjust=True)
Df = Df[['Close']]
Df = Df.dropna()
Df.Close.plot(figsize=(10, 7),color='r')
plt.ylabel("Gold ETF Prices")
plt.title("Gold ETF Price Series")
plt.show()
dropna()
函数删除 NaN 值并将特征变量存储在 X 中。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)
Df = 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))
X_train = X[:t]
y_train = y[:t]
X_test = X[t:]
y_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_))
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))
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()
data = 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
输出如下:
E N D
扫描本文最下方二维码获取全部完整源码打包下载。
↓↓长按扫码获取完整源码↓↓
评论