36  黄金价格与美债收益率的相关分析

36.1 引言黄金与国债的负相关关系

经典关系: - 实际利率 = 名义利率 - 通胀率 - 黄金: 不生息资产,实际利率上升时吸引力下降 - 国债: 无风险资产,收益率上升吸引力上升

理论预期: 黄金价格与国债收益率负相关

36.2 数据准备

列表 36.1
# 注:该代码块读取远程平台数据文件,且变量名与下方代码不匹配,渲染时无法正确执行
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd  # 导入Pandas数据分析库
#读取黄金期货历史数据.csv和美国十年期国债收益率历史数据.csv
df1 = pd.read_csv('https://huoran.oss-cn-shenzhen.aliyuncs.com/20230411/csv/1645737586192834560.csv', thousands=',')

# 从CSV文件读取数据存入df2
df2 = pd.read_csv('https://huoran.oss-cn-shenzhen.aliyuncs.com/20230411/csv/1645737641935134720.csv', thousands=',')

#将index设置为日期,并转换为datetime类型
df1.set_index('日期', inplace=True)
df1.index = pd.to_datetime(df1.index)  # 转换为日期时间格式
df2.set_index('日期', inplace=True)  # 将日期列设为df2数据框的索引
df2.index = pd.to_datetime(df2.index)  # 转换为日期时间格式
#数据倒转
df1 = df1.iloc[::-1]
df2 = df2.iloc[::-1]  # 将数据按逆序排列
#提取黄金期货历史数据.csv中的收盘价,并转换为float类型
df1 = df1['收盘']
df1 = df1.astype(float)  # 转换数据类型
#提取美国十年期国债收益率历史数据.csv中的收盘价,并转换为float类型
df2 = df2['收盘']
df2 = df2.astype(float)  # 转换数据类型
 
#计算相关系数
result = df1.corr(df2)
print(result)  # 输出分析结果数据

36.3 相关性计算

列表 36.2
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行

# =============================================================================
# 题目: 计算并解读黄金价格与国债收益率的相关系数
# =============================================================================
# 本任务演示如何使用Pandas计算两个时间序列的相关系数,
# 并根据相关系数的大小解释两个变量之间的线性关系强度

# ==================== 计算相关系数 ====================
# gold_price.corr(treasury_yield): 计算两个Series的Pearson相关系数
#   - gold_price: 第一个Series(黄金价格)
#   - treasury_yield: 第二个Series(国债收益率)
#   - .corr(): Series的方法,计算与另一个Series的相关系数
#
# Pearson相关系数公式:
#   ρ = Cov(X, Y) / (σ_X × σ_Y)
#   其中: Cov是协方差, σ是标准差
#
# 相关系数的取值范围: [-1, 1]
#   - ρ = 1: 完全正相关(一个变量增加,另一个也增加)
#   - ρ = -1: 完全负相关(一个变量增加,另一个减少)
#   - ρ = 0: 无线性相关
correlation = gold_price.corr(treasury_yield)
# correlation: 存储计算得到的相关系数值
# 理论预期: 黄金价格与国债收益率应该呈负相关(ρ < 0)
# 原因: 国债收益率上升→实际利率上升→持有黄金的机会成本增加→黄金需求下降→价格下跌

# ==================== 打印相关系数结果 ====================
# f'{correlation:.4f}': f-string格式化输出
#   - f: 格式化字符串前缀
#   - {}: 占位符,里面填写变量名
#   - :.4f: 格式说明符,.4表示保留4位小数,f表示浮点数
# 示例: 如果correlation = -0.654321..., 输出为"-0.6543"
print(f'黄金价格与国债收益率相关系数: {correlation:.4f}')
# 输出示例: 黄金价格与国债收益率相关系数: -0.6543
# 这表示两者呈中度负相关

# ==================== 结果解读 ====================
# 根据相关系数的大小,解释两个变量之间的关系强度
# 使用if-elif-else结构进行多条件判断
print('\n相关性解读:')
# \n表示换行,使输出更清晰

