GH GambleHub

FX: конвертация и курсовые риски

1) Зачем управлять FX в iGaming

Точная P&L-отчетность: где возникает FX-прибыль/убыток (депозиты, выводы, сеттлмент PSP, резервы).
Справедливый ND/GRR/NGR: единая reporting currency без «переоценок задним числом».
Ликвидность и кэш-флоу: funding в валюте A, выплаты в B — нужен прогноз и хедж.
Комплаенс/налоги: прозрачное происхождение курсов и аудит следов.

2) Ключевые точки, где рождается FX

1. Игровой кошелек vs валюта депозита: нормализация в валюте кошелька/репортинга.
2. Capture/settle у PSP: фиксируется «исторический» курс для ND.
3. Funding (зачисление на банк): возможен иной курс/валюта и вторичный FX-эффект.
4. Withdrawals: конвертация при выплате игроку.
5. Роллинг-резерв и штрафы схем: списания/релизы могут быть в другой валюте.
6. Крипто: оценка по VWAP/медиане на момент settle/funding.

3) Источники курсов и правила нормализации

FX source: приоритетно провайдеры-референсы (например, CME/Refinitiv/ECB), резервно — банк/PSP.
Quote policy: `mid`, `bid/ask` или `mid ± spread_bps`. Для учета чаще применяют mid + явный `spread_bps`.
Timestamp: курс на момент события признания (обычно `settled_at` для ND; опционально `funded_at` для банк-учета).
No restatement: прошлые ND не переоцениваются при изменении курсов; reval делается отдельно как unrealized FX.
Точность: хранить 8–10 знаков в FX-курсе, денежные суммы — в minor units (integers) + scale.

4) Формулы и примеры

4.1. Базовая конвертация

Пусть `amount_original` в `ccy_orig`, отчетная валюта `ccy_rep`, курс `fx(ccy_orig→ccy_rep)`:

amount_reporting = round(amount_original fx, scale_ccy_rep)

4.2. Кросс-курс (через валюту-якорь, например EUR)


fx(GBP→UAH) = fx(GBP→EUR) fx(EUR→UAH)

Важно хранить маршрут курсов (triangulation) в `meta` для аудита.

4.3. Разделение спреда и комиссии PSP

Если PSP конвертировал сам:

fx_effective = settlement_amount_in_rep / original_amount spread_bps  = (fx_effective / fx_reference - 1) 10_000 fee_fx    = settlement_fee_in_rep (если отдельно)

Храните effective FX и reference FX для измерения implicit-маржи PSP.

4.4. Пример (цепочка с двойной конвертацией)

Игрок депонирует 100 GBP. Reporting — EUR.
На `settled_at`: `GBP→EUR = 1.1700` → `ND_dep = 117.00 EUR`.
PSP финансирует банк в USD завтра: `GBP→USD = 1.3000`, банк держит счет в USD.
Для FI-учета фиксируйте и вторичный курс `USD→EUR` на `funded_at` (например, 0.9200), чтобы увидеть realized FX между settle и funding, если денежная позиция переоценена.

5) DCC, PSP-конвертация и «кто решает курс»

DCC (Dynamic Currency Conversion) на стороне мерчанта/PSP: курс показывается игроку заранее, но маржа выше.
PSP-conversion: PSP принимает валюту игрока, конвертирует в валюту мерчанта по своему курсу. Прозрачность спреда критична.
Merchant-conversion: мерчант принимает мультивалютно (multi-MID/мультисчета), конвертацию выполняет банк/трежери по лучшему курсу (обычно выгоднее, но сложнее операционно).
Рекомендация: фиксируйте conversion_owner (`DCC`, `PSP`, `MERCHANT`) и сравнивайте TCO (спред+fee).

6) Крипто: оценка и волатильность

Оценка по VWAP за короткое окно вокруг `settled_at` (например, ±5 минут), с указанием источника (биржа/провайдер).
Храните: `price_usd`, `price_eur`, `source`, `window`, `pair` (например, `USDT/USDC/BTC`).
Для funding в стейблах/фиате — второй слой FX.
Специфика: спайки, делистинги, on-chain fees — учитывайте в `meta` и алертах.

7) Учет FX в отчетности: realized vs unrealized

