MetalAPI
XAU3,997.89−1.54%XAG53.936−1.51%XPT1,554.47−0.83%XPD1,047.03−0.44%XCU6.5080+2.29%WTI103.27+3.82%BRENT111.70−1.30%EUR1.120400−0.01%GBP1.337500−0.01%JPY0.0063761+0.14%CHF1.213445−0.25%TRY0.020125−0.12%BTC80,640.30−0.17%ETH2,353.99−0.08%
全部文章
黄金白银市场历史数据

金银比是什么:含义与计算方法

金银比衡量的是什么,如何根据实时金价和银价计算它,以及如何用 Python 和 JavaScript 通过 API 绘制其历史走势图。

作者:MetalAPI Team··阅读约 11 分钟

什么是金银比?

金银比是购买 1 金衡盎司黄金所需的白银金衡盎司数。用金价除以银价即可得到它,两者须以同一货币、同一重量单位计价。按 MetalAPI 文档中通用的示例价格,黄金每金衡盎司 3,997.89 美元、白银每金衡盎司 53.94 美元,金银比约为 74.1:按这些价格,1 盎司黄金约值 74 盎司白银。

由于两个价格使用同一货币,货币在相除时相互抵消,比值没有单位,因此它是直接比较这两种金属的一种简洁方式。解读方法如下:

  • 金银比上升意味着黄金相对白银走强:要么黄金涨幅大于白银,要么跌幅小于白银。
  • 金银比下降意味着白银相对黄金走强。
  • 金银比本身并不说明任一价格的方向。两种金属可能同时下跌而比值上升,也可能同时上涨而比值下降。

下文介绍如何正确计算金银比、为什么基础货币无关紧要,以及如何通过 MetalAPI REST API 追踪金银比并绘制图表。

本文是关于金银比如何定义和计算的科普文章,不构成财务或投资建议。文中价格均为 MetalAPI 文档中的示例数值,并非市场数据。

如何计算金银比

公式只是一次除法:

计算示例
金银比 = 金价 ÷ 银价   (同一货币、同一单位)

3,997.89 ÷ 53.94 ≈ 74.12

银金比 = 1 ÷ 74.12 ≈ 0.0135   (每盎司白银可换取的黄金盎司数)

除法本身很简单,出错的往往是输入:

  • 两种金属使用同一单位。用每盎司价格除以每盎司价格,或用每克价格除以每克价格。用每克金价除以每金衡盎司银价,结果会相差 31.1 倍,即 1 金衡盎司所含的克数(31.1034768)。
  • 同一时刻。两个价格要取自同一个响应或同一天的收盘价。用实时金价除以昨天的白银收盘价,会把两种不同的市场状态混在一起。
  • 同一类价格。用中间价除以中间价,或用收盘价除以收盘价。把一种金属的交易商售价与另一种金属的现货价混用,会把交易商的价差和溢价带进比值。
  • 最后再取整。用未取整的价格相除,只在显示时对比值取整,通常保留一到两位小数。

在 MetalAPI 的响应中,价格是以基础货币为前缀的键:默认基础货币为 USD 时,即 USDXAU 和 USDXAG。不带前缀的 XAU 和 XAG 键是倒数(每美元可买到的盎司数)。用 XAG 除以 XAU 得到的比值相同,但读取带前缀的键可以避免把倒数当作价格。

为什么基础货币无关紧要

黄金和白银通常以美元报价,但金银比在任何货币下都相同。使用 base=EUR 时,MetalAPI 会将美元价格除以 1 欧元的美元价格,以欧元表示两种价格,而这个共同因子在相除时相互抵消:

text
EURXAU = USDXAU ÷ USDEUR
EURXAG = USDXAG ÷ USDEUR

EURXAU ÷ EURXAG = USDXAU ÷ USDXAG

MetalAPI 根据同一快照计算所有交叉汇率,因此 base=EUR、base=INR 或 base=JPY 得到的金银比与以美元计算的相同,仅在十位有效数字的最后一位上可能存在取整差异。unit 也是如此:使用 unit=gram 时,两种金属的价格都会除以 31.1034768,比值不变。