# ==================== 情况1: 强负相关 ====================
# if correlation < -0.5: 如果相关系数小于-0.5
#   - 负号表示负相关(一个上升,另一个下降)
#   - 绝对值大于0.5表示关系较强
#   - 这符合金融理论的预期
if correlation < -0.5:
    print('  强负相关,符合理论预期')
    # 输出: 强负相关,符合理论预期
    print('  国债收益率上升时,黄金价格下跌')
    # 输出: 国债收益率上升时,黄金价格下跌
    # 经济学解释:
    #   1. 替代效应: 国债收益率上升→持有国债更有吸引力→资金从黄金流向国债
    #   2. 机会成本: 持有黄金不产生利息,国债收益率上升→持有黄金的机会成本增加
    #   3. 美元汇率: 国债收益率上升→美元升值→黄金(美元计价)下跌

# ==================== 情况2: 中度负相关 ====================
# elif: else if的缩写,表示"否则如果"
# 当前面的条件不满足,但这个条件满足时执行
elif correlation < -0.3:
    # 相关系数在-0.5到-0.3之间,存在中度负相关
    # 虽然方向正确,但关系不是特别强
    print('  中度负相关')
    # 输出: 中度负相关
    print('  大部分时候符合负相关关系')
    # 输出: 大部分时候符合负相关关系
    # 说明:
    #   负相关关系存在,但不够稳定
    #   可能受其他因素干扰(如通胀预期、避险需求等)

# ==================== 情况3: 弱相关 ====================
elif correlation < 0.3:
    # 相关系数在-0.3到0.3之间,接近0,表示几乎没有线性关系
    # 这种情况下,两个变量的变动几乎独立
    print('  弱相关')
    # 输出: 弱相关
    print('  其他因素影响更大')
    # 输出: 其他因素影响更大
    # 说明:
    #   黄金价格和国债收益率之间的关系不明显
    #   可能有其他因素主导黄金价格(如通胀、地缘政治、美元指数等)

# ==================== 情况4: 正相关或无关 ====================
else:
    # 相关系数大于0.3,甚至为正,与理论预期相反
    # 这是一个意外结果,需要寻找特殊原因
    print('  正相关或接近0')
    # 输出: 正相关或接近0
    print('  不符合经典理论,可能有其他主导因素')
    # 输出: 不符合经典理论,可能有其他主导因素
    # 可能的原因:
    #   1. 通胀预期高: 通胀上升→黄金保值需求增加→金价上涨
    #                同时通胀导致国债收益率上升(为了补偿通胀)
    #   2. 避险需求: 地缘政治风险→资金同时流入黄金和国债(都是避险资产)
    #   3. 实际利率为负: 通胀>名义利率→实际利率下降→黄金吸引力上升

36.4 可视化分析

列表 36.3
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行

# =============================================================================
# 题目: 绘制黄金价格与国债收益率的双轴趋势图
# =============================================================================
# 本任务演示如何使用matplotlib创建双Y轴图表,
# 在同一张图上展示两个量纲不同的变量(价格和百分比)

# ==================== 创建画布和主坐标轴 ====================
# plt.subplots(): 创建一个图表(figure)和一个或多个子图(axes)
# figsize=(14, 6): 设置图表大小为14英寸×6英寸
#   - 14英寸: 宽度,适合展示较长的时间序列
#   - 6英寸: 高度,提供足够的垂直空间
# fig: Figure对象,整个图表的容器
# ax1: Axes对象,主坐标轴(左侧Y轴)
fig, ax1 = plt.subplots(figsize=(14, 6))
# 返回: (Figure, Axes)的元组

# ==================== 绘制黄金价格(左轴) ====================
# ax1.plot(): 在主坐标轴上绘制折线图
#   - gold_price.index: X轴数据(日期)
#   - gold_price.values: Y轴数据(黄金价格)
#   - 'b-': 颜色和线型,'b'=蓝色(blue),'-'=实线
#   - label='黄金价格': 图例标签
#   - linewidth=2: 线宽为2,使线条更醒目
ax1.plot(gold_price.index, gold_price.values, 'b-', label='黄金价格', linewidth=2)
# 在左轴上绘制黄金价格的蓝色折线

# ==================== 设置主坐标轴标签 ====================
# ax1.set_xlabel(): 设置X轴标签
#   - '日期': 标签文本
#   - fontsize=12: 字体大小为12磅
ax1.set_xlabel('日期', fontsize=12)
# X轴显示日期

