本文已参与「新人创作礼」活动,一起开启掘金创作之路
使用机器学习方法预测黄金价格
历史上,黄金在包括美国在内的世界各地都被用作一种货币。目前,黄金等贵金属都由各国的中央银行持有,以保证再次偿还外债,并控制通货膨胀,从而反映出国家的财政实力。
预测黄金日利率的涨跌,可以帮助投资者决定何时买入(或卖出)该大宗商品。
在这个项目中,我们将使用最全面的特征集来预测黄金价格,并将应用各种机器学习算法来预测和比较它们的结果。我们还确定了高度影响黄金汇率的属性。
关于数据
本研究的数据收集于2011年11月18日至2019年1月1日的不同来源。该数据总共有1718行,共计80列。属性的数据,如石油价格、标准普尔(S&P)500指数,道琼斯指数美国债券利率(10年),欧元美元汇率,贵金属价格银和铂和其他金属如钯和铑,美元指数的价格,埃尔多拉多黄金公司和金矿ETF收集。
特征
- Gold ETF :-日期、打开、高、低、关闭和音量 .
- S&P 500 Index :- 'SP_open', 'SP_high', 'SP_low', 'SP_close', 'SP_Ajclose', 'SP_volume'
- Dow Jones Index :- 'DJ_open','DJ_high', 'DJ_low', 'DJ_close', 'DJ_Ajclose', 'DJ_volume'
- Eldorado Gold Corporation (EGO) :- 'EG_open', 'EG_high', 'EG_low', 'EG_close', 'EG_Ajclose', 'EG_volume'
- EURO - USD Exchange Rate :- 'EU_Price','EU_open', 'EU_high', 'EU_low', 'EU_Trend'
- Brent Crude Oil Futures :- 'OF_Price', 'OF_Open', 'OF_High', 'OF_Low', 'OF_Volume', 'OF_Trend'
- Crude Oil WTI USD :- 'OS_Price', 'OS_Open', 'OS_High', 'OS_Low', 'OS_Trend'
- Silver Futures :- 'SF_Price', 'SF_Open', 'SF_High', 'SF_Low', 'SF_Volume', 'SF_Trend'
- US Bond Rate (10 years) :- 'USB_Price', 'USB_Open', 'USB_High','USB_Low', 'USB_Trend'
- Platinum Price :- 'PLT_Price', 'PLT_Open', 'PLT_High', 'PLT_Low','PLT_Trend'
- Palladium Price :- 'PLD_Price', 'PLD_Open', 'PLD_High', 'PLD_Low','PLD_Trend'
- Rhodium Prices :- 'RHO_PRICE'
- US Dollar Index : 'USDI_Price', 'USDI_Open', 'USDI_High','USDI_Low', 'USDI_Volume', 'USDI_Trend'
- Gold Miners ETF :- 'GDX_Open', 'GDX_High', 'GDX_Low', 'GDX_Close', 'GDX_Adj Close', 'GDX_Volume'
- Oil ETF USO :- 'USO_Open','USO_High', 'USO_Low', 'USO_Close', 'USO_Adj Close', 'USO_Volume'
导入库
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestRegressor
from matplotlib.pyplot import figure
import seaborn as sns
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import TimeSeriesSplit
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.dates as mdates
from sklearn import linear_model
from sklearn.model_selection import TimeSeriesSplit
from sklearn.svm import SVR
# 打印当前目录下的文件
import os
for dirname, _, filenames in os.walk('./'):
for filename in filenames:
print(os.path.join(dirname, filename))
# parse_dates=True : 尝试解析index为日期格式;
'''
如果为某些或所有列启用了parse_dates,并且datetime字符串的格式都相同,
则通过设置infer_datetime_format=True,可以大大提高解析速度,
pandas将尝试推断datetime字符串的格式,然后使用更快的方法解析字符串,
从而将解析速度提高5~10倍。如果无法对整列做出正确的推断解析,
Pandas将返回到正常的解析模式。
'''
df_final = pd.read_csv("FINAL_USO.csv",na_values=['null'],index_col='Date',parse_dates=True,infer_datetime_format=True)
df_final.head().style.background_gradient(cmap='Blues').set_properties(**{'font-family': 'Segoe UI'})
df_final.describe().style.background_gradient(cmap='Blues').set_properties(**{'font-family': 'Segoe UI'})
检查缺少的值
df_final.isnull().values.any()
# hat's great ! we dont have any missing values in our dataset
指数价格对黄金利率的影响
GLD_adj_close = df_final['Adj Close']
SPY_adj_close = df_final['SP_Ajclose']
DJ_adj_close = df_final['DJ_Ajclose']
df_p = pd.DataFrame({'GLD':GLD_adj_close, 'SPY':SPY_adj_close, 'DJ':DJ_adj_close})
df_ax = df_p.plot(title='Effect of Index prices on gold rates',figsize=(15,8))
df_ax.set_ylabel('Price')
df_ax.legend(loc='upper left')
plt.show()