只有当两个价格来自不同的来源或时间时,货币才会产生影响,例如以一种货币计的金价和几小时后以另一种货币获取的银价:此时汇率无法完全抵消。从同一个响应中获取两个价格即可避免这种情况。

您也可以让 API 来做除法。base 接受任何受支持的品种,包括金属。使用 base=XAG 时,所有价格都以白银金衡盎司表示,因此 XAGXAU,即 1 盎司黄金以白银计的价格,就是金银比本身:

bash
curl "https://metalapi.com/api/v1/latest?base=XAG&currencies=XAU" \
  -H "X-API-Key: $METALAPI_KEY"

在该响应中,不带前缀的 XAU 键是倒数:每盎司白银可换取的黄金盎司数。本文其余部分则改为根据美元价格计算金银比,因为您通常希望把两个价格与比值一起显示或存储。

通过 API 获取当前金银比

一次带 currencies=XAU,XAG 的 /latest 请求即可从同一快照返回两个价格,并且只计为一次请求。在 Node.js 18 或更高版本中,将以下代码保存为 ratio.mjs,然后运行 node ratio.mjs:

ratio.mjs
const params = new URLSearchParams({ currencies: "XAU,XAG" });
const res = await fetch(`https://metalapi.com/api/v1/latest?${params}`, {
  headers: { "X-API-Key": process.env.METALAPI_KEY },
  signal: AbortSignal.timeout(10_000),
});
const data = await res.json();
if (!data.success) {
  throw new Error(`MetalAPI ${data.error.code} (${data.error.type}): ${data.error.info}`);
}

const gold = data.rates[`${data.base}XAU`];
const silver = data.rates[`${data.base}XAG`];
const ratio = gold / silver;
const asOf = new Date(data.timestamp * 1000).toISOString();

console.log(`Gold:   ${gold} ${data.base} per troy ounce`);
console.log(`Silver: ${silver} ${data.base} per troy ounce`);
console.log(`Gold/silver ratio: ${ratio.toFixed(2)} (data from ${asOf})`);

按示例价格,最后一行会输出 74.12 的金银比。数据的新鲜程度取决于套餐的更新间隔:Free 每日更新,Lite 每 30 分钟,Standard 每 10 分钟,Advanced 和 Pro 每 60 秒,Enterprise 最快每 5 秒。每周五 17:00 至周日 17:00(纽约时间)现货市场休市,金银比保持在周五的收盘值。

/latest 得到的是中间价比值。如果您想知道金属实际可以兑换的比率,请使用买入价和卖出价。在 Standard 及以上套餐中,将 XAU-BID、XAU-ASK、XAG-BID 和 XAG-ASK 加入 currencies 即可获取:

  • 以买入价卖出 1 盎司黄金,可以买到 USDXAU-BID ÷ USDXAG-ASK 盎司白银。
  • 用白银买入 1 盎司黄金,需要 USDXAU-ASK ÷ USDXAG-BID 盎司白银。

由于两边的价差,这两个数字都不如中间价比值有利,此外还要加上交易商自己的溢价。现货价、买入价、卖出价与价差解释了这些报价是如何形成的。

如何绘制金银比历史走势图

绘制历史图表需要两种金属的每日收盘价。/timeframe(别名 /timeseries)可以在一次请求中返回某个日期区间的收盘价:Free 套餐单次请求最多 30 天,付费套餐最多 365 天。金属的每日历史数据从 2000 年开始,所有套餐都可以查询全部历史数据;各套餐的区别仅在于单次请求可以覆盖的天数。

下面的 Python 脚本以 365 天为一段下载最近五年的数据(共五次请求),为每个同时具有两种价格的日期计算金银比,写入 CSV 文件,输出几项统计数据,并保存一张带 50 日移动平均线的图表。在 Free 套餐中,请设置 MAX_DAYS = 30 和 DAYS_BACK = 90,这样只需三次请求。