Realized FX — разница, «закрытая» денежным потоком (между курсом признания и курсом фактического обмена/поступления).
Unrealized FX — переоценка остатков на мультивалютных счетах/резерве на конец дня/месяца.
Разносите по разным GL-счетам: `FX_realized`, `FX_unrealized`.
Для ND/продуктовой аналитики используйте исторический курс события (не переоценивайте).

8) Типы FX-экспозиции и как их закрывать

Transaction exposure: несовпадение валют входа/выхода (депозит EUR → вывод TRY).

Меры: natural hedge (подбирать валютность выплат), скорый конверт по правилам.
Translation exposure: мультисчета и резервы в разных валютах → EoD/EoM reval.
Economic exposure: долгосрочная зависимость маржи от курса (GEO-миксы, поставщики игр).

Меры: forwards/NDF, options (collars), балансирование GEO и поставщиков.

9) Трежери-процессы и политики

FX policy: лимиты на открытую позицию по каждой валюте (например, не более 20% недельного оборота).
Execution rules: минимальный объем сделки, праговые спреды, список контрагентов.
Forecasting: 7/30/90-дневный прогноз нетто-потребности по валютам (депозиты−выводы−налоги−OPEX).
Hedge accounting (при необходимости): документирование отношений «хедж-позиция ↔ риск».
Календарь праздников: влияет на funding/роллинг-резерв и «закрытие» FX.

10) Данные и модель (упрощенно)


payments. transactions (
id, user_id, provider, method, type, status,
amount_original, currency_original, -- event amount and currency amount_wallet, wallet_currency, -- domestic gaming currency (if different)
reporting_currency, amount_reporting, - the sum in reporting currency of fx_source, fx_pair, fx_timestamp, fx_rate, - a course at the time of the event (usually settled_at)
fx_quote_type, fx_spread_bps, fx_reference_rate -- measurement of spread/quotation type settled_at, funded_at, conversion_owner, meta
)

treasury. funding_receipts (
funding_id, provider, bank_account, currency, amount,
received_at, value_date, fx_to_reporting, amount_reporting, meta
)

treasury. fx_reval_ledger (
id, date, currency, position_amount, rate_eod, amount_reporting_eod,
prev_rate_eod, reval_diff, type -- UNREALIZED/REALIZED
)

11) Сверка и контроль качества

11.1. Согласование «наших» курсов с PSP/банком

Сопоставляйте `fx_effective` (из settlement) с `fx_reference` (из вашего справочника).
Алерт, если `|spread_bps| > threshold` (например, >80 bps для мажоров).

11.2. Качество источника курсов

Stale-rates: если `now - fx_timestamp > X минут` при приходе события — алерт и аварийный источник.
Нестыковки triangulation: `fx(A→B)fx(B→C)` vs `fx(A→C)` — алерт, логируйте расхождение в bps.

12) Примеры SQL-шаблонов

12.1. Нормализация транзакций в отчетную валюту

sql
INSERT INTO dw. transactions_flat (...)
SELECT t. id, t. user_id, t. provider, t. method, t. type, t. status,
t. amount_original, t. currency_original,
t. reporting_currency,
ROUND(t. amount_original r. fx_rate, c. scale) AS amount_reporting,
r. source AS fx_source, r. pair AS fx_pair, r. fx_rate,
r. quote_type AS fx_quote_type, r. spread_bps,
t. settled_at, t. funded_at, t. conversion_owner, t. meta
FROM raw. transactions t
JOIN ref. fx_rates r
ON r. pair = CONCAT(t. currency_original, '/', t. reporting_currency)
AND r. ts = (SELECT MAX(ts) FROM ref. fx_rates
WHERE pair=r. pair AND ts <= t. settled_at)
JOIN ref. currencies c ON c. code = t. reporting_currency
WHERE t. settled_at BETWEEN:from AND:to;

12.2. Разложение FX-эффекта PSP (effective vs reference)

sql
SELECT provider, method, DATE(settled_at) AS d,
SUM(amount_reporting)                  AS amount_rep_ref,
SUM(settlement_amount_in_rep)              AS amount_rep_eff,
(SUM(settlement_amount_in_rep) - SUM(amount_reporting)) AS fx_slippage,
10000 (SUM(settlement_amount_in_rep) / NULLIF(SUM(original_amountfx_reference_rate),0) - 1) AS spread_bps
FROM dw. fx_settlement_view
WHERE settled_at BETWEEN:from AND:to
GROUP BY 1,2,3
ORDER BY d;

