Loading...
Loading...
本ページでは、サイト上のすべての価格がどこから来るか、どのように比較可能な単位に正規化するか、どの数式でプレミアムを計算するか、データをどうキャッシュするか、上流ソースが障害になった場合に何が起きるか、そして結果として得られる数値の限界について、技術的に詳細に説明します。隠していることは何もありません — 数式とソースリストを読めれば、当サイトの出力を自分で再現できます。
当サイトでは可能な限り各取引所を直接読み取ります。単一のグローバル現物から「現地価格」を導出すると、プレミアムが機械的にゼロになり、サイトの存在意義が失われるためです。以下は実際に呼び出しているソースの一覧です。
パイプラインに到達するすべての価格は、保存とプレミアム計算の前にUSD/トロイオンス(USD/oz)に変換されます。これが唯一の標準単位であり、ダッシュボードとAPIは内部的にUSD/ozでのみ値を扱います。換算係数は固定定数です — 1トロイオンス = 31.1034768g、1kg = 1000g、1トラ = 11.6638g — `src/lib/calculations/`に定義され、外部ソースから更新されることはありません。
SGE Au9999が580 CNY/g、USD/CNY = 7.20の場合
(580 / 7.20) × 31.1034768 = 80.56 × 31.1034768 ≈ 2,506.40 USD/oz
MCX金が6,150 INR/g、USD/INR = 83.5の場合
(6,150 / 83.5) × 31.1034768 ≈ 73.65 × 31.1034768 ≈ 2,290.79 USD/oz
LBMA PMフィックス1,850 GBP/oz、USD/GBP = 0.79の場合
1,850 / 0.79 ≈ 2,341.77 USD/oz
SGE Ag(T+D)銀が7,800 CNY/kg、USD/CNY = 7.20の場合
7,800 ÷ 1000 = 7.80 CNY/g → (7.80 / 7.20) × 31.1034768 ≈ 1.0833 × 31.1034768 ≈ 33.70 USD/oz
USD以外の価格は、ExchangeRate-APIから取得し72時間キャッシュしたクロスレートで換算します(上のデータソース表を参照)。Metals.devのスポット取得とは別の上流呼び出しであり、両レスポンスはアトミックには取得されず、cron実行時に数分ずれる可能性があります。観測される誤差は小さいものの、ゼロではありません。ExchangeRate-APIが失敗しキャッシュ値もない場合、パイプラインはハードコードされたレートで代替せず、該当カードに「data unavailable」を表示します。
すべての価格がUSD/ozに正規化された後、市場`M`のプレミアムはUSDスポット基準価に対する単純な百分率差として計算されます:
正の値は現地市場がUSDスポット基準価より高いこと(プレミアム)を意味します。負の値はより安いこと(ディスカウント)を意味します。結果は常に小数第2位まで表示します。表示前に平滑化・平均化・ノイズ除去は行いません — 今日の7.34%プレミアムと明日の1.20%プレミアムはいずれもそのまま表示されます。トラッカーでボラティリティを隠すことは、その存在意義に反するためです。
パイプラインは2つの日次 Vercel cron ジョブで構成されています(vercel.json を参照)。UTC 00:00 に warm-cache ジョブが各上流フィードを1回ずつ呼び出し、ダッシュボードと市場別ページが使用する Vercel KV(Redis)キャッシュに最新値を書き込みます。15分後の UTC 00:15 には snapshot-history ジョブがそのキャッシュを読み取り、金銀比とランキングページのチャートを駆動する履歴データセットに日付・市場ごとの行を追加します。公開のユーザーリクエストはキャッシュに保存されたデータのみを読み込みます。要求された値がキャッシュにない場合、Metals.dev・GoldAPI・SGE・ExchangeRate-API を呼び出さず、一時的な「データなし」状態(HTTP 503)を返します。上流呼び出しは上記2つの定期 cron ジョブと、認証された管理エンドポイント(ADMIN_API_KEY で認証)からのみ実行されます。
| データタイプ | TTL |
|---|---|
| 現物価格(Metals.dev/GoldAPI) | 72 h |
| FXクロスレート | 72 h |
| SGE気配値 | 72 h (rejects sentinel values) |
| 過去スナップショットデータセット(日付・市場ごと) | Redisで90日TTL;同一日付の新しいスナップショットは既存値を置き換え |
72時間TTLは意図的な設定です。cronが1日1回実行されるため、週末・祝日・1回の失敗までカードが空にならないよう72時間の余裕を持たせています。上流フィードが妥当性チェックに失敗した場合、パイプラインは既存のキャッシュ値を再書き込みします。元の取得時刻はそのまま保持されるため値が新鮮であるかのように表示されることはありませんが、Redis TTL自体は延長され、カードが消失することはありません。元のタイムスタンプが約1日以上前のカードには、UIに「古い」バッジが付きます。
各価格フィードは、(a) 上流呼び出しの成功、(b) レスポンスに期待するフィールドが存在すること、(c) 値が正の数であることを確認するリゾルバーを通過します。SGEはさらに、非取引日にエンドポイントが返す既知のセンチネル値 -2.0 を拒否します。これらのフィールド単位のチェック以外に、ランタイムのJSONスキーマ検証層はありません。いずれかのチェックが失敗するとリゾルバーはnullを返し、上位レイヤーは次の順序でフォールバックを試みます。
基本ルール: いずれの値も新鮮であるかのように静かに再ブランド化されることはありません。ベンチマークと為替から算出した値(市場フィードから直接取得したものではない値)は、最初から "derived" ソースフラグ付きで保存され、UIもその通りに表示します。約1日以上更新されていないカードには、元の読み取りタイムスタンプとともに「古い」バッジが付きます。
USDスポット基準価、MCX関連フィールド、SGEフィード、LBMA関連フィールドは、同じ営業日や同じ時刻に更新されるとは限りません。週末や休場日には、直近値やセンチネル値が返る場合があります。本サイトは元の時刻を保持し、古い状態を表示して、リアルタイム値として扱いません。
Ag(T+D)はCNY/kg、Au9999はCNY/gで建値されます。当サイトではUSD/oz変換前に銀を1000で割ります。この除数に過去のバグがあれば銀プレミアムが1000倍に膨らんでいたはずで、再発防止のために明示的に記録しています。
当サイトが公開するプレミアムは卸売・税前の比較値です。各国の税金は表示プレミアムには加算されません。代表例: インドの金の優遇輸入税(2024年7月連邦予算以降のCBIC公示ベースで基本関税5% + AIDC 1% = 6%、3% GSTは小売段階で別途課税、実際の税負担は金の形態・輸入主体・課税標準により変わるためCBIC最新税率表で要確認)、英国の銀に対する20%付加価値税、中国の非SGE金に対する13%付加価値税など。小売価格を推論したい読者は、税金比較ページと合わせて現地の税務当局で最新税率をご確認ください。
フィード、換算係数、上記の数式への変更はすべて方法論の変更として扱います。変更がリリースされる際、本ページと下記の変更ログは同じリリースで一緒に更新されます。過去スナップショットは日付・市場ごとにRedisに90日TTLで保存され、既存の日付に対して日次cronが新しいスナップショットを書き込むと、既存値は置き換えられます。チャート解釈に影響する長期的な訂正や転換点は、個々のデータポイントに注釈を付けるのではなく、下記の変更ログ項目としてまとめて記録します。
方法論は正確に保たれてこそ価値があります。フィードの形状が変わった、税率が古い、限月がロールした、翻訳が不自然である等のことがあれば、お問い合わせページからご連絡ください。すべての訂正に返信いたします。