Wielokulturowe książki i kursy
1) Co to są „książki wielokrotności”
Ledger - podwójna księga transakcji (dwukierunkowe posty) utrzymywana w kilku walutach w tym samym czasie:- Portfel-book: konto gracza (waluta/waluty gry).
- Księga rozliczeniowa: rozliczenia z PSP/nabywcą (waluta rozliczeniowa).
- Księga skarbowa: konta bankowe, konwersje, transakcje hedgingowe.
- Rejestr sprawozdawczy: podsumowanie w walucie sprawozdawczej (na przykład w EUR) bez retrospektywnej aktualizacji wyceny wskaźników produktu.
Każda księga rejestruje walutę transakcji, walutę prezentacji i kurs w momencie ujęcia.
2) Hierarchia walut i polityk
1. Waluta bazowa/sprawozdawcza - wspólna waluta sprawozdawcza (na przykład EUR).
2. Waluty portfelowe - waluty portfelowe (USD/EUR/TRY/UAH itp.).
3. Waluty rozliczeniowe - to, co PSP wysyła (na przykład USD).
4. Waluty bankowe - waluta rachunku handlowca/skarbu.
- Metryka produktu (ND/NGR/ARPPU) - w historycznym tempie zdarzenia (zwykle „settled _ at”).
- Finanse/skarby - dodatkowo ustawić kurs na 'funded _ at' i 'payout _ at'.
- „Ukryta” rewaluacja w wyświetlaczach żywności jest zabroniona.
3) Kursy i ich źródła
Odniesienie do dnia bieżącego (kleszcz/minuta): Refinitiv/EBC/banki - w celu normalizacji zdarzeń.
EOD (koniec dnia): dla niezrealizowanego FX.
Efektywny FX: z pliku PSP/bank (rzeczywista konwersja).
Triangulacja: poprzez kotwicę (EUR lub USD) w przypadku braku bezpośredniego notowania.
Polityka wyceny: "mid" лива "bid/ask" → "mid ± spread_bps'. Rozprzestrzenianie jest przechowywane oddzielnie.
Przechowywać: 'fx _ source', 'fx _ pair', 'fx _ rate', 'fx _ timestamp', 'quote _ type', 'spread _ bps' i trasę triangulacji.
4) Punkty rozpoznawania i warstwy kursu
'authorize _ at' - nie ustalamy kursu (nie ma uznania bez przechwytywania).
„aptured/settled _ at” - historyczny kurs dla warstwy produktu i ND.
„funded _ at” - kurs wymiany na bank (zrealizowany FX dla FI/skarbu państwa).
„payout _ at” - stawka wypłacana graczowi.
„eod” to wskaźnik na koniec dnia dla niezrealizowanej FX.
5) Precyzja, zaokrąglanie, minimalne jednostki
Pieniądze - całe jednostki drobne (int) + „skala” w katalogu walutowym.
Kursy - co najmniej 8-10 miejsc po przecinku.
Zaokrąglanie: bank (w połowie równy) do celów sprawozdawczych; w UI - lokalne zasady.
Zachowaj odrębne pola: 'amount _ original', 'amount _ wallet', 'amount _ reporting', 'amount _ effective'.
6) Podwójne wejście i karta GL (uproszczona)
Przykłady delegowania:6. 1. DEPOSIT_CAPTURED (GBP, sprawozdawczość - EUR)
JT: AR: PSP (GBP)
Ct: Saldo gracza (GBP/EUR w portfelu)
Równolegle należy ustalić „fx _ rate _ settle (GBP → EUR)” oraz „amount _ reporting”.
6. 2. FUNDING_RECEIVED (USD za bank)
Dt: Bank USD
Ct: AR: PSP GBP (blisko równoważnego; różnica → Zrealizowany FX).
6. 3. WITHDRAWAL_PAID (SPRÓBUJ)
Да: Odpowiedzialność: Gracz (TRY)
Ct: Bank TRY (lub Bank EUR + konwersja; różnica - zrealizowany FX).
7) Architektura danych (model minimalny)
ref. currencies (
code PK, scale, symbol, is_crypto, is_active
)
ref. fx_rates_intraday (
pair PK, ts PK, rate, quote_type, source, spread_bps, triangulation_meta
)
ref. fx_rates_eod (
pair PK, date PK, rate, source
)
ledger. entries (
entry_id PK, book, -- WALLET SETTLEMENT TREASURY REPORTING debit_account, credit_account,
amount_original, currency_original,
amount_reporting, reporting_currency,
fx_rate_at_settle, fx_source, fx_pair, fx_timestamp,
event_type, event_id, user_id, provider, method,
occurred_at, created_at, meta
)
treasury. funding_receipts (
funding_id PK, provider, bank_account,
currency, amount, fx_to_reporting, amount_reporting,
received_at, value_date, meta
)
treasury. balances (
date PK, account PK, currency PK, amount
)
dw. transactions_flat (
tx_id PK, user_id, provider, method, type, status,
amount_original, currency_original,
amount_reporting, reporting_currency, fx_rate_at_settle,
settled_at, funded_at, conversion_owner, meta
)
8) Przepływ normalizacji (ETL/ELT)
1. Surowiec spożycie → normalizacja stanu PSP.
2. Przypisanie stopy historycznej do 'settled _ at' z 'fx _ rates _ intraday'.
3. Zapisz podwójną transakcję do żądanej księgi (portfel/rozliczenie).
4. Oddzielne finansowanie importu i skuteczne FX.
5. Dzienna korekta sald przez 'fx _ rates _ eod' (treasury-book).
6. Budowa okien sklepowych (ND/NGR/LTV) bez ponownej oceny retro.
9) Pojednanie i spójność
Tx → Plik: wszystkie przechwytywane/rozliczane były w pliku PSP (według kwot/walut/dat).
Plik → Tx: wszystko w pliku znajduje odzwierciedlenie w książkach/transakcjach.
FX Reference vs Effective: count 'slippage _ bps'; Uwaga, aby przekroczyć próg.
Sprawdzenie triangulacji: 'A → B B → C' 'A → C' w granicach tolerancji bps.
Idempotencja: 'event _ id' i' idempotence _ key '- ochrona przed duplikatami.
10) Częste scenariusze i sposób ich prowadzenia
Multi-portfel: portfel gracza może być w innej walucie niż depozyt - dokonać wewnętrznej konwersji po kursie ('conversion _ owner =' MERCHANT 'policy).
PSP-conversion: store 'fx _ effective', 'fx _ reference' i 'spread _ bps' do analizy marginesu PSP.
Krypta: wynik okna VWAP; finansowanie w stajniach jest drugą warstwą FX.
Cross-wallet transfer: ruch wewnątrz platformy - bez dochodu FX, po prostu transfer między książkami.
11) szablony SQL
11. 1. Normalizacja kwoty do waluty sprawozdawczej po kursie historycznym
sql
SELECT t. tx_id,
t. amount_original,
t. currency_original,
r. rate AS fx_rate_at_settle,
ROUND(t. amount_original r. rate, rep. scale) AS amount_reporting
FROM raw. transactions t
JOIN ref. fx_rates_intraday r
ON r. pair = CONCAT(t. currency_original, '/',:reporting_ccy)
AND r. ts = (
SELECT MAX(ts) FROM ref. fx_rates_intraday
WHERE pair = r. pair AND ts <= t. settled_at
)
JOIN ref. currencies rep ON rep. code =:reporting_ccy
WHERE t. settled_at BETWEEN:from AND:to;
11. 2. Pomiar rozprzestrzeniania PSP (efektywny vs reference)
sql
SELECT provider, method, DATE(settled_at) AS d,
SUM(original_amount fx_reference_rate) AS ref_in_reporting,
SUM(settlement_amount_in_reporting) AS eff_in_reporting,
10000 (SUM(settlement_amount_in_reporting) /
NULLIF(SUM(original_amount fx_reference_rate),0) - 1) AS spread_bps
FROM dw. fx_settlement_view
WHERE settled_at BETWEEN:from AND:to
GROUP BY 1,2,3;
11. 3. niezrealizowany FX
sql
INSERT INTO treasury. fx_reval_ledger (date, currency, position_amount, rate_eod, amount_reporting_eod, reval_diff, type)
SELECT
:eod AS date, b. currency, b. amount,
e. rate AS rate_eod,
b. amount e. rate AS amount_reporting_eod,
b. amount (e. rate - COALESCE(l. rate_eod, e. rate)) AS reval_diff,
'UNREALIZED'
FROM treasury. balances b
JOIN ref. fx_rates_eod e
ON e. pair = CONCAT(b. currency, '/',:reporting_ccy) AND e. date =:eod
LEFT JOIN LATERAL (
SELECT rate_eod FROM treasury. fx_reval_ledger
WHERE currency=b. currency AND date=:eod - INTERVAL '1 day'
ORDER BY date DESC LIMIT 1
) l ON TRUE;
12) KPI i deski rozdzielcze
FX Slippage (bps) według PSP/Method/MID.
Zrealizowany FX P&L (finansowanie/wypłata) przez Unrealized FX (EOD/EOM).
Otwórz pozycję FX według limitów walutowych vs.
Szybkość trafień „na czas” kursy (stale-rate incydentów).
Udział PSP-konwersja vs Handlowiec-konwersja i jego TCO.
Dokładność zaokrąglania (odchylenia kwot ≥ 1 jednostki mniejszej - bandera).
13) Wpisy i progi
Stawka Stale: brak stawki w czasie zdarzenia → źródło awaryjne/przekaźnik.
Niedopasowanie triangulacji: rozbieżność> X bps.
Spike spread: 'spread _ bps' powyżej progu w majorach/majorach.
Naruszenie otwartej pozycji: przekroczenie limitu dla każdej waluty.
Wstrząs przewlekły: dzienna aktualizacja wyceny <− X lub> + X
14) Najlepsze praktyki (krótkie)
1. Ściśle oddzielić warstwę produktu (historyczny FX) i FI/skarb państwa (finansowanie/wypłata/reval).
2. Użyj małych jednostek i przechowywać kursy z wysoką dokładnością.
3. Zaloguj conversion_owner i zmierz margines PSP (efektywny vs reference).
4. Wdrożenie idempotencji zdarzeń i pojednania dwukierunkowego (Tx → Plik i plik → Tx).
5. Trzymaj walutę kotwiczącą do triangulacji i zatwierdzaj rozbieżności w bps.
6. Ponowna ocena sald za pomocą procedury EOD z oddzielnym GL.
7. Zastanów się nad DST/stref czasowych przy przypisywaniu kursów do rozliczenia/finansowania.
8. Regularne testy na podstawie właściwości na granicach skali.
15) Lista kontrolna wdrażania
- Definicja waluty sprawozdawczej i historycznej polityki FX.
- Źródła kursu: intraday + EOD, fallback i aktualizacje SLA.
- Model 'ledger. wpisy "," fx _ rates _ "," funding _ receipts "," balances ", vитрина" transactions _ flat ".
- Mechanizm triangulacji i dziennik trasy.
- Алерта: stale-rates, spread spike, triangulation mismatch, open position breach.
- Tablice rozdzielcze KPI i raporty dotyczące uzgadniania PSP/banku.
- zmiany procedur i oddzielne GL dla zrealizowanych/niezrealizowanych FX.
- Zestawy testowe dokładności zaokrąglania i przechowywania.
Podsumowanie
Książki wielokrotności są dyscypliną separacji warstw: historyczny FX dla produktu, rzeczywisty dla trejerie, rewaloryzacja EOD dla bilansów. Dzięki przejrzystym źródłom stawek, dokładnemu modelowi danych, podwójnemu wejściu i zautomatyzowanemu uzgodnieniu, wyeliminujesz „szum walutowy” z analityki, zapewnisz audyt i uzyskasz zarządzanie ryzykiem FX w globalnej monetyzacji.