# ax1.set_ylabel(): 设置Y轴标签
#   - '黄金价格': 标签文本
#   - fontsize=12: 字体大小
#   - color='b': 标签颜色为蓝色,与数据线颜色一致
ax1.set_ylabel('黄金价格', fontsize=12, color='b')
# 左Y轴显示黄金价格,标签为蓝色

# ax1.tick_params(): 设置坐标轴刻度样式
#   - axis='y': 只设置Y轴的刻度
#   - labelcolor='b': 刻度标签的颜色为蓝色
ax1.tick_params(axis='y', labelcolor='b')
# 左Y轴的刻度标签设为蓝色

# ax1.legend(): 显示图例
#   - loc='upper left': 图例位置在左上角
ax1.legend(loc='upper left')
# 在左上角显示"黄金价格"的图例

# ==================== 创建次坐标轴(右轴) ====================
# ax1.twinx(): 创建共享X轴的次Y轴
#   - twinx: "twin x-axis"的缩写,表示X轴相同,Y轴独立
#   - 返回新的Axes对象ax2,与ax1共享X轴但Y轴独立
# 为什么需要次坐标轴?
#   黄金价格(如1500-2000美元/盎司)和国债收益率(如1%-5%)的数值范围差异很大
#   如果用同一个Y轴,国债收益率的曲线会几乎贴着X轴,看不清变化趋势
#   次坐标轴可以让两个序列都在合适的范围内显示
ax2 = ax1.twinx()
# 创建右Y轴

# ==================== 绘制国债收益率(右轴) ====================
# ax2.plot(): 在次坐标轴上绘制折线图
#   - treasury_yield.index: X轴数据(日期,与左轴共享)
#   - treasury_yield.values: Y轴数据(国债收益率)
#   - 'r-': 颜色和线型,'r'=红色(red),'-'=实线
#   - label='国债收益率': 图例标签
#   - linewidth=2: 线宽为2
ax2.plot(treasury_yield.index, treasury_yield.values, 'r-', label='国债收益率', linewidth=2)
# 在右轴上绘制国债收益率的红色折线

# ==================== 设置次坐标轴标签 ====================
# ax2.set_ylabel(): 设置次Y轴标签
#   - '国债收益率(%)': 标签文本,单位是百分比
#   - fontsize=12: 字体大小
#   - color='r': 标签颜色为红色,与数据线颜色一致
ax2.set_ylabel('国债收益率(%)', fontsize=12, color='r')
# 右Y轴显示国债收益率,标签为红色

# ax2.tick_params(): 设置次Y轴刻度样式
#   - axis='y': 只设置Y轴
#   - labelcolor='r': 刻度标签为红色
ax2.tick_params(axis='y', labelcolor='r')
# 右Y轴的刻度标签设为红色

# ax2.legend(): 显示图例
#   - loc='upper right': 图例位置在右上角
ax2.legend(loc='upper right')
# 在右上角显示"国债收益率"的图例

# ==================== 设置图表标题 ====================
# plt.title(): 设置图表标题
#   - '黄金价格与国债收益率趋势': 标题文本
#   - fontsize=14: 字体大小为14磅(比轴标签大)
#   - fontweight='bold': 字体加粗,使标题更醒目
plt.title('黄金价格与国债收益率趋势', fontsize=14)
# 设置图表主标题

# ==================== 优化布局 ====================
# fig.tight_layout(): 自动调整子图参数,避免元素重叠
#   - 自动调整边距,确保标签、标题不会被截断
#   - 避免X轴日期标签、Y轴标签、图例等元素相互遮挡
fig.tight_layout()
# 优化图表布局

# ==================== 显示图表 ====================
# plt.show(): 显示创建的图表
#   - 在Jupyter Notebook中会直接显示在输出单元中
#   - 在Python脚本中会弹出窗口显示图表
plt.show()
# 展示双Y轴趋势图

36.5 经济学解释

负相关机制: 1. 替代效应: 国债收益率上升→持有国债吸引力↑→黄金需求↓ 2. 机会成本: 国债收益率↑→持有黄金的机会成本↑ 3. 美元汇率: 国债收益率↑→美元升值→黄金(美元计价)下跌

背离情况: - 通胀预期高: 通胀上升→黄金保值需求↑→金价上涨 - 避险需求: 地缘政治风险→黄金和美债同涨 - 实际利率: 通胀>名义利率→实际利率↓→黄金上涨