Этот документ нужен для созвона с экспертами заказчика. Его цель: по номеру строки SR_01 быстро понять, как именно сейчас считается значение, и где у нас остаются вопросы к предметной логике.
Связанный файл со сверкой значений: sr01_values_comparison.xlsx.
Для любой строки SR_01 сейчас есть один из трех режимов расчета:
- Прямая агрегация по счету второго порядка.
- Специальный расчет по точным лицевым счетам.
- Исключение из прямой агрегации.
Поэтому искать код нужно так:
- если код входит в раздел special codes, он считается по отдельному правилу
- если код входит в раздел исключенных кодов
405xx / 406xx / 407xx, он не считается как обычная прямая сумма - все остальные коды считаются прямой агрегацией по одноименному счету второго порядка
flowchart TD
A["Код строки SR_01"] --> B{"Тип кода"}
B -- "Обычный код" --> C["Собрать все счета с тем же кодом второго порядка"]
B -- "Special code" --> D["Собрать только заранее определенные лицевые счета"]
B -- "405xx / 406xx / 407xx" --> E["Не включать в прямую агрегацию"]
C --> F["Разложить остаток по rub / fx / fx_unfriendly"]
D --> F
E --> G["Нужна отдельная предметная трактовка"]
F --> H["Округлить до тыс. руб."]
H --> I["Посчитать показатели за период"]
Для каждой выбранной строки accounts.csv берется:
Сумма исходящего остатка, в руб.
Каждый выбранный остаток попадает в одну из трех корзин:
Остаток в рубляхОстаток в иностранной валютеОстаток в валюте недружественных стран
Правило:
- если валюта счета рублевая, сумма идет в
rub - если валюта счета нерублевая, сумма идет в
fx - если валюта счета входит в официальный список валют недружественных стран, эта же сумма дополнительно идет в
fx_unfriendly
flowchart TD
A["Строка accounts.csv"] --> B{"Валюта счета рублевая?"}
B -- "Да" --> C["Добавить в rub"]
B -- "Нет" --> D["Добавить в fx"]
D --> E{"Валюта входит в список недружественных?"}
E -- "Да" --> F["Добавить в fx_unfriendly"]
E -- "Нет" --> G["Оставить только в fx"]
После суммирования значение округляется до тысяч рублей по обычному правилу математического округления.
После округления считаются:
Сумма остатка в рублях за периодСумма остатка в валюте за периодСумма остатка в недружественной валюте за период
Текущий рабочий алгоритм:
- исходящий остаток сначала масштабируется коэффициентом периода
- затем суммы округляются до тыс. руб.
- затем округленное значение умножается на
Количество дней за период
Важно:
- сама идея среднемесячного остатка нормативно подтверждена
- но точная формула усреднения по дням все еще требует подтверждения экспертом
Для этих кодов не используется обычная прямая агрегация по счету второго порядка.
Основание для отбора лицевых счетов здесь такое:
- в
data_sobs_for_acct.xlsxесть колонкаКод расшифровки - в той же таблице есть колонка
Номер лицевого счета - для каждого специального кода мы берем все уникальные лицевые счета, которые в этой таблице помечены соответствующим
Кодом расшифровки - если одна и та же связка повторяется по разным датам, это не новый счет, а та же самая сущность на другом дне наблюдения
То есть правило здесь не “захардкодить список вручную”, а:
- найти все строки таблицы расшифровки, где
Код расшифровки = нужному special code - взять из них уникальные значения
Номер лицевого счета - по этим лицевым счетам собрать остатки в
accounts.csv
Ниже для каждого кода приведены не только сами лицевые счета, но и тот предметный признак, который виден в таблице расшифровки и объясняет, почему именно эти строки попали в код.
flowchart TD
A["data_sobs_for_acct.xlsx"] --> B["Отфильтровать строки по Коду расшифровки"]
B --> C["Взять уникальные Номера лицевого счета"]
C --> D["Найти эти лицевые счета в accounts.csv"]
D --> E["Суммировать остатки по общим правилам rub / fx / fx_unfriendly"]
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 110001 - у всех таких строк заполнен признак
Центральный депозитарий = f110_cd3 - из этих строк берем уникальные лицевые счета
Это дает лицевые счета:
304118108000200000003041581000002000000030415840600020000001
Предметная интерпретация:
- это не просто произвольные счета
30411 / 30415 - это именно та часть этих счетов, которая в таблице расшифровки отнесена к центральному депозитарию
- поэтому для
110001используется не весь счет второго порядка, а только подмножество лицевых счетов с этим признаком
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 302003 - в этих строках одновременно видны признаки
Обязательства перед АСВ = TrueиКлиент ВЭБ = 291 - после дедупликации по лицевому счету остается один лицевой счет
Это дает лицевой счет:
43307810800020000001
Предметная интерпретация:
302003сейчас трактуется не как весь43307- а как специальное подмножество обязательств, которое таблица расшифровки отдельно помечает этим кодом
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 305001 - в таблице для этого кода присутствует только один уникальный лицевой счет
Это дает лицевой счет:
30502810100230000001
Предметная интерпретация:
- здесь правило максимально узкое: код
305001в таблице расшифровки уже напрямую раскрыт до одного лицевого счета - поэтому агрегировать весь
30502было бы шире, чем это показывает доменная расшифровка
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 501001 - все такие строки связаны с
Клиент ВЭБ = 54118 - в таблице встречаются балансовые счета
31303,31307,31308,31309,31802 - после дедупликации по лицевому счету получаем полный набор лицевых счетов для этого special code
Это дает лицевые счета:
313038102000200000053130781050002000000231307810800020000003313078405000200000013130884080002000000131308978000020000003313098100000200000053130981070002000000431802810200020000001
Предметная интерпретация:
501001не равен одному счету второго порядка- это составной код, который таблица расшифровки собирает из нескольких лицевых счетов разных балансовых счетов
- объединяющий признак здесь не номер одного балансового счета, а принадлежность к одному специальному коду расшифровки
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 501002 - у всех таких строк заполнен признак
Сделка РЕПО = Да - в одном из счетов также встречается специальная отметка
Центральный депозитарий = f110n14 - после дедупликации по лицевому счету получаем набор счетов этого special code
Это дает лицевые счета:
3130181000002000000131303978000030000001315018102000200000013150181050002000000031508810300020000001
Предметная интерпретация:
501002сейчас трактуется как специальная группа РЕПО-обязательств, а не как прямой баланс по одному счету второго порядка- именно поэтому здесь участвуют счета из нескольких балансовых счетов (
31301,31303,31501,31508)
Правило отбора:
- берем все строки
data_sobs_for_acct.xlsx, гдеКод расшифровки = 603001 - все они связаны с
Клиент ВЭБ = 54118 - в таблице остаются два уникальных лицевых счета внутри
30109
Это дает лицевые счета:
3010981030002000000330109840400020000012
Предметная интерпретация:
603001не трактуется как весь30109- берется только тот фрагмент
30109, который таблица расшифровки относит к этому специальному коду
Эти коды сейчас не считаются как обычная сумма по одноименному счету второго порядка:
40501,40502,40503,40504,4050640601,40602,40603,40604,4060640701,40702,40703,40704,40705,40706
Текущее понимание:
- для
405xxи407xxесть предметные основания считать, что они не должны жить как простая прямая агрегация в SR_01 - для
406xxэто пока рабочая гипотеза, которую нужно отдельно подтвердить
Все коды ниже сейчас считаются одинаковым способом:
- взять все строки
accounts.csv, гдеСчет 2-ого порядкаравен коду строки - применить общие правила раскладки по
rub / fx / fx_unfriendly - округлить до тыс. руб.
- посчитать показатели за период
Ниже перечислены все такие коды, чтобы их можно было находить поиском по номеру.
20202, 20208, 20209
30111, 30122, 30123
30210, 30219, 30220, 30222, 30223, 30230, 30231, 30232, 30236, 302001, 302002, 302004
30411, 30412, 30414, 30415, 30416, 30417, 30418, 30419, 30420, 30421, 30422, 30423, 304141
30601, 30603, 30604, 30606
31401, 31402, 31403, 31404, 31405, 31406, 31407, 31408, 31409, 31410
31601, 31602, 31603, 31604, 31605, 31606, 31607, 31608, 31609
31703
31803
40102, 40105, 40106, 40108, 40110, 40111, 40116
40202, 40203, 40204, 40205, 40206
40301, 40302, 40306, 40307, 40308, 40312
40401, 40403, 40404, 40406, 40410
40802, 40807, 40810, 40817, 40818, 40819, 40820, 40821, 40822, 40823, 40824, 40825, 40826, 408071
40901, 40902, 40903, 40905, 40907, 40909, 40910, 40911, 40912, 40913, 40914, 40915
41001, 41002, 41003, 41004, 41005, 41006, 41007
41101, 41102, 41103, 41104, 41105, 41106, 41107
41201, 41202, 41203, 41204, 41205, 41206, 41207
41301, 41302, 41303, 41304, 41305, 41306, 41307
41401, 41402, 41403, 41404, 41405, 41406, 41407
41501, 41502, 41503, 41504, 41505, 41506, 41507
41601, 41602, 41603, 41604, 41605, 41606, 41607
41701, 41702, 41703, 41704, 41705, 41706, 41707
41801, 41802, 41803, 41804, 41805, 41806, 41807
41901, 41902, 41903, 41904, 41905, 41906, 41907
42001, 42002, 42003, 42004, 42005, 42006, 42007
42101, 42102, 42103, 42104, 42105, 42106, 42107, 42108, 42109, 42110, 42111, 42112, 42113, 42114
42201, 42202, 42203, 42204, 42205, 42206, 42207
42301, 42302, 42303, 42304, 42305, 42306, 42307, 42309, 42310, 42311, 42312, 42313, 42314, 42315
42501, 42502, 42503, 42504, 42505, 42506, 42507
42601, 42602, 42603, 42604, 42605, 42606, 42607, 42609, 42610, 42611, 42612, 42613, 42614, 42615
42701, 42702, 42703, 42704, 42705, 42706, 42707
42801, 42802, 42803, 42804, 42805, 42806, 42807
42901, 42902, 42903, 42904, 42905, 42906, 42907
43001, 43002, 43003, 43004, 43005, 43006, 43007
43101, 43102, 43103, 43104, 43105, 43106, 43107
43201, 43202, 43203, 43204, 43205, 43206, 43207
43301, 43302, 43303, 43304, 43305, 43306, 43307
43401, 43402, 43403, 43404, 43405, 43406, 43407
43501, 43502, 43503, 43504, 43505, 43506, 43507
43601, 43602, 43603, 43604, 43605, 43606, 43607
43701, 43702, 43703, 43704, 43705, 43706, 43707
43801, 43802, 43803, 43804, 43805, 43806, 43807
43901, 43902, 43903, 43904, 43905, 43906, 43907
44001, 44002, 44003, 44004, 44005, 44006, 44007
47401, 47403, 47405, 47407, 47411, 47412, 47416, 47418, 47422, 47426, 474221, 474222, 474223
47601, 47602, 47603, 47605, 47606, 47607, 47608, 47609, 47610, 47611
52001, 52002, 52003, 52004, 52005, 52006
52101, 52102, 52103, 52104, 52105, 52106
52201, 52202, 52203, 52204, 52205, 52206
52301, 52302, 52303, 52304, 52305, 52306, 52307
52401, 52402, 52403, 52404, 52405, 52406, 52407
52501
53401, 53402, 53404, 53405, 53406
53501, 53502, 53504, 53505, 53506
700001, 700002, 700003
Нужно подтвердить:
- как именно формируется средний остаток по дням
- все ли календарные дни участвуют
- где именно происходит округление
- какой upstream source использовался при построении эталона
Нужно подтвердить:
- действительно ли
40601,40602,40603,40604,40606должны исключаться из прямой агрегации - если да, то во что именно они должны маршрутизироваться
Нужно подтвердить:
- достаточно ли только кода валюты
- или нужно дополнительно учитывать клиентские признаки
- есть ли внутренний справочник сверх официального списка валют недружественных стран
Коды, которые сейчас чаще других дают остаточные расхождения и поэтому в первую очередь просятся на экспертную проверку:
4080740817409134091542301423064741130111302204080247426
Основной вопрос:
- это действительно обычная прямая агрегация по одноименному счету второго порядка
- или там тоже есть специальный отбор по лицевым счетам, клиентам или иным признакам