金銀比価とは:意味と計算方法をわかりやすく解説
金銀比価が何を示すのか、金と銀のリアルタイム価格からの計算方法、PythonとJavaScriptでAPIを使って過去の推移をチャートにする方法を解説します。
金銀比価とは?
金銀比価とは、金1トロイオンスを買うのに必要な銀のトロイオンス数です。同じ通貨・同じ重量あたりの金価格を銀価格で割って求めます。MetalAPIのドキュメント全体で使われている例の価格、つまり1トロイオンスあたり金3,997.89米ドル、銀53.94米ドルでは、比価は約74.1です。この価格では、金1オンスの価値は銀約74オンスに相当します。
両方の価格が同じ通貨建てなので通貨は相殺され、比価には単位がありません。そのため、2つの金属を直接比べる簡潔な指標になります。読み方は次のとおりです:
- 比価が上昇していれば、金が銀に対して値上がりしたことを意味します。金が銀より大きく上昇したか、下落幅が小さかったかのどちらかです。
- 比価が下落していれば、銀が金に対して値上がりしたことを意味します。
- 比価だけでは、どちらの価格の方向もわかりません。両方の金属が下落しても比価が上昇することがあり、両方が上昇しても比価が下落することがあります。
以下では、比価を正しく計算する方法、基準通貨が関係ない理由、MetalAPIのREST APIで比価を追跡してチャートにする方法を説明します。
この記事は、比価の定義と計算方法に関する教育目的のものです。金融や投資の助言ではなく、記事中の価格はMetalAPIのドキュメントの例の値で、市場データではありません。
金銀比価の計算方法
計算式は1回の割り算です:
金銀比価 = 金価格 ÷ 銀価格 (同じ通貨、同じ単位)
3,997.89 ÷ 53.94 ≈ 74.12
銀金比価 = 1 ÷ 74.12 ≈ 0.0135 (銀1オンスあたりの金のオンス数)割り算自体は簡単です。間違いが起こるのは入力値のほうです:
- 両方の金属で同じ単位を使う。 1オンスあたりの価格は1オンスあたりの価格で、1グラムあたりの価格は1グラムあたりの価格で割ってください。1グラムあたりの金価格を1トロイオンスあたりの銀価格で割ると、1トロイオンスのグラム数(31.1034768)である31.1倍ずれてしまいます。
- 同じ時点の価格を使う。 両方の価格は、同じレスポンスまたは同じ日の終値から取得してください。金のリアルタイム価格を前日の銀の終値で割ると、異なる2つの市場の状態が混ざります。
- 同じ種類の価格を使う。 仲値は仲値で、終値は終値で割ってください。一方の金属にディーラーの販売価格を、もう一方にスポット価格を使うと、ディーラーのスプレッドとプレミアムが比価に加わってしまいます。
- 丸めは最後に行う。 丸める前の価格で割り算をし、表示するときだけ比価を丸めてください。通常は小数点以下1~2桁です。
MetalAPIのレスポンスでは、価格は基準通貨を接頭辞に持つキーです。デフォルトの基準通貨USDではUSDXAUとUSDXAGです。接頭辞のないXAUとXAGのキーは逆数(1ドルあたりのオンス数)です。XAGをXAUで割っても同じ比価が得られますが、接頭辞付きのキーを読み取れば、逆数を価格と取り違えずに済みます。
基準通貨が関係ない理由
金と銀は通常米ドル建てで提示されますが、比価はどの通貨でも同じです。base=EURを指定すると、MetalAPIはドル建て価格を1ユーロの米ドル建て価格で割って、両方の価格をユーロで表します。この共通の係数は割り算で相殺されます:
EURXAU = USDXAU ÷ USDEUR
EURXAG = USDXAG ÷ USDEUR
EURXAU ÷ EURXAG = USDXAU ÷ USDXAGMetalAPIはすべてのクロスレートを1つのスナップショットから計算するため、base=EUR、base=INR、base=JPYのいずれでも、有効数字10桁の最後の桁の丸めを除いて、米ドル建てと同じ比価になります。unitについても同様です。unit=gramを指定すると両方の金属価格が31.1034768で割られ、比価は変わりません。
2つの価格の取得元や時刻が異なる場合は、通貨が影響します。たとえば、ある通貨建ての金価格と、数時間後に別の通貨建てで取得した銀価格を使うと、為替レートが正確には相殺されません。両方の価格を1つのレスポンスから取得すれば、この問題を避けられます。
割り算をAPIに任せることもできます。baseには、金属を含め、サポートされている任意のシンボルを指定できます。base=XAGでは、すべての価格が銀のトロイオンス建てで表されるため、金1オンスの銀建て価格であるXAGXAUが比価そのものになります:
curl "https://metalapi.com/api/v1/latest?base=XAG¤cies=XAU" \
-H "X-API-Key: $METALAPI_KEY"このレスポンスでは、接頭辞のないXAUキーは逆数、つまり銀1オンスあたりの金のオンス数です。この記事の以降の部分では、比価を米ドル建て価格から計算します。通常は、比価の横に2つの価格も表示・保存したいからです。
APIで現在の金銀比価を取得する
currencies=XAU,XAGを指定した1回の/latestリクエストで、同じスナップショットから両方の価格が返され、カウントは1リクエストです。Node.js 18以降では、次のコードをratio.mjsとして保存し、node 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から得られる比価は仲値の比価です。実際に金属を交換できるレートが必要な場合は、BidとAskの価格を使ってください。Standardプラン以上で、currenciesにXAU-BID、XAU-ASK、XAG-BID、XAG-ASKを追加すると取得できます:
- 金1オンスをBidで売ると、
USDXAU-BID ÷ USDXAG-ASKオンスの銀を買えます。 - 銀で金1オンスを買うには、
USDXAU-ASK ÷ USDXAG-BIDオンスの銀が必要です。
どちらの数値も、2つのスプレッドの分だけ仲値の比価より不利になり、さらにディーラー独自のプレミアムが上乗せされます。これらの気配値がどう作られるかは、スポット、Bid、Ask、スプレッドで解説しています。
金銀比価の推移をチャートにする方法
過去のチャートには、両方の金属の日次終値が必要です。/timeframe(エイリアス/timeseries)は、指定した期間の終値を1回のリクエストで返します。1リクエストあたり、Freeプランでは最大30日、有料プランでは最大365日です。金属の日次履歴は2000年から始まり、どのプランでも全期間を照会できます。プランによって異なるのは、1回のリクエストで指定できる日数だけです。
次のPythonスクリプトは、直近5年分を365日ずつ(5リクエスト)ダウンロードし、両方の価格がそろっている日ごとに比価を計算してCSVファイルに書き出し、いくつかの統計値を出力して、50日移動平均付きのチャートを保存します。Freeプランでは、MAX_DAYS = 30とDAYS_BACK = 90に設定してください。この場合は3リクエストです。
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 # 1リクエストあたりの最長期間:有料プランは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オブジェクトに対する1回のmapで作れます。たとえば、過去データガイドにある期間取得用のヘルパーの結果に使えます:
// 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%上昇したということは、2つの価格が絶対値でどう動いたかにかかわらず、その期間に金が銀に対して5%値上がりしたことを意味します。
- ダッシュボードやレポートでの参考情報。 価格トラッカー、ディーラーのサイト、ニュースレターでは、2つの価格の横に比価を表示しています。同じ
/latestリクエストで、追加コストなしに比価を得られます。 - 自身の過去との比較。 現在の比価を、自分で選んだ期間の平均値、中央値、範囲と比べ、その期間と比べて高いか低いかを説明する人もいます。上のスクリプトは、ダウンロードした期間についてこれらの数値を出力します。
- 金属間の乗り換え。 現物の金属を保有する人の中には、比価があらかじめ決めた水準に達したときに金を銀に、あるいはその逆に交換する人もいます。それで金属の量が増えるかどうかは、その後に比価が期待どおりに動くかどうか次第で、それは何も保証されていません。また、交換のたびに前述のディーラーのスプレッドとプレミアムを支払うことになります。
- その他の比価。 同じ通貨建ての任意の2つの価格で、同じ割り算ができます。金とプラチナ(
USDXAU ÷ USDXPT)や、金と原油(USDXAU ÷ USDWTI、金1オンスあたりの原油のバレル数)などです。異なる資産クラス間の比価では、unitはデフォルトのままにしてください。unitは金属の価格を変えますが、エネルギーの価格は変えないためです。
これらの使い方はいずれも予測ではありません。比価には戻るべき決まった平常水準はなく、高い値や低い値はそれだけでどちらかの金属を売買する理由にはなりません。投資判断を行う場合は、資格を持つファイナンシャルアドバイザーにご相談ください。
アプリで金銀比価を追跡する
無料アカウントを作成してAPIキーを取得してください。Freeプランの月100リクエスト、毎日の価格、30日間の期間指定で、日次の比価と数か月分の履歴には十分です。有料プランでは、より新しい価格、長期のバックフィルに使える365日間の期間指定、Standard以上ではBid/Ask価格が追加されます。プランの比較は料金ページをご覧ください。銀価格そのものについては、銀価格APIガイドをご覧ください。
よくある質問
金銀比価が74とはどういう意味ですか?
使用した価格において、金1トロイオンスが銀約74トロイオンスと同じ値段であることを意味します。表しているのは2つの金属の相対的な価格だけです。どちらかの金属が絶対的な意味で高いか安いかはわかりません。
金銀比価はどの通貨や単位でも同じですか?
はい。両方の価格が同じ時点のもので、同じ重量あたりであれば同じです。通貨と単位は割り算で相殺されるためです。MetalAPIはすべての通貨と単位を1つのスナップショットから算出するため、どのbaseやunitを使っても、ごくわずかな丸めの差を除いて同じ比価になります。
金銀比価はどれくらいの頻度で変わりますか?
どちらかの価格が動くたびに変わり、市場が開いている間は絶えず変動しています。APIでは、プランの更新間隔(Freeの毎日からEnterpriseの5秒ごとまで)で確認できます。週末の間は金曜日の値のままです。
比価はどこまで遡って計算できますか?
金と銀の日次終値は、すべてのプランで2000年まで遡れます。1回の/timeframeリクエストで取得できるのは、Freeでは最大30日、有料プランでは最大365日なので、全期間の履歴は有料プランで約27リクエストです。2026年10月より前の価格は期近の先物から算出されています。
金銀比価が高いのは銀を買うサインですか?
この記事は投資の助言を行うものではありません。比価が高いということは、比較対象とした期間と比べて、金が銀に対して割高であることを意味するだけです。どちらかの価格や比価が今後どう動くかを予測するものではありません。
関連記事
XAU/USDの意味:XAU・XAG・XPT・XPDが表すもの
XAU/USDの意味を解説します。金にISO 4217の通貨コードがある理由、XAG・XPT・XPDの意味、価格やAPIデータでの表示方向の読み方までわかります。
無料の金価格API:月100リクエストでできること
無料の金価格APIを正直に解説します。MetalAPIのFreeプランの内容、キャッシュとまとめ取得で月100リクエストを有効に使う方法、アップグレードの目安を紹介します。
Pythonで金価格APIを使う:価格の取得、キャッシュ、グラフ化
Pythonで金価格APIを使う方法を解説します。requestsでの最新価格の取得、エラー処理とリトライ、レスポンスのキャッシュ、pandasの時系列とmatplotlibによるグラフ化まで紹介します。