AI能预测黄金价格?手把手教你用Python和AI探索黄金交易秘密!
作者:微信文章前言:黄金,你还能用老眼光看吗?作为量化投资爱好者,是否也曾思考过一个问题:黄金价格,真的能预测吗?作为重要的避险资产,黄金的价格波动牵动着无数人的神经。当市场不确定性增加时,黄金往往是资金的“避风港”。那么,如果我们能用上现代数据科学技术,比如机器学习,能否找到一丝价格走势的蛛丝马迹呢?
今天,我们尝试做一个有趣的黄金价格预测研究,用一个简单的机器学习模型,来预测黄金ETF(GLD)的未来价格,并从中学习一个重要的量化投资真理:预测的准确性,不等于赚钱的能力!
▍第一步:给AI准备“学习资料”
我们的目标是建立一个线性回归模型,它能根据过去的黄金ETF(GLD)价格信息,来预测第二天的价格。
获取数据: 我们可以用yfinance库获取(2012-2025)的黄金ETF(GLD)每日收盘价数据。也可以手动下载。
定义“特征”(输入): 我们需要给模型一些参考依据。在这里,我们选择了两个非常简单的特征:
3天移动平均线: 反映黄金的短期趋势。
9天移动平均线: 反映稍长一点的趋势。
定义“目标”(输出): 我们的目标很简单,就是“下一天的收盘价”。通过 shift(-1) 这个巧妙的操作,我们让每一天的数据行都对应上它“第二天”的价格,作为预测目标。
Date原始数据3日均线9日均线下一天价格2025/7/17307.59307.53307.00308.392025/7/18308.39308.08307.11313.132025/7/21313.13309.70308.11316.12025/7/22316.10312.54309.28312.182025/7/23312.18313.80309.95310.272025/7/24310.27312.85310.07307.42025/7/25307.40309.95310.01305.412025/7/28305.41307.69309.86306.252025/7/29306.25306.35309.64300.962025/7/30300.96304.21308.90302.96
from sklearn.linear_model import LinearRegressionimport pandas as pdimport numpy as np
import matplotlib.pyplot as plt%matplotlib inlineplt.style.use('ggplot')
import statsmodels.api as smfrom statsmodels.tsa.stattools import coint
# yfinance is used to fetch dataimport yfinance as yf
import warningswarnings.simplefilter("ignore")
# Read dataDf = yf.download('GLD', '2012-01-01', '2024-10-31', auto_adjust=True)if isinstance(Df.columns, pd.MultiIndex): Df.columns = Df.columns.droplevel(1)
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()
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']
▍第二步:攻克难题 - 非平稳数据的“魔法”
在量化分析中,有一个常见的“陷阱”叫做非平稳性。简单来说,就是很多金融数据(比如股价、金价)的统计特性(比如均值和方差)会随着时间变化。如果你直接拿非平稳的数据去跑模型,很可能会得到一个“假关系”,也就是所谓的伪回归,虽然看起来相关性很高,但其实毫无意义。
那该怎么办呢?
这里我们用了一个强大的“魔法”——协整(Cointegration)。
概念速览: 即使两个变量本身都非平稳,但如果它们之间存在一个长期稳定的均衡关系,那么它们的线性组合(比如回归后的残差)就是平稳的。这就意味着,它们之间存在着真实的、有意义的联系。
我们的发现: 通过专业的协整检验,我们惊讶地发现,我们的3日/9日移动平均线和黄金价格之间,恰好存在这种长期协整关系!
这意味着:我们可以放心地直接使用这些价格数据来建立线性回归模型,而不用担心“伪回归”的陷阱!
S_3 = Df['S_3'].dropna()S_9 = Df['S_9'].dropna()
close_price = Df['next_day_price']
coint_result_3 = coint(S_3, close_price)
coint_result_9 = coint(S_9, close_price)
p_value_3 = coint_result_3p_value_9 = coint_result_9
print(f"Cointegration p-value between S_3 and next_day_price: {p_value_3}")print(f"Cointegration p-value between S_9 and next_day_price: {p_value_9}")
alpha = 0.05if p_value_3 < alpha: print("S_3 and next_day_price are cointegrated.")else: print("S_3 and next_day_price are not cointegrated.")
if p_value_9 < alpha: print("S_9 and next_day_price are cointegrated.")else: print("S_9 and next_day_price are not cointegrated.")▍第三步:AI模型初见成效!
我们使用训练集数据,构建了一个简单的线性回归模型。它的核心思想就是找到一条直线,来最好地拟合特征(3日、9日均线)与目标(第二天价格)之间的关系。
模型公式如下:
金价=1.18×3日均线−0.19×9日均线+0.37
然后,我们用测试集数据来检验这个模型的预测效果。
结果惊人!
R²分数高达99.59%! 这个分数越高越好,接近100%意味着模型对价格变化的解释能力极强。
预测曲线图显示,模型的预测价格曲线与实际价格曲线几乎完全重合!
t = 0.8t = int(t*len(Df))
# 训练集X_train = X[:t]y_train = y[:t]
# 测试集X_test = Xy_test = 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_, linear.coef_, linear.intercept_))
# 预测黄金ETF价格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()
# R squarer2_score = linear.score(X, y)*100float("{0:.2f}".format(r2_score))▍第四步:揭秘!高准确率为何没能“暴富”?
看到这里,你可能会兴奋不已:“预测这么准,这不是闭着眼睛都能赚钱了吗?”
但现实,往往比模型复杂得多。我们用一个最简单的策略进行回测:如果模型预测下一天价格上涨,我们就买入并持有;否则就清仓。
结果呢?
尽管我们的预测准确率高达99.59%,但这个简单策略的夏普比率(Sharpe Ratio)只有可怜的1.6。
夏普比率是衡量风险调整后收益的指标,越高越好。1.6对于一个稳健、可扩展的交易系统来说,远算不上优秀。
为什么会出现这种巨大的反差?
这就是本次分析最重要、最深刻的洞察:预测价格和设计盈利策略是两码事!
预测的细微偏差: 尽管模型预测的曲线看起来和真实价格重合,但哪怕是微小的预测误差,在实际交易中都可能因为交易成本和滑点而被放大,导致亏损。
策略的单一性: 我们的策略只考虑“涨就买”,没有做空、没有止损止盈、没有仓位管理,这在复杂的市场中是极其脆弱的。
预测与信号的鸿沟: 模型预测的是价格水平,而我们需要的其实是交易信号(买入/卖出/观望)。如何将“预测价格上涨”这个信息,转化为一个具有高胜率、高赔率、低回撤的交易信号,才是真正的挑战。
gold = pd.DataFrame()
gold['price'] = Df['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.price < 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 ratiosharpe = gold['strategy_returns'].mean()/gold['strategy_returns'].std()*(252**0.5)'Sharpe Ratio %.2f' % (sharpe)▍第五步:总结与展望:你的量化之旅才刚刚开始!
高预测准确性 ≠ 高交易收益。 建立一个成功的量化策略,除了强大的预测模型,还需要:
精妙的交易逻辑: 何时入场,何时出场?
严格的风险管理: 止损点在哪?如何控制仓位?
持续的优化: 不断回测、不断改进。
下一步,你可以尝试:
更换更强大的AI模型: 比如随机森林、XGBoost、LSTM等,来捕捉更复杂的非线性关系。
增加更多预测特征: 比如RSI、MACD等技术指标,甚至宏观经济数据和黄金矿业股走势等。
重新设计交易策略: 将预测结果作为辅助,构建更全面的交易信号,并加入严格的风险控制。
这篇文章可以看到量化投资技术虽充满挑战,却同样充满乐趣。市场中的“所见”并非“所得”,唯有构建多维度、稳健的策略,方能穿越周期,稳步前行。
👋 欢迎点赞、关注或留言,告诉我你希望了解的量化内容,我们一起走量化之路!
页:
[1]