[核心资源] 本文提供基于25年COMEX黄金期货日度价格数据的完整分析流程,涵盖数据预处理、特征工程、可视化与算法开发。文末附上免费数据集 及完整Python代码,便于复现与扩展。
【数据集下载链接】 : 文章最后面获取
引言:从原始数据到系统化分析
黄金价格的时间序列数据为探索周期性模式、开发技术指标和构建数据驱动应用提供了丰富素材。本文以COMEX黄金期货日度价格数据集(2000-2025) 为依托,展示如何通过Python实现系统化数据分析。我们聚焦技术方法与实现逻辑,从数据清洗到算法验证,构建一个可复用的分析框架,适用于数据分析、算法开发和内容创作等场景。
一、数据加载与预处理
分析的第一步是加载数据并进行清洗,确保数据质量满足后续分析需求。
python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置图表样式
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 支持中文
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集
df = pd.read_csv('gold_futures_daily_prices_2000_2025.csv')
# 数据清洗
df['Date'] = pd.to_datetime(df['Date'], errors='coerce') # 转换日期格式
df.dropna(subset=['Date', 'Close', 'Open', 'High', 'Low', 'Volume'], inplace=True) # 移除缺失值
df.sort_values('Date', inplace=True) # 按日期排序
# 预览数据
print("数据集前5行预览:")
print(df.head())
预处理要点:
-
将Date转换为时间序列格式,便于时间轴分析。
-
移除缺失值,确保数据完整性。
-
按日期排序,为时间序列分析奠定基础。
二、数据集关键字段说明
以下是分析中使用的核心字段及其技术用途:
| 字段名 | 数据类型 | 技术用途 |
|---|---|---|
| Date | 日期型 | 时间序列分析,构建趋势与周期 |
| Open | 数值型 | 开盘价,计算日内波动与K线形态 |
| High | 数值型 | 最高价,计算振幅与阻力位 |
| Low | 数值型 | 最低价,计算支撑位与波动率 |
| Close | 数值型 | 收盘价,核心指标,计算均线等 |
| Volume | 数值型 | 成交量,分析市场活跃度与信号强度 |
数据特性:
-
OHLCV结构:支持K线图绘制、技术指标计算(如均线、ATR)。
-
25年日度数据:覆盖2008年金融危机、2013年价格调整、2020年疫情等周期,适合长期趋势分析。
-
高完整性:缺失率极低,适于复杂算法开发。
三、核心分析:时间序列趋势与周期性特征
我们首先分析黄金价格的长期趋势,探索其周期性模式。
python
# 按年聚合,计算年度均价
df['Year'] = df['Date'].dt.year
yearly_avg = df.groupby('Year')['Close'].mean().reset_index()
# 可视化年度趋势
plt.figure(figsize=(14, 7))
sns.lineplot(x='Year', y='Close', data=yearly_avg, marker='o', color='#FFD700')
plt.title('2000-2025年黄金价格年度均值趋势', fontsize=16)
plt.xlabel('年份', fontsize=12)
plt.ylabel('收盘价均值(美元/盎司)', fontsize=12)
plt.grid(True)
plt.show()
分析结果:
-
2000-2011年价格呈现上升趋势,2013年出现显著调整,之后进入震荡上行阶段。
-
2020年后价格达到新高,显示长期趋势的结构性变化。
-
短期波动频繁,需结合技术指标进一步分析。
四、特征工程:构建技术指标
为捕捉价格波动中的关键信号,我们开发两个技术指标:真实波幅均值(ATR) 和价量复合指标,用于量化市场波动和活跃度。
python
# 计算ATR(真实波幅均值,窗口期14天)
df['TR'] = df[['High', 'Low', 'Close']].apply(
lambda x: max(x['High'] - x['Low'], abs(x['High'] - df['Close'].shift(1).iloc[x.name]),
abs(x['Low'] - df['Close'].shift(1).iloc[x.name])), axis=1)
df['ATR'] = df['TR'].rolling(window=14).mean()
# 计算价量复合指标
df['Amplitude'] = (df['High'] - df['Low']) / df['Close'] * 100 # 日内振幅百分比
df['Volume_Change'] = df['Volume'].pct_change() * 100 # 成交量变化百分比
df['Signal_Strength'] = (df['Amplitude'] * 0.5) + (df['Volume_Change'].clip(lower=0) * 0.5)
# 筛选高信号强度事件(前1%)
signal_threshold = df['Signal_Strength'].quantile(0.99)
high_signal_events = df[df['Signal_Strength'] >= signal_threshold][['Date', 'Close', 'ATR', 'Signal_Strength']]
# 可视化
plt.figure(figsize=(14, 7))
plt.plot(df['Date'], df['Close'], label='收盘价', color='#FFD700')
plt.scatter(high_signal_events['Date'], high_signal_events['Close'], color='red', label='高信号点', s=100)
plt.title('2000-2025年黄金价格与高信号点', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('收盘价(美元/盎司)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
技术洞察:
-
ATR量化价格波动强度,高值通常对应剧烈波动期(如2008、2013年)。
-
价量复合指标结合振幅与成交量变化,捕捉市场活跃度峰值,适合用于信号检测。
-
高信号点常出现在趋势转折或加速阶段,可作为算法触发条件。
五、算法开发:双均线交叉策略验证
为验证技术指标的应用效果,我们实现一个双均线交叉策略,测试其在历史数据中的表现。
python
# 计算短期(10天)和长期(50天)均线
df['MA10'] = df['Close'].rolling(window=10).mean()
df['MA50'] = df['Close'].rolling(window=50).mean()
# 生成信号:MA10上穿MA50为正信号,MA10下穿MA50为负信号
df['Signal'] = 0
df.loc[df['MA10'] > df['MA50'], 'Signal'] = 1 # 正信号
df.loc[df['MA10'] < df['MA50'], 'Signal'] = -1 # 负信号
# 模拟信号触发
signals = []
for i in range(1, len(df)):
if df['Signal'].iloc[i] == 1 and df['Signal'].iloc[i-1] != 1: # 正信号触发
signals.append({'Date': df['Date'].iloc[i], 'Action': 'Positive', 'Price': df['Close'].iloc[i]})
elif df['Signal'].iloc[i] == -1 and df['Signal'].iloc[i-1] != -1: # 负信号触发
signals.append({'Date': df['Date'].iloc[i], 'Action': 'Negative', 'Price': df['Close'].iloc[i]})
signals_df = pd.DataFrame(signals)
print("信号记录预览:")
print(signals_df.head())
# 计算累积变化率
signals_df['Change'] = signals_df['Price'].pct_change().where(signals_df['Action'] == 'Negative')
cumulative_change = (signals_df['Change'].fillna(0) + 1).prod() - 1
years = (df['Date'].iloc[-1] - df['Date'].iloc[0]).days / 365.25
annualized_change = ((1 + cumulative_change) ** (1 / years) - 1) * 100
print(f"均线交叉策略年化变化率: {annualized_change:.2f}%")
技术洞察:
-
策略在趋势明显时(如2000-2011年)信号较为有效,但在震荡期(如2013-2019年)易产生误报。
-
可通过结合Volume或ATR优化信号过滤,提升鲁棒性。
-
该策略适合作为算法开发的入门案例,可扩展为动态参数优化或多因子模型。
六、应用场景:季节性模式分析与可视化
为数据分析师或内容创作者,我们挖掘黄金价格的季节性模式,展示如何生成高价值的可视化内容。
python
# 提取月份并计算月度平均变化率
df['Month'] = df['Date'].dt.month
monthly_changes = df.groupby('Month')['Close'].pct_change().groupby(df['Month']).mean() * 100
# 可视化
plt.figure(figsize=(12, 6))
sns.barplot(x=monthly_changes.index, y=monthly_changes.values, palette='viridis')
plt.title('2000-2025年黄金价格月度平均变化率', fontsize=16)
plt.xlabel('月份', fontsize=12)
plt.ylabel('平均变化率 (%)', fontsize=12)
plt.grid(True)
plt.show()
应用价值:
-
分析结果:9月和5月平均变化率偏负,8月和7月偏正,显示潜在的季节性规律。
-
技术应用:可用于开发动态可视化工具或交互式数据仪表盘。
-
内容创作:生成"黄金价格月度规律"图表,适用于技术博客或数据分析报告。
数据驱动的分析思维
通过25年黄金价格数据的分析,我们从数据预处理 到特征工程 、算法验证 和应用开发 ,构建了一个完整的分析链条。这一问题驱动、数据导向的框架,不仅适用于金融数据分析,也可迁移到其他时间序列或结构化数据集。
如果这篇文章对你有帮助,欢迎点赞👍收藏⭐关注🔔