- 发布日期:2022-02-16 12:41 点击次数:108
leyu乐鱼全站官网
本文使用机器学习措施来揣测最蹙迫的贵金属之一黄金的价钱。咱们将创建一个线性追溯模子,该模子从往时的黄金 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 是覆按数据集
“十三五”时期,我国大数据产业快速起步。据测算,大数据产业规模年均复合增长率超过30%,2020年超过1万亿元,产业发展取得显著成效。
leyu乐鱼全站官网•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
输出如下:
- 只须对董听瑶满怀柔情2022-04-24
- 汤司令点头哈腰地给日本鬼子捧臭脚:“高2022-04-24
- 汤司令点头哈腰地给日本鬼子捧臭脚:“高2022-04-24
- 最佳的理会时辰是白昼2022-04-18
- 亦然过敏症状易发的时节2022-04-18
- 主要影响的是实习生论文发表2022-04-15