ratio_history.py
import csv
import os
import statistics
from datetime import date, datetime, timedelta, timezone

import matplotlib.pyplot as plt
import requests

API = "https://metalapi.com/api/v1"
MAX_DAYS = 365       # 单次请求的最长区间:付费套餐为 365,Free 为 30
DAYS_BACK = 5 * 365  # 在 Free 套餐中,请将其控制在几个月以内

session = requests.Session()
session.headers["X-API-Key"] = os.environ["METALAPI_KEY"]


def daily_closes(start: date, end: date) -> dict:
    """从 start 到 end(含)的黄金和白银每日收盘价,以日期为键。"""
    rates = {}
    while start <= end:
        chunk_end = min(start + timedelta(days=MAX_DAYS), end)
        r = session.get(
            f"{API}/timeframe",
            params={"start_date": start.isoformat(), "end_date": chunk_end.isoformat(), "currencies": "XAU,XAG"},
            timeout=30,
        )
        data = r.json()
        if not data["success"]:
            err = data["error"]
            raise RuntimeError(f"MetalAPI {err['code']} ({err['type']}): {err['info']}")
        rates.update(data["rates"])
        start = chunk_end + timedelta(days=1)
    return rates


end = datetime.now(timezone.utc).date() - timedelta(days=1)  # 昨天的收盘价已是最终值
rates = daily_closes(end - timedelta(days=DAYS_BACK), end)

rows = []
for day in sorted(rates):
    values = rates[day]
    if "USDXAU" in values and "USDXAG" in values:  # 跳过缺少任一金属价格的日期
        gold, silver = values["USDXAU"], values["USDXAG"]
        rows.append((day, gold, silver, gold / silver))