12.3. Ежедневная переоценка мультивалютных остатков (unrealized FX)

sql
INSERT INTO treasury. fx_reval_ledger (date, currency, position_amount, rate_eod, amount_reporting_eod, prev_rate_eod, reval_diff, type)
SELECT
:eod_date AS date,
bal. currency,
bal. amount AS position_amount,
r_eod. fx_rate AS rate_eod,
bal. amount r_eod. fx_rate AS amount_reporting_eod,
COALESCE(l. prev_rate_eod, r_eod. fx_rate) AS prev_rate_eod,
bal. amount (r_eod. fx_rate - COALESCE(l. prev_rate_eod, r_eod. fx_rate)) AS reval_diff,
'UNREALIZED'::text
FROM treasury. balances bal
JOIN ref. fx_rates_eod r_eod
ON r_eod. pair = CONCAT(bal. currency, '/',:rep_ccy) AND r_eod. date =:eod_date
LEFT JOIN LATERAL (
SELECT rate_eod AS prev_rate_eod
FROM treasury. fx_reval_ledger
WHERE currency = bal. currency AND date =:eod_date - INTERVAL '1 day'
ORDER BY date DESC LIMIT 1
) l ON TRUE;

13) KPI и дашборды

FX Slippage (bps): разница effective vs reference по PSP/методу/MID.
Realized FX P&L (день/неделя/месяц) и Unrealized FX (EoD/EoM).
Open FX Position по валютам vs лимиты политики.
Hedge Ratio: доля покрытой позиции (forwards/NDF/options).
Stale-rate Incidents и Triangulation Mismatch.
Spread % of Volume (сколько стоил FX относительно processed volume).

14) Алерты и пороги

Stale rates: нет актуального курса > N минут в пике трафика — P1.
Spread spike: `spread_bps` выше порога для мажоров/миноров — P2.
Open position breach: превышение лимита по любой валюте — P1.
FX P&L shock: дневной realized FX ниже −Xσ исторического — расследование.
Crypto price gap: скачок >Y% от VWAP окна — переключение источника/пауза конверта.

15) Best practices (коротко)

1. Признавайте ND и продуктовые метрики по settled-курсу, без ретроспективной переоценки.
2. Для FI/трежери храните второй курс на funded_at — увидите realized FX.
3. Всегда фиксируйте conversion_owner, fx_source, quote_type, spread_bps.
4. Делайте triangulation через якорь (EUR/USD) с логированием.
5. Разделяйте realized и unrealized на уровне GL.
6. В крипто — используйте VWAP-окно, а не один тик.
7. Автоматизируйте алерты на stale rates и аномальный спред PSP.
8. Прогнозируйте нетто-потребность по валютам и используйте natural hedge + форварды/NDF.

16) Чек-лист внедрения

  • Справочник курсов `ref.fx_rates` с EOD и intraday, хранение источника и quote type.
  • Витрины `transactions_flat`, `fx_settlement_view`, `funding_receipts`.
  • Механика triangulation и журнал маршрута курсов.
  • Двууровневый учет FX (ND/продукт vs FI/трежери).
  • Ежедневная reval мультивалютных остатков.
  • Дашборды KPI (slippage, open position, FX P&L).
  • Политика FX: лимиты позиций, white-list контрагентов, пороги алертов.
  • Процедура hedging (forwards/NDF/options) и документооборот.

Резюме

FX в iGaming — это не только «курс умножить на сумму». Это целая система: четкие точки признания, прозрачные источники курсов, разделенный учет realized/unrealized, контроль спреда PSP и управляемая открытая позиция. Внедрив стандартный справочник FX, нормализацию «по settle», reval-процедуры и понятную FX-политику с хедж-инструментами, вы снимаете волатильность из P&L и делаете денежные потоки предсказуемыми.

Contact

Свяжитесь с нами

Обращайтесь по любым вопросам или за поддержкой.Мы всегда готовы помочь!

Telegram
@Gamble_GC
Начать интеграцию

Email — обязателен. Telegram или WhatsApp — по желанию.

Ваше имя необязательно
Email необязательно
Тема необязательно
Сообщение необязательно
Telegram необязательно
@
Если укажете Telegram — мы ответим и там, в дополнение к Email.
WhatsApp необязательно
Формат: +код страны и номер (например, +380XXXXXXXXX).

Нажимая кнопку, вы соглашаетесь на обработку данных.