ПРАКТИКУМ И ДОКАЗАТЕЛЬСТВАP1L3

LAB-TRM: график сделки, календарь и синтетическая оценка

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

Ревизия 1 Общие понятия Частичное покрытие Контекст: CTX-GENERAL документальная опора: недостаточно данныхэталонная проверка: прошло
Проверяемый учебный стенд. Реализация основана на синтетических данных и автоматических тестах. Это не продуктовая система и не проект работодателя.

LAB-TRM: график сделки, календарь и синтетическая оценка#

Эта лаборатория расширяет локальный TRM reference model до графика процентных потоков и оценки по заданной zero curve. Все входы придуманы для обучения; это не SAP-проводка, не текущие рыночные данные и не финансовая рекомендация. Проверенный результат относится к Python-модели и независимому golden fixture, а не к SAP Transaction Manager.

Условия примера#

Задана фиксированная синтетическая сделка на 1 000 000 минимальных денежных единиц в RUB с 30 января по 30 июля 2026 года. Годовая ставка равна 6%, платежи каждые два месяца, база начисления 30E/360. Каждая незавершённая сумма купона выплачивается по окончании периода; номинал погашается вместе с последним купоном.

Календарь не считает субботу и воскресенье рабочими днями; 1 июня 2026 года добавлен как учебный праздничный день. Используется перенос following. Границы начисления остаются договорными, а рабочий календарь сдвигает только платежную дату.

Расчёт графика#

Для каждого двухмесячного периода используется формула:

coupon_minor = round_half_up(principal_minor × annual_rate × 30E/360_days / 360)

Каждый период от 30-го числа до 30-го числа даёт 60 дней по 30E/360: 1 000 000 × 0.06 × 60 / 360 = 10 000 минимальных единиц. Это не означает, что фактическое число календарных дней в каждом периоде равно 60.

Начисление Договорная граница Платёжная дата Купон Погашение номинала
1 30.01-30.03 30.03.2026 10 000 0
2 30.03-30.05 02.06.2026 10 000 0
3 30.05-30.07 30.07.2026 10 000 1 000 000

30 мая приходится на субботу, 31 мая : воскресенье, а понедельник 1 июня явно задан как праздник, поэтому following переносит платёж на 2 июня. Дата конца начисления остаётся 30 мая. При revised trade revision 2 и ставке 7% исходные потоки сохраняются; новый расчёт даёт купон 11 667 в каждом периоде после half-up округления.

Синтетическая zero curve и present value#

На valuation date 30 января заданы узлы кривой: 3.5% на 30 марта и 4.5% на 30 июля. Между zero rates применяется линейная интерполяция по фактическим календарным дням. Дисконтирование задано непрерывной конвенцией DF = exp(-r × days/365). Это явный учебный выбор формулы, а не утверждение о способе оценки в SAP.

Платёж Сумма, минимальные единицы Ставка кривой Present value, минимальные единицы (округлено для отображения)
30.03.2026 10 000 3.5000% 9 943.5844
02.06.2026 10 000 4.0246% 9 865.2924
30.07.2026 1 010 000 4.5000% 987 711.3916

Итого до округления: 1 007 520.2684; после half-up до минимальной единицы : 1 007 520. В условном RUB с двумя десятичными знаками это 10 075.20 RUB. Независимый fixture хранит тот же ожидаемый целочисленный итог. Если кривая имеет другую валюту, не покрывает дату потока, отсутствует или её as_of_date не равна дате оценки, модель прекращает расчёт. Экстраполяция и stale curve запрещены.

Что проверяет лаборатория#

  1. Условия сделки, даты и календарь проходят закрытую валидацию; ставки задаются точным decimal string, не float.
  2. Каждый поток несёт trade ID и revision; новая версия добавляется в историю, не заменяя старую.
  3. ACT/360, 30E/360 и ACT/365F остаются разными конвенциями; платежное смещение не меняет accrual boundary.
  4. Оценка использует только не оплаченные на valuation date потоки, валюту и zero curve с явным источником/датой/узлами.
  5. Нет недостающих ставок, молчаливого округления Python round, смешения валют и экстраполяции за кривую.
  6. Golden fixture содержит ожидаемые границы, даты и PV независимо от вызываемой модели.

Запуск и доказательства#

Из корня репозитория выполните:

python -m unittest sites/sap-fico/lab/tests/test_trm_lifecycle.py -v

Полный набор лаборатории запускается командой из руководства лаборатории. Доказательство functional_oracle: passed привязано к хешам кода, тестов и fixture из локального manifest. Статус не меняет LAB-TRM SAP runtime: not_run: модель не вызывает SAP, не создаёт реальную сделку и не формирует FI-проводку.

Границы#

Модель фиксированного купона не поддерживает плавающие ставки, кривые нескольких базисов, валютную переоценку, риск-модели, сложные business-day calendars, налоги, продуктовые настройки, posting rules или SAP release behavior. Для нового продукта или рынка нужны отдельные договорные условия, источник рынка, правила кривой и независимый эталон. Материал частично иллюстрирует календарь, изменение сделки, рыночную кривую и дисконтирование из общей тематической карты.

Документация SAP#

Эти страницы описывают области Transaction Manager и передачу потоков в FI. Они не подтверждают совпадение численного результата независимой Python-модели с SAP.

Источники и документация

  1. Create Financial Transaction, S/4HANA On-Premise 2025 FPS01 ↗
  2. Cash Flow, S/4HANA On-Premise 2025 FPS01 ↗
  3. Posting, S/4HANA On-Premise 2025 FPS01 ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.