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-денний прогноз нетто-потреби по валютах (depozity−vyvody−nalogi−ORYeKh).
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. Завжди фіксуйте , , .
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 і робите грошові потоки передбачуваними.