with open("gold-silver-ratio.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["date", "gold_usd_oz", "silver_usd_oz", "ratio"])
    writer.writerows(rows)

ratios = [r[3] for r in rows]
print(f"{len(rows)} trading days, {rows[0][0]} to {rows[-1][0]}")
print(f"latest {ratios[-1]:.2f}, min {min(ratios):.2f}, max {max(ratios):.2f}, median {statistics.median(ratios):.2f}")

window = 50
days = [date.fromisoformat(r[0]) for r in rows]
moving = [sum(ratios[i - window + 1 : i + 1]) / window for i in range(window - 1, len(ratios))]

plt.figure(figsize=(10, 4))
plt.plot(days, ratios, linewidth=1, label="Gold/silver ratio")
plt.plot(days[window - 1 :], moving, linewidth=1, label=f"{window}-day moving average")
plt.ylabel("Ounces of silver per ounce of gold")
plt.legend()
plt.tight_layout()
plt.savefig("gold-silver-ratio.png", dpi=150)

有几处细节是有意为之的:

  • 遍历返回的日期,而不是日历日期。/timeframe 会略去周末和市场假日。
  • 截止到昨天的 UTC 日期。今天的数据仍在变动,而未来的 end_date 会返回错误 205。
  • 将两个价格与比值一起存储,这样无需重新下载即可核对任意一行。
  • 统计数据仅反映您下载的时间段。修改 DAYS_BACK,统计结果也会随之改变。

在 JavaScript 中,同样的序列只需对 /timeframe 响应的 rates 对象做一次 map,例如使用历史数据指南中的区间辅助函数获取的数据:

javascript
// rates 为 /timeframe?currencies=XAU,XAG 响应中的 "rates" 对象
const series = Object.entries(rates)
  .filter(([, r]) => r.USDXAU && r.USDXAG)
  .sort(([a], [b]) => a.localeCompare(b))
  .map(([day, r]) => ({ day, gold: r.USDXAU, silver: r.USDXAG, ratio: r.USDXAU / r.USDXAG }));

过去日期的收盘价不会改变,因此请一次性下载一个区间,之后用一个短请求补充最新的几天。关于回填到 2000 年的完整数据(付费套餐约需 27 次请求)、SQLite 存档以及同时展示金价和金银比的 matplotlib 图表,请参阅通过 API 获取黄金和白银历史价格。

2026 年 10 月之前的金属价格源自近月期货,因此可能与同一天的现货价格略有差异。两种金属的推导方式相同,但在将您的序列与其他来源的金银比图表进行比较时,请记住这一点。

人们如何使用金银比

金银比是一个相对指标。它描述的是黄金和白银彼此之间的相对走势,而不是任何一方的未来方向。常见用途如下:

  • 相对表现。期末金银比除以期初金银比,等于黄金的增长倍数除以白银的增长倍数。金银比上升 5%,意味着在此期间黄金相对白银上涨了 5%,无论两者的绝对价格如何变化。
  • 为数据看板和报告提供背景信息。价格追踪工具、交易商网站和新闻简报会在两个价格旁边显示金银比;同一个 /latest 请求即可提供,无需额外成本。
  • 与自身历史比较。有些人会将当前金银比与其在自选时间段内的平均值、中位数或区间进行比较,以说明它相对于该时间段是偏高还是偏低。上面的脚本会针对您下载的任意区间输出这些数字。
  • 在金属之间互换。一些实物金属持有者会在金银比达到事先设定的水平时,将黄金换成白银或换回黄金。这样做最终能否换得更多金属,取决于金银比之后是否按预期方向变动,而这一点没有任何保证;每次互换还要支付上文提到的交易商价差和溢价。
  • 其他比值。同样的除法适用于以同一货币计的任意两个价格:金铂比(USDXAU ÷ USDXPT),或金油比(USDXAU ÷ USDWTI,即每盎司黄金可换取的原油桶数)。计算跨资产比值时,请让 unit 保持默认值,因为 unit 会改变金属价格,但不会改变能源价格。

这些用途都不是预测。金银比没有必须回归的固定正常水平,读数偏高或偏低本身也不是买入或卖出任何一种金属的理由。如果您要做投资决策,请咨询合格的财务顾问。

在您的应用中追踪金银比

创建免费账户即可获得 API 密钥。Free 套餐每月 100 次请求、每日价格和 30 天区间,足以计算每日金银比并获取几个月的历史数据。付费套餐提供更新鲜的价格、适合长期回填的 365 天区间,以及从 Standard 起提供的买入价/卖出价;请在定价页面比较各套餐。如果只需要白银价格,请参阅白银价格 API 指南。

常见问题

金银比为 74 是什么意思?

这意味着按所用价格,1 金衡盎司黄金的价值约等于 74 金衡盎司白银。它只描述两种金属的相对价格,并不说明任何一种金属在绝对意义上是贵还是便宜。

金银比在任何货币和单位下都相同吗?

是的,只要两个价格来自同一时刻并针对同一重量,因为货币和单位在相除时会相互抵消。MetalAPI 根据同一快照推导所有货币和单位,因此任何 base 和 unit 得到的金银比都相同,仅有极微小的取整差异。

金银比多久变化一次?

只要任一价格变动,金银比就会变化,而在市场开放期间价格一直在变动。通过 API,您按套餐的更新间隔看到它,从 Free 的每日一次到 Enterprise 的每 5 秒一次。周末期间它保持在周五的数值。

金银比可以追溯计算到多久以前?

所有套餐都提供自 2000 年起的黄金和白银每日收盘价。单次 /timeframe 请求最多覆盖 30 天(Free)或 365 天(付费套餐),因此在付费套餐中获取完整历史约需 27 次请求。2026 年 10 月之前的价格源自近月期货。

金银比偏高是买入白银的信号吗?

本文不提供投资建议。金银比偏高仅意味着与您所比较的时间段相比,黄金相对白银较贵。它并不能预测任一价格或金银比本身接下来会如何变动。

用您自己的数据试一试

创建免费账户,两分钟内即可发起第一次请求。每月 100 次请求,无需信用卡。

继续阅读