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 650,59−0,16 %ETH2 354,37−0,06 %
Все статьи
ЗолотоСереброРынкиИсторические данные

Соотношение золота и серебра: что это и как его рассчитать

Что измеряет соотношение золота и серебра, как рассчитать его по актуальным ценам и как построить график его истории через API на Python и JavaScript.

Автор: MetalAPI Team··11 мин чтения

Что такое соотношение золота и серебра?

Соотношение золота и серебра — это количество тройских унций серебра, которое нужно, чтобы купить одну тройскую унцию золота. Его получают, разделив цену золота на цену серебра — обе в одной валюте и за одну и ту же массу. С примерными ценами, которые используются во всей документации MetalAPI, — золото по 3 997,89 доллара США и серебро по 53,94 доллара США за тройскую унцию — соотношение составляет около 74,1: при этих ценах одна унция золота стоит примерно 74 унции серебра.

Поскольку обе цены выражены в одной валюте, валюта сокращается и у соотношения нет единицы измерения. Это делает его удобным способом напрямую сравнить два металла. Читается оно так:

  • Растущее соотношение означает, что золото подорожало относительно серебра: либо золото выросло сильнее серебра, либо упало меньше.
  • Снижающееся соотношение означает, что серебро подорожало относительно золота.
  • Само по себе соотношение ничего не говорит о направлении движения каждой из цен. Оба металла могут дешеветь, пока соотношение растёт, и оба могут дорожать, пока оно снижается.

В разделах ниже рассказано, как правильно рассчитать соотношение, почему базовая валюта не имеет значения и как отслеживать соотношение и строить его график с помощью REST API MetalAPI.

Это образовательная статья о том, как определяется и рассчитывается соотношение. Она не является финансовой или инвестиционной рекомендацией, а цены в ней — примерные значения из документации MetalAPI, а не рыночные данные.

Как рассчитать соотношение золота и серебра

Формула — одно деление:

Расчёт на примере
соотношение золото/серебро = цена золота ÷ цена серебра   (одна валюта, одна единица)

3 997,89 ÷ 53,94 ≈ 74,12

соотношение серебро/золото = 1 ÷ 74,12 ≈ 0,0135   (унций золота за унцию серебра)

Само деление тривиально; ошибки возникают во входных данных:

  • Одна единица для обоих металлов. Делите цену за унцию на цену за унцию или цену за грамм на цену за грамм. Цена золота за грамм, делённая на цену серебра за тройскую унцию, отличается от правильного результата в 31,1 раза — столько граммов в тройской унции (31,1034768).
  • Один момент времени. Берите обе цены из одного ответа или из цен закрытия одного дня. Деление актуальной цены золота на вчерашнюю цену закрытия серебра смешивает два разных состояния рынка.
  • Один вид цены. Делите среднюю цену на среднюю, цену закрытия — на цену закрытия. Если смешать цену продажи дилера для одного металла со спотовой ценой другого, в соотношение попадут спред и премия дилера.
  • Округляйте в конце. Делите неокруглённые цены и округляйте соотношение только для отображения — обычно до одного-двух знаков после запятой.

В ответе MetalAPI цены — это ключи с префиксом базовой валюты: USDXAU и USDXAG при базовой валюте по умолчанию USD. Простые ключи XAU и XAG — обратные величины (унции за доллар). Деление XAG на XAU даёт то же соотношение, но чтение ключей с префиксом избавляет от риска принять обратную величину за цену.

Почему базовая валюта не имеет значения

Золото и серебро обычно котируются в долларах США, но соотношение одинаково в любой валюте. При base=EUR MetalAPI выражает обе цены в евро, деля долларовые цены на долларовую цену одного евро, и этот общий множитель сокращается при делении:

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 — цена одной унции золота в серебре — и есть соотношение:

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

В этом ответе простой ключ XAU — обратная величина: унции золота за унцию серебра. Далее в статье соотношение рассчитывается по долларовым ценам, потому что обычно рядом с ним нужно показывать или сохранять обе цены.

Текущее соотношение золота и серебра через API

Один запрос /latest с currencies=XAU,XAG возвращает обе цены из одного снимка и засчитывается как один запрос. В 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, каждые 30 минут на Lite, каждые 10 минут на Standard, каждые 60 секунд на Advanced и Pro и вплоть до 5 секунд на Enterprise. С 17:00 пятницы до 17:00 воскресенья по нью-йоркскому времени спотовый рынок закрыт, и соотношение остаётся на уровне закрытия пятницы.

Соотношение из /latest рассчитано по средним ценам. Если вам нужен курс, по которому металл действительно можно обменять, используйте цены bid и ask. Они доступны на тарифе Standard и выше: добавьте XAU-BID, XAU-ASK, XAG-BID и XAG-ASK в currencies:

  • Продав одну унцию золота по цене bid, можно купить USDXAU-BID ÷ USDXAG-ASK унций серебра.
  • Чтобы купить одну унцию золота за серебро, понадобится USDXAU-ASK ÷ USDXAG-BID унций серебра.

Оба числа менее выгодны, чем среднее соотношение, на величину двух спредов, а сверху добавляются собственные премии дилера. Статья «Спот, bid, ask и спред» объясняет, как строятся эти котировки.

Как построить график истории соотношения золота и серебра

Для исторического графика нужны дневные цены закрытия обоих металлов. /timeframe (псевдоним /timeseries) возвращает их за диапазон дат одним запросом: до 30 дней на запрос на тарифе Free и до 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       # longest range per request: 365 on paid plans, 30 on Free
DAYS_BACK = 5 * 365  # on Free, keep this to a few months

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


def daily_closes(start: date, end: date) -> dict:
    """Daily closes of gold and silver from start to end (inclusive), keyed by date."""
    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)  # yesterday's close is final
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:  # skip days that lack either metal
        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 тот же ряд получается одним вызовом map по объекту rates из ответа /timeframe — например, полученного с помощью функции для диапазонов из руководства по историческим данным:

javascript
// rates = the "rates" object of /timeframe?currencies=XAU,XAG
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 года рассчитаны по фьючерсам ближайшего месяца, поэтому они могут немного отличаться от спотовых цен того же дня. Оба металла рассчитываются одинаково, но учитывайте это, сравнивая свой ряд с графиком соотношения из другого источника.

Как используют соотношение золота и серебра

Соотношение — относительная мера. Оно описывает, как золото и серебро двигались относительно друг друга, а не куда движется каждый из металлов. Типичные применения:

  • Относительная доходность. Соотношение в конце периода, делённое на соотношение в начале, равно коэффициенту роста золота, делённому на коэффициент роста серебра. Если соотношение выросло на 5%, золото за этот период подорожало на 5% относительно серебра, что бы ни происходило с ценами в абсолютном выражении.
  • Контекст на дашбордах и в отчётах. Трекеры цен, сайты дилеров и рассылки показывают соотношение рядом с двумя ценами; тот же запрос /latest даёт его без дополнительных затрат.
  • Сравнение с собственным прошлым. Некоторые сравнивают текущее соотношение с его средним значением, медианой или диапазоном за выбранный период, чтобы описать, высокое оно или низкое относительно этого периода. Скрипт выше выводит эти числа для любого загруженного диапазона.
  • Обмен одного металла на другой. Некоторые владельцы физического металла меняют золото на серебро или обратно, когда соотношение достигает заранее выбранного уровня. Останется ли у них в итоге больше металла, зависит от того, пойдёт ли соотношение потом в ожидаемую сторону, а это ничем не гарантировано; к тому же при каждом обмене приходится платить описанные выше спреды и премии дилера.
  • Другие соотношения. То же деление работает для любых двух цен в одной валюте: золото к платине (USDXAU ÷ USDXPT) или золото к нефти (USDXAU ÷ USDWTI, баррелей нефти за унцию золота). Для соотношений между разными классами активов оставляйте unit по умолчанию, потому что unit меняет цены металлов, но не цены энергоносителей.

Ни одно из этих применений не является прогнозом. У соотношения нет фиксированного «нормального» уровня, к которому оно обязано вернуться, а высокое или низкое значение само по себе не повод покупать или продавать какой-либо из металлов. Если вы принимаете инвестиционные решения, проконсультируйтесь с квалифицированным финансовым консультантом.

Отслеживайте соотношение золота и серебра в своём приложении

Создайте бесплатный аккаунт, чтобы получить ключ API. 100 запросов в месяц, ежедневные цены и диапазоны до 30 дней на тарифе Free достаточны для ежедневного соотношения и истории за несколько месяцев. Платные тарифы добавляют более свежие цены, диапазоны до 365 дней для длинной загрузки истории и цены bid/ask начиная со Standard; сравните их на странице тарифов. О ценах на серебро отдельно читайте в руководстве по API цен на серебро.

Частые вопросы

Что означает соотношение золота и серебра, равное 74?

Это значит, что при использованных ценах одна тройская унция золота стоит столько же, сколько примерно 74 тройские унции серебра. Соотношение описывает только относительную цену двух металлов. Оно не говорит, дорог или дёшев какой-либо из металлов в абсолютном смысле.

Одинаково ли соотношение золота и серебра в любой валюте и единице?

Да, если обе цены относятся к одному моменту и к одной и той же массе, потому что валюта и единица сокращаются при делении. MetalAPI получает все валюты и единицы из одного снимка, поэтому любые base и unit дают одно и то же соотношение, не считая крошечных различий из-за округления.

Как часто меняется соотношение золота и серебра?

Всякий раз, когда меняется любая из цен, то есть непрерывно, пока рынки открыты. Через API вы видите его с интервалом обновления вашего тарифа: от раза в день на Free до каждых 5 секунд на Enterprise. В выходные оно остаётся на уровне пятницы.

За какой период можно рассчитать соотношение?

Дневные цены закрытия золота и серебра доступны с 2000 года на любом тарифе. Один запрос /timeframe охватывает до 30 дней на Free и до 365 дней на платных тарифах, поэтому вся история требует около 27 запросов на платном тарифе. Цены до октября 2026 года рассчитаны по фьючерсам ближайшего месяца.

Высокое соотношение золота и серебра — сигнал покупать серебро?

Эта статья не даёт инвестиционных рекомендаций. Высокое соотношение означает лишь, что золото дорого относительно серебра по сравнению с тем периодом, с которым вы сравниваете. Оно не предсказывает, как дальше будут двигаться цены или само соотношение.

Попробуйте на своих данных

Создайте бесплатный аккаунт и отправьте первый запрос меньше чем за две минуты. 100 запросов в месяц, без банковской карты.

Читайте также