Skip to content

Instantly share code, notes, and snippets.

@toolittlecakes
Created April 10, 2026 05:34
Show Gist options
  • Select an option

  • Save toolittlecakes/f78e830cb5ee845fea9927b19ccf1e1e to your computer and use it in GitHub Desktop.

Select an option

Save toolittlecakes/f78e830cb5ee845fea9927b19ccf1e1e to your computer and use it in GitHub Desktop.

SR_01: алгоритм расчета для экспертной сверки

Этот документ нужен для созвона с экспертами заказчика. Его цель: по номеру строки SR_01 быстро понять, как именно сейчас считается значение, и где у нас остаются вопросы к предметной логике.

Связанный файл со сверкой значений: sr01_values_comparison.xlsx.

1. Как читать этот документ

Для любой строки SR_01 сейчас есть один из трех режимов расчета:

  1. Прямая агрегация по счету второго порядка.
  2. Специальный расчет по точным лицевым счетам.
  3. Исключение из прямой агрегации.

Поэтому искать код нужно так:

  • если код входит в раздел special codes, он считается по отдельному правилу
  • если код входит в раздел исключенных кодов 405xx / 406xx / 407xx, он не считается как обычная прямая сумма
  • все остальные коды считаются прямой агрегацией по одноименному счету второго порядка

2. Общая схема расчета

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["Посчитать показатели за период"]
Loading

3. Общие правила расчета показателей

3.1 Базовый остаток

Для каждой выбранной строки accounts.csv берется:

  • Сумма исходящего остатка, в руб.

3.2 Разделение по колонкам формы

Каждый выбранный остаток попадает в одну из трех корзин:

  • Остаток в рублях
  • Остаток в иностранной валюте
  • Остаток в валюте недружественных стран

Правило:

  • если валюта счета рублевая, сумма идет в 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"]
Loading

3.3 Округление

После суммирования значение округляется до тысяч рублей по обычному правилу математического округления.

3.4 Показатели за период

После округления считаются:

  • Сумма остатка в рублях за период
  • Сумма остатка в валюте за период
  • Сумма остатка в недружественной валюте за период

Текущий рабочий алгоритм:

  1. исходящий остаток сначала масштабируется коэффициентом периода
  2. затем суммы округляются до тыс. руб.
  3. затем округленное значение умножается на Количество дней за период

Важно:

  • сама идея среднемесячного остатка нормативно подтверждена
  • но точная формула усреднения по дням все еще требует подтверждения экспертом

4. Алгоритм по типам кодов

4.1 Special codes

Для этих кодов не используется обычная прямая агрегация по счету второго порядка.

Основание для отбора лицевых счетов здесь такое:

  • в data_sobs_for_acct.xlsx есть колонка Код расшифровки
  • в той же таблице есть колонка Номер лицевого счета
  • для каждого специального кода мы берем все уникальные лицевые счета, которые в этой таблице помечены соответствующим Кодом расшифровки
  • если одна и та же связка повторяется по разным датам, это не новый счет, а та же самая сущность на другом дне наблюдения

То есть правило здесь не “захардкодить список вручную”, а:

  1. найти все строки таблицы расшифровки, где Код расшифровки = нужному special code
  2. взять из них уникальные значения Номер лицевого счета
  3. по этим лицевым счетам собрать остатки в accounts.csv

Ниже для каждого кода приведены не только сами лицевые счета, но и тот предметный признак, который виден в таблице расшифровки и объясняет, почему именно эти строки попали в код.

flowchart TD
    A["data_sobs_for_acct.xlsx"] --> B["Отфильтровать строки по Коду расшифровки"]
    B --> C["Взять уникальные Номера лицевого счета"]
    C --> D["Найти эти лицевые счета в accounts.csv"]
    D --> E["Суммировать остатки по общим правилам rub / fx / fx_unfriendly"]
Loading

110001

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 110001
  • у всех таких строк заполнен признак Центральный депозитарий = f110_cd3
  • из этих строк берем уникальные лицевые счета

Это дает лицевые счета:

  • 30411810800020000000
  • 30415810000020000000
  • 30415840600020000001

Предметная интерпретация:

  • это не просто произвольные счета 30411 / 30415
  • это именно та часть этих счетов, которая в таблице расшифровки отнесена к центральному депозитарию
  • поэтому для 110001 используется не весь счет второго порядка, а только подмножество лицевых счетов с этим признаком

302003

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 302003
  • в этих строках одновременно видны признаки Обязательства перед АСВ = True и Клиент ВЭБ = 291
  • после дедупликации по лицевому счету остается один лицевой счет

Это дает лицевой счет:

  • 43307810800020000001

Предметная интерпретация:

  • 302003 сейчас трактуется не как весь 43307
  • а как специальное подмножество обязательств, которое таблица расшифровки отдельно помечает этим кодом

305001

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 305001
  • в таблице для этого кода присутствует только один уникальный лицевой счет

Это дает лицевой счет:

  • 30502810100230000001

Предметная интерпретация:

  • здесь правило максимально узкое: код 305001 в таблице расшифровки уже напрямую раскрыт до одного лицевого счета
  • поэтому агрегировать весь 30502 было бы шире, чем это показывает доменная расшифровка

501001

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 501001
  • все такие строки связаны с Клиент ВЭБ = 54118
  • в таблице встречаются балансовые счета 31303, 31307, 31308, 31309, 31802
  • после дедупликации по лицевому счету получаем полный набор лицевых счетов для этого special code

Это дает лицевые счета:

  • 31303810200020000005
  • 31307810500020000002
  • 31307810800020000003
  • 31307840500020000001
  • 31308840800020000001
  • 31308978000020000003
  • 31309810000020000005
  • 31309810700020000004
  • 31802810200020000001

Предметная интерпретация:

  • 501001 не равен одному счету второго порядка
  • это составной код, который таблица расшифровки собирает из нескольких лицевых счетов разных балансовых счетов
  • объединяющий признак здесь не номер одного балансового счета, а принадлежность к одному специальному коду расшифровки

501002

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 501002
  • у всех таких строк заполнен признак Сделка РЕПО = Да
  • в одном из счетов также встречается специальная отметка Центральный депозитарий = f110n14
  • после дедупликации по лицевому счету получаем набор счетов этого special code

Это дает лицевые счета:

  • 31301810000020000001
  • 31303978000030000001
  • 31501810200020000001
  • 31501810500020000000
  • 31508810300020000001

Предметная интерпретация:

  • 501002 сейчас трактуется как специальная группа РЕПО-обязательств, а не как прямой баланс по одному счету второго порядка
  • именно поэтому здесь участвуют счета из нескольких балансовых счетов (31301, 31303, 31501, 31508)

603001

Правило отбора:

  • берем все строки data_sobs_for_acct.xlsx, где Код расшифровки = 603001
  • все они связаны с Клиент ВЭБ = 54118
  • в таблице остаются два уникальных лицевых счета внутри 30109

Это дает лицевые счета:

  • 30109810300020000003
  • 30109840400020000012

Предметная интерпретация:

  • 603001 не трактуется как весь 30109
  • берется только тот фрагмент 30109, который таблица расшифровки относит к этому специальному коду

4.2 Исключенные из прямой агрегации коды

Эти коды сейчас не считаются как обычная сумма по одноименному счету второго порядка:

  • 40501, 40502, 40503, 40504, 40506
  • 40601, 40602, 40603, 40604, 40606
  • 40701, 40702, 40703, 40704, 40705, 40706

Текущее понимание:

  • для 405xx и 407xx есть предметные основания считать, что они не должны жить как простая прямая агрегация в SR_01
  • для 406xx это пока рабочая гипотеза, которую нужно отдельно подтвердить

4.3 Коды прямой агрегации

Все коды ниже сейчас считаются одинаковым способом:

  1. взять все строки accounts.csv, где Счет 2-ого порядка равен коду строки
  2. применить общие правила раскладки по rub / fx / fx_unfriendly
  3. округлить до тыс. руб.
  4. посчитать показатели за период

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

Группа 202

20202, 20208, 20209

Группа 301

30111, 30122, 30123

Группа 302

30210, 30219, 30220, 30222, 30223, 30230, 30231, 30232, 30236, 302001, 302002, 302004

Группа 304

30411, 30412, 30414, 30415, 30416, 30417, 30418, 30419, 30420, 30421, 30422, 30423, 304141

Группа 306

30601, 30603, 30604, 30606

Группа 314

31401, 31402, 31403, 31404, 31405, 31406, 31407, 31408, 31409, 31410

Группа 316

31601, 31602, 31603, 31604, 31605, 31606, 31607, 31608, 31609

Группа 317

31703

Группа 318

31803

Группа 401

40102, 40105, 40106, 40108, 40110, 40111, 40116

Группа 402

40202, 40203, 40204, 40205, 40206

Группа 403

40301, 40302, 40306, 40307, 40308, 40312

Группа 404

40401, 40403, 40404, 40406, 40410

Группа 408

40802, 40807, 40810, 40817, 40818, 40819, 40820, 40821, 40822, 40823, 40824, 40825, 40826, 408071

Группа 409

40901, 40902, 40903, 40905, 40907, 40909, 40910, 40911, 40912, 40913, 40914, 40915

Группа 410

41001, 41002, 41003, 41004, 41005, 41006, 41007

Группа 411

41101, 41102, 41103, 41104, 41105, 41106, 41107

Группа 412

41201, 41202, 41203, 41204, 41205, 41206, 41207

Группа 413

41301, 41302, 41303, 41304, 41305, 41306, 41307

Группа 414

41401, 41402, 41403, 41404, 41405, 41406, 41407

Группа 415

41501, 41502, 41503, 41504, 41505, 41506, 41507

Группа 416

41601, 41602, 41603, 41604, 41605, 41606, 41607

Группа 417

41701, 41702, 41703, 41704, 41705, 41706, 41707

Группа 418

41801, 41802, 41803, 41804, 41805, 41806, 41807

Группа 419

41901, 41902, 41903, 41904, 41905, 41906, 41907

Группа 420

42001, 42002, 42003, 42004, 42005, 42006, 42007

Группа 421

42101, 42102, 42103, 42104, 42105, 42106, 42107, 42108, 42109, 42110, 42111, 42112, 42113, 42114

Группа 422

42201, 42202, 42203, 42204, 42205, 42206, 42207

Группа 423

42301, 42302, 42303, 42304, 42305, 42306, 42307, 42309, 42310, 42311, 42312, 42313, 42314, 42315

Группа 425

42501, 42502, 42503, 42504, 42505, 42506, 42507

Группа 426

42601, 42602, 42603, 42604, 42605, 42606, 42607, 42609, 42610, 42611, 42612, 42613, 42614, 42615

Группа 427

42701, 42702, 42703, 42704, 42705, 42706, 42707

Группа 428

42801, 42802, 42803, 42804, 42805, 42806, 42807

Группа 429

42901, 42902, 42903, 42904, 42905, 42906, 42907

Группа 430

43001, 43002, 43003, 43004, 43005, 43006, 43007

Группа 431

43101, 43102, 43103, 43104, 43105, 43106, 43107

Группа 432

43201, 43202, 43203, 43204, 43205, 43206, 43207

Группа 433

43301, 43302, 43303, 43304, 43305, 43306, 43307

Группа 434

43401, 43402, 43403, 43404, 43405, 43406, 43407

Группа 435

43501, 43502, 43503, 43504, 43505, 43506, 43507

Группа 436

43601, 43602, 43603, 43604, 43605, 43606, 43607

Группа 437

43701, 43702, 43703, 43704, 43705, 43706, 43707

Группа 438

43801, 43802, 43803, 43804, 43805, 43806, 43807

Группа 439

43901, 43902, 43903, 43904, 43905, 43906, 43907

Группа 440

44001, 44002, 44003, 44004, 44005, 44006, 44007

Группа 474

47401, 47403, 47405, 47407, 47411, 47412, 47416, 47418, 47422, 47426, 474221, 474222, 474223

Группа 476

47601, 47602, 47603, 47605, 47606, 47607, 47608, 47609, 47610, 47611

Группа 520

52001, 52002, 52003, 52004, 52005, 52006

Группа 521

52101, 52102, 52103, 52104, 52105, 52106

Группа 522

52201, 52202, 52203, 52204, 52205, 52206

Группа 523

52301, 52302, 52303, 52304, 52305, 52306, 52307

Группа 524

52401, 52402, 52403, 52404, 52405, 52406, 52407

Группа 525

52501

Группа 534

53401, 53402, 53404, 53405, 53406

Группа 535

53501, 53502, 53504, 53505, 53506

Группа 700

700001, 700002, 700003

5. Основные открытые вопросы к экспертам

5.1 Формула среднемесячного остатка

Нужно подтвердить:

  • как именно формируется средний остаток по дням
  • все ли календарные дни участвуют
  • где именно происходит округление
  • какой upstream source использовался при построении эталона

5.2 Правило для 406xx

Нужно подтвердить:

  • действительно ли 40601, 40602, 40603, 40604, 40606 должны исключаться из прямой агрегации
  • если да, то во что именно они должны маршрутизироваться

5.3 Правило для fx_unfriendly

Нужно подтвердить:

  • достаточно ли только кода валюты
  • или нужно дополнительно учитывать клиентские признаки
  • есть ли внутренний справочник сверх официального списка валют недружественных стран

5.4 Нужны ли еще специальные правила для обычных кодов

Коды, которые сейчас чаще других дают остаточные расхождения и поэтому в первую очередь просятся на экспертную проверку:

  • 40807
  • 40817
  • 40913
  • 40915
  • 42301
  • 42306
  • 47411
  • 30111
  • 30220
  • 40802
  • 47426

Основной вопрос:

  • это действительно обычная прямая агрегация по одноименному счету второго порядка
  • или там тоже есть специальный отбор по лицевым счетам, клиентам или иным признакам
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment