Relación oro/plata: qué es y cómo calcularla
Qué mide la relación oro/plata, cómo calcularla con precios actuales del oro y la plata y cómo representar su historial con una API en Python y JavaScript.
¿Qué es la relación oro/plata?
La relación oro/plata es el número de onzas troy de plata que hacen falta para comprar una onza troy de oro. Se obtiene dividiendo el precio del oro entre el precio de la plata, ambos en la misma divisa y para el mismo peso. Con los precios de ejemplo que se usan en toda la documentación de MetalAPI, el oro a 3997,89 dólares estadounidenses y la plata a 53,94 dólares estadounidenses por onza troy, la relación es de aproximadamente 74,1: a esos precios, una onza de oro vale unas 74 onzas de plata.
Como ambos precios están en la misma divisa, la divisa se anula y la relación no tiene unidad, lo que la convierte en una forma compacta de comparar directamente los dos metales. Se lee así:
- Una relación al alza significa que el oro se ha revalorizado frente a la plata: o bien el oro subió más que la plata, o bien bajó menos.
- Una relación a la baja significa que la plata se ha revalorizado frente al oro.
- La relación no dice nada por sí sola sobre la dirección de ninguno de los dos precios. Ambos metales pueden bajar mientras la relación sube, y ambos pueden subir mientras baja.
Las secciones siguientes explican cómo calcular correctamente la relación, por qué la divisa base no importa y cómo seguirla y representarla en gráficos con la API REST de MetalAPI.
Este es un artículo divulgativo sobre cómo se define y se calcula la relación. No es asesoramiento financiero ni de inversión, y los precios que contiene son valores de ejemplo de la documentación de MetalAPI, no datos de mercado.
Cómo calcular la relación oro/plata
La fórmula es una sola división:
relación oro/plata = precio del oro ÷ precio de la plata (misma divisa, misma unidad)
3997,89 ÷ 53,94 ≈ 74,12
relación plata/oro = 1 ÷ 74,12 ≈ 0,0135 (onzas de oro por onza de plata)La división es trivial; los errores aparecen en los datos de entrada:
- La misma unidad para ambos metales. Divide un precio por onza entre un precio por onza, o por gramo entre por gramo. El oro por gramo dividido entre la plata por onza troy se desvía en un factor de 31,1, el número de gramos de una onza troy (31,1034768).
- El mismo momento. Toma ambos precios de la misma respuesta o del cierre del mismo día. Dividir un precio del oro en tiempo real entre el cierre de la plata de ayer mezcla dos estados distintos del mercado.
- El mismo tipo de precio. Divide un precio medio entre un precio medio, o un cierre entre un cierre. Mezclar el precio de venta de un distribuidor para un metal con el precio al contado del otro añade a la relación el spread y la prima del distribuidor.
- Redondea al final. Divide los precios sin redondear y redondea la relación solo para mostrarla, normalmente a uno o dos decimales.
En una respuesta de MetalAPI, los precios son las claves con el prefijo de la divisa base: USDXAU y USDXAG con la base predeterminada USD. Las claves simples XAU y XAG son inversas (onzas por dólar). Dividir XAG entre XAU da la misma relación, pero leer las claves con prefijo evita tratar una inversa como un precio.
Por qué la divisa base no importa
El oro y la plata suelen cotizarse en dólares estadounidenses, pero la relación es la misma en cualquier divisa. Con base=EUR, MetalAPI expresa ambos precios en euros dividiendo los precios en dólares entre el precio en dólares de un euro, y ese factor común se anula en la división:
EURXAU = USDXAU ÷ USDEUR
EURXAG = USDXAG ÷ USDEUR
EURXAU ÷ EURXAG = USDXAU ÷ USDXAGMetalAPI calcula todas las cotizaciones cruzadas a partir de una misma instantánea, así que base=EUR, base=INR o base=JPY dan la misma relación que el dólar, salvo por el redondeo en la última de las diez cifras significativas. Lo mismo ocurre con unit: con unit=gram, los precios de ambos metales se dividen entre 31,1034768 y la relación no cambia.
La divisa sí importa cuando los dos precios proceden de fuentes o momentos distintos, como un precio del oro en una divisa y un precio de la plata tomado horas después en otra: entonces el tipo de cambio no se anula exactamente. Tomar ambos precios de una misma respuesta lo evita.
También puedes dejar que la API haga la división. base acepta cualquier símbolo admitido, incluidos los metales. Con base=XAG, todos los precios se expresan en onzas troy de plata, así que XAGXAU, el precio de una onza de oro en plata, es la propia relación:
curl "https://metalapi.com/api/v1/latest?base=XAG¤cies=XAU" \
-H "X-API-Key: $METALAPI_KEY"En esa respuesta, la clave simple XAU es la inversa: onzas de oro por onza de plata. El resto de este artículo calcula la relación a partir de los precios en dólares, porque normalmente querrás mostrar o guardar los dos precios junto a ella.
Obtén la relación oro/plata actual desde la API
Una sola solicitud a /latest con currencies=XAU,XAG devuelve ambos precios de la misma instantánea y cuenta como una única solicitud. En Node.js 18 o posterior, guárdalo como ratio.mjs y ejecuta 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})`);Con los precios de ejemplo, la última línea muestra una relación de 74,12. La frescura de los datos depende del intervalo de actualización de tu plan: diaria en Free, cada 30 minutos en Lite, cada 10 minutos en Standard, cada 60 segundos en Advanced y Pro, y hasta cada 5 segundos en Enterprise. Desde el viernes a las 17:00 hasta el domingo a las 17:00, hora de Nueva York, el mercado al contado está cerrado y la relación se mantiene en el cierre del viernes.
La relación de /latest es una relación de precios medios. Si quieres la tasa a la que realmente se puede intercambiar el metal, usa los precios bid y ask, disponibles en el plan Standard y superiores añadiendo XAU-BID, XAU-ASK, XAG-BID y XAG-ASK a currencies:
- Vender una onza de oro al bid permite comprar
USDXAU-BID ÷ USDXAG-ASKonzas de plata. - Comprar una onza de oro con plata requiere
USDXAU-ASK ÷ USDXAG-BIDonzas de plata.
Ambas cifras son menos favorables que la relación media en la medida de los dos spreads, y a eso se suman las primas propias del distribuidor. Spot, bid, ask y spread explica cómo se construyen esas cotizaciones.
Cómo representar en un gráfico el historial de la relación oro/plata
Para un gráfico histórico necesitas los cierres diarios de ambos metales. /timeframe (alias /timeseries) los devuelve para un rango de fechas en una sola solicitud: hasta 30 días por solicitud en el plan Free y 365 días en los planes de pago. El historial diario de los metales empieza en 2000 y todos los planes pueden consultarlo entero; los planes solo se diferencian en cuántos días puede abarcar una solicitud.
Este script de Python descarga los últimos cinco años en bloques de 365 días (cinco solicitudes), calcula la relación para cada día que tenga ambos precios, escribe un archivo CSV, muestra algunas estadísticas y guarda un gráfico con una media móvil de 50 días. En el plan Free, establece MAX_DAYS = 30 y DAYS_BACK = 90, lo que requiere tres solicitudes.
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 # rango más largo por solicitud: 365 en los planes de pago, 30 en Free
DAYS_BACK = 5 * 365 # en Free, limítalo a unos pocos meses
session = requests.Session()
session.headers["X-API-Key"] = os.environ["METALAPI_KEY"]
def daily_closes(start: date, end: date) -> dict:
"""Cierres diarios del oro y la plata de start a end (ambos incluidos), indexados por fecha."""
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) # el cierre de ayer es definitivo
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: # omite los días a los que les falte alguno de los metales
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)Algunos detalles son intencionados:
- Recorre las fechas devueltas, no el calendario.
/timeframeomite los fines de semana y los festivos del mercado. - Termina en la fecha UTC de ayer. La barra de hoy todavía se está moviendo, y un
end_datefuturo devuelve el error205. - Guarda ambos precios junto a la relación, para que puedas comprobar cualquier fila sin volver a descargar los datos.
- Las estadísticas describen solo el periodo que has descargado. Si cambias
DAYS_BACK, cambian con él.
La misma serie en JavaScript es un solo map sobre el objeto rates de una respuesta de /timeframe, obtenida por ejemplo con la función auxiliar de rangos de la guía de datos históricos:
// rates = el objeto "rates" de /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 }));Los precios de cierre de los días pasados no cambian, así que descarga un rango una vez y complétalo con una solicitud corta para los últimos días. Para una carga completa hasta 2000 (unas 27 solicitudes en un plan de pago), un archivo SQLite y un gráfico de matplotlib del oro con la relación, consulta Precios históricos del oro y la plata por API.
Los precios de los metales anteriores a octubre de 2026 proceden de los futuros del mes más próximo, así que pueden diferir ligeramente de los precios al contado del mismo día. Ambos metales se obtienen de la misma forma, pero tenlo en cuenta cuando compares tu serie con un gráfico de la relación de otra fuente.
Cómo se usa la relación oro/plata
La relación es una medida relativa. Describe cómo se han movido el oro y la plata uno frente al otro, no hacia dónde va ninguno de los dos. Usos habituales:
- Rendimiento relativo. La relación al final de un periodo dividida entre la relación al inicio es igual al factor de crecimiento del oro dividido entre el de la plata. Una relación que subió un 5 % significa que el oro ganó un 5 % frente a la plata en ese periodo, independientemente de lo que hicieran los dos precios en términos absolutos.
- Contexto en paneles e informes. Los seguidores de precios, los sitios de distribuidores y los boletines muestran la relación junto a los dos precios; la misma solicitud a
/latestla proporciona sin coste adicional. - Comparación con su propio pasado. Algunas personas comparan la relación actual con su media, su mediana o su rango en un periodo que eligen, para describir si es alta o baja respecto a ese periodo. El script anterior muestra esas cifras para cualquier rango que descargues.
- Intercambio entre metales. Algunos tenedores de metal físico cambian oro por plata, o al revés, cuando la relación alcanza un nivel que eligieron de antemano. Que eso les deje con más metal depende de que la relación se mueva después como esperaban, algo que nada garantiza, y cada intercambio paga los spreads y las primas de los distribuidores descritos más arriba.
- Otras relaciones. La misma división sirve para dos precios cualesquiera en una misma divisa: oro frente a platino (
USDXAU ÷ USDXPT) u oro frente a petróleo (USDXAU ÷ USDWTI, barriles de petróleo por onza de oro). Para relaciones entre clases de activos distintas, dejauniten su valor predeterminado, porqueunitcambia los precios de los metales pero no los de la energía.
Ninguno de estos usos es una previsión. La relación no tiene un nivel normal fijo al que deba volver, y una lectura alta o baja no es, por sí sola, un motivo para comprar o vender ninguno de los dos metales. Si vas a tomar decisiones de inversión, consulta a un asesor financiero cualificado.
Sigue la relación oro/plata en tu aplicación
Crea una cuenta gratuita para obtener una clave API. Las 100 solicitudes al mes del plan Free, los precios diarios y los rangos de 30 días bastan para una relación diaria y unos pocos meses de historial. Los planes de pago añaden precios más recientes, rangos de 365 días para cargas largas y precios bid/ask desde Standard; compáralos en la página de precios. Para los precios de la plata por sí solos, consulta la guía de la API de precios de la plata.
Preguntas frecuentes
¿Qué significa una relación oro/plata de 74?
Significa que una onza troy de oro cuesta lo mismo que unas 74 onzas troy de plata a los precios utilizados. Solo describe el precio relativo de los dos metales. No te dice si alguno de ellos es caro o barato en términos absolutos.
¿La relación oro/plata es la misma en cualquier divisa y unidad?
Sí, siempre que ambos precios sean del mismo momento y para el mismo peso, porque la divisa y la unidad se anulan en la división. MetalAPI obtiene todas las divisas y unidades de una misma instantánea, así que cualquier base y unit dan la misma relación, salvo diferencias mínimas de redondeo.
¿Con qué frecuencia cambia la relación oro/plata?
Cada vez que se mueve cualquiera de los dos precios, es decir, de forma continua mientras los mercados están abiertos. A través de la API la ves con el intervalo de actualización de tu plan, desde una vez al día en Free hasta cada 5 segundos en Enterprise. Durante el fin de semana se mantiene en el valor del viernes.
¿Desde cuándo puedo calcular la relación?
Los cierres diarios del oro y la plata se remontan a 2000 en todos los planes. Una sola solicitud a /timeframe cubre hasta 30 días en Free y 365 días en los planes de pago, así que el historial completo requiere unas 27 solicitudes en un plan de pago. Los precios anteriores a octubre de 2026 proceden de los futuros del mes más próximo.
¿Una relación oro/plata alta es una señal para comprar plata?
Este artículo no ofrece asesoramiento de inversión. Una relación alta solo significa que el oro está caro en relación con la plata, comparado con el periodo que tomes como referencia. No predice cómo se moverán a continuación ninguno de los dos precios ni la relación.
Pruébalo con tus propios datos
Crea una cuenta gratuita y haz tu primera solicitud en menos de dos minutos. 100 solicitudes al mes, sin tarjeta de crédito.
Sigue leyendo
Qué significa XAU/USD: los códigos XAU, XAG, XPT y XPD
Qué significa XAU/USD: por qué el oro tiene un código de divisa ISO 4217, qué son XAG, XPT y XPD y cómo leer el sentido de las cotizaciones y datos de API.
API gratuita de precios del oro: qué dan 100 solicitudes al mes
Una API gratuita de precios del oro explicada con honestidad: qué incluye el plan Free de MetalAPI, cómo aprovechar 100 solicitudes al mes y cuándo cambiar.
API de precios del oro en Python: consulta, caché y gráficos
Usa una API de precios del oro en Python: obtén precios en tiempo real con requests, gestiona errores y reintentos, usa caché y grafica una serie con pandas.