Доработка TRANSAQ по "новому маржинальному постановлению" Предметом доработки является реализация следующих функциональных возможностей TRANSAQ, соответствующих положениям "Единых требований к правилам осуществления брокерской деятельности …", утверждённых Приказом 13-71 ФСФР России от 08.08.2013 1) Асимметричность ставок риска по направлению позиций. Обеспечивается возможность одновременного применения различных по величине ставок риска для длинных и коротких позиций: ставки риска уменьшения стоимости бумаги (ставки риска для длинных позиций) ставки риска увеличения стоимости бумаги (ставки риска для коротких позиций) (До сих пор в системе могла использоваться только единая действующая для клиента ставка риска в инструменте, - как для длинных позиций, так и для коротких.) 2) Расчёт и показ клиенту в режиме реального времени показателя текущей фактической обеспеченности клиентского портфеля, рассчитанной по "минимальным ставкам риска". (Предлагается ввести в практику использования понятие "критическая обеспеченность". Клиент будет видеть этот показатель в заголовке портфеля и понимать: пока этот показатель выше ста процентов – всё хорошо, как только он снизится ниже ста процентов – Брокер "пришлёт доктора".) В целях обеспечения этой функции необходимыми для расчётов данными реализуется возможность определять в системе "минимальные ставки риска" в дополнение к базовым, "начальным ставкам риска". Минимальные ставки могут быть указаны Брокером в явном виде, в противном случае обеспечивается автоматическое вычисление минимальных ставок из начальных с применением стандартного квадратичного преобразования (см. п. 19 Приложения 1 к "Единым требованиям"). 3) Система маржинальных категорий и шаблонов ставок риска, а также средств управления ими. управления рисками клиентов различных категорий. 3.1. В основе системы управления рисками клиентов лежат шаблоны ставок риска, которые заблаговременно разрабатываются Брокером. Общее количество шаблонов ограничено разрядностью 8битного целого (максимум 254 штуки). Каждый шаблон представляет собой совокупность следующих данных: Идентификатор шаблона Наименование шаблона Список инструментов со спец. ставками, где для каждого инструмента указано: Спец. ставка риска для длинных позиций в инструменте Спец. ставка риска для коротких позиций в инструменте [Спец. минимальная ставка риска для длинных позиций в инструменте] [Спец. минимальная ставка риска для коротких позиций в инструменте] Стандартные ставки риска для прочих инструментов: Стандартная ставка риска для длинных позиций Стандартная ставка риска для коротких позиций [Стандартная минимальная ставка риска для длинных позиций] [Стандартная минимальная ставка риска для коротких позиций] В [квадратных скобках] указаны параметры, которые могут быть не заданы, в этом случае они будут будут автоматически вычисляться. 3.2. Вводится понятие маржинальной категории ("маркат"). В системе организуется справочник маржинальных категорий. Каждому клиенту назначается маржинальная категория. Каждой маржинальной категории ставится в соответствие шаблон ставок риска, действующий в отношении всех клиентов, отнесённых к этой маржинальной категории. Таким образом, Брокеру предоставляются следующие удобные возможности: Любой клиент может быть перенесён из одной категории в другую, и в отношении него станут действовать риск-параметры по шаблону этой другой категории. Любой маржинальной категории может быть поставлен в соответствие другой шаблон, и в отношении всех клиентов этой категории сразу станут действовать риск-параметры этого другого шаблона. Риск-параметры любого шаблона могут быть изменены, и изменения будут иметь эффект в отношении всех клиентов, имеющих категории, предписывающие использование данного шаблона. (Такие изменения будут иметь эффект после перезапуска Сервера) Описание реализации с точки зрения интерфейсов пользователя системы База данных TRANSAQ 1. Добавляется новая таблица marcat (Справочник маржинальных категорий) tinyint varchar[20] varchar[80] tinyint id name description rrt_id Идентификатор категории Наименование Идентификатор шаблона ставок риска (RiskRateTemplate) Таблица marcat обязательно должна содержать как минимум одну запись, где id=0. 2. В таблицу client добавляется поле: tinyint marcat_id Маржинальная категория, default=0 Для таблицы client настраивается сonstraint на таблицу marcat. 3. Обеспечивается синхронизация этих новых сущностей между контурами.системы Администратор 1. Реализуется интерфейс ведения справочника маржинальных категорий. 1.a) Контролируется уникальность id (допустимые значения от 0 до 254 включительно) 1.б) Пресекаются попытки пользователя удалить запись с id = 0 1.в) Добавление новой категории, а также изменение назначенного шаблона доводится до сведения Сервера в режиме реального времени. 2. В "карточке клиента добавляется поле "Категория рисков", с возможностью выбрать категорию из справочника. MAccessor 1. В состав атрибутов элемента Client (xp_Transaq_RegisterUser) добавляется атрибут MarCat_ID. Атрибут является необязательным, если при добавлении клиента этот атрибут не задан, Серверу передаётся значение ноль. 2. В процедуру xp_Transaq_ExecXML добавляется новая команда назначения шаблона ставок риска для маржинальной категории SetMarcatRRT (MarCat_ID, RRT_ID) Оба параметра проверяются на допустимость (значение 0xFF не допустимо). Сервер контролирует существование объектов с указанными идентификаторами, в случае их не обнаружения выдаёт сообщения: "Указанная категория рисков не существует" "Указанный шаблон отсутствует в текущей конфигурации" Исключением является допустимое специальное значение идентификатора шаблона нуль (см.ниже). Сервер Справочник шаблонов ставок риска Боркер разрабатывает самостоятельно и предоставляет системе в виде файла RRT.xml, расположенном в рабочем каталоге Сервера TRANSAQ. Файл имеет следующий формат: <Risk_Rate_Template> <RRT id=1 name="Public"> <common_rates <ind_rates> <sec_rates seccode="ENIKI" <sec_rates seccode="BENIKI" <sec_rates seccode="ELI" <sec_rates seccode="VARENIKI" … </ind_rates> </RRT> <RRT id=2 name="Special"> <common_rates <ind_rates> <sec_rates seccode="ENIKI" <sec_rates seccode="BENIKI" <sec_rates seccode="VARENIKI" … </ind_rates> </RRT> … </Risk_Rate_Template> long="5.25" short="3.14" long_x="4.15" short_x="2.71" /> long="8.00" short="4.00" long_x="5.00" short_x="3.00" /> long="7.00" short="3.00" long_x="4.50" short_x="2.25" /> long="7.00" short="3.00" long_x="4.50" short_x="2.25" /> long="7.00" short="3.00" long_x="4.50" short_x="2.25" /> long="7.27" short="4.17" long_x="4.50" short_x="2.25" /> long="9.00" short="5.00" long_x="4.50" short_x="2.25" /> long="7.00" short="3.00" long_x="4.50" short_x="2.25" /> long="7.00" short="3.00" long_x="4.50" short_x="2.25" /> Таблица соответствий используемых обозначений: Атрибут Обозначение Регулятора Предметное содержание Обозначение TRANSAQ long D0+i Ставка риска для лонгов RRlong short D0‾i Ставка риска для шортов RRshort long_x DX+i Ставка риска для лонгов критическая RRlongX short_x DX‾i Ставка риска для шортов критическая RRshortX Значения ставок риска long, short, long_x, short_x задаются в процентах и имеют формат decimal fixed-point. Атрибуты long_x и/или short_x могут быть не указаны, в этих случаях соответствующие им ставки автоматически рассчитываются из long и short, согласно стандартной квадратичной зависимости. Корректные идентификаторы шаблонов имеют значения от 1 до 254 включительно. Шаблоны, не удовлетворяющие этому правилу, игнорируются. Однако ничто не мешает брокеру назначить той или иной маржинальной категории несуществующий шаблон с помощью Администратора. Если категории назначен шаблон 0 или не существующий шаблон, то это означает, что для клиентов этой категории ставки риска определяются традиционным способом – перемножением ставки риска инструмента на коэффициент ставки риска клиента: RRlong = RRshort = security.RiskRate * client.CoeffRisk Такая реализация позволяет легко отменить все категории и шаблоны, и перевести систему на традиционную работу по ставкам*коэффициентам, - для этого достаточно просто удалить файл RRT.xml из рабочего каталога Сервера и перезапустить Сервер. По мере необходимости использования ставок в расчётах применяются методы, позволяющие получить для конкретного клиента нужную ставку риска по конкретному инструменту посредством интерпретации шаблона ставок риска, соответствующего клиенту: RiskRateLong(cln, sec) RiskRateShort(cln, sec) RiskRateLongX(cln, sec) RiskRateShortX(cln, sec) Укрупнённое описание методики портфельных расчётов Модель данных, используемых в расчётах Данные по бумаге (sec): double W Коэффициент оценки (доля, от текущей стоимости актива) double F Коэффициент учёта обязательств (доля, от текущей стоимости шорта) long InitRate Входящая цена бумаги (PrevClose в ценообразующем борде) long Rate Текущая цена бумаги (из ценообразующего борда) double bpCost Стоимость базисного пункта ценообразующего борда Для каждого борда: { long lotsize Количество бумаг в лоте, штук double bp_сost Cтоимость базисного пункта цены } Данные по клиенту (cln): LARGE Sum_tax Суммарная комиссия Для каждого регистра: { LARGE MnyOpenBal Входящее сальдо в деньгах LARGE MnyBought Затрачено на покупки LARGE MnySold Выручено от продажи LARGE MnySettled Исполнено (со знаком, сумма, только Y0) LARGE MnyBalance Текущее сальдо (OpenBal + Settled + Bought – Sold) } Рабочие переменные CLW(cln, sec) - ячейка матрицы [клиенты х инструменты] long Sc_Intraday Счётчик бумаг внутридневный double Sp_Initial Стоимостной сумматор по входящим позициям double Sp_intraday Стоимостной сумматор внутридневный large SumTax Суммарная комиссия по инструменту Для каждого регистра: { long OpenBal Входящая позиция (со знаком, в штуках бумаг) long Bought Куплено штук бумаг long Sold Продано штук бумаг long Settled Исполнено (со знаком, в штуках бумаг, только Y0) long Balance Текущая позиция (OpenBal + Settled + Bought – Sold) long Ord_buy Заявлено купить штук бумаг long Ord_sell Заявлено продать штук бумаг } Расчёты портфельных показателей В каждом инструменте определяется: Cost = sec->Rate * sec->bpСost Нетто-сумма текущих позиций по всем регистрам): N = ∑clw->register->Balance Нетто-сумма заявленного в покупку по всем регистрам B = ∑clw->register->Ord_buy Нетто-сумма заявленного в продажу по всем регистрам S = ∑clw->register->Ord_sell Оценка фактического риска в инструменте: Rfact = func(N) * Cost Оценка планового риска в инструменте: Rplan = max(func(N+B), func(N–S)) * Cost , где: func(x) { if (x < 0) return –x * sec->F * RiskRateShort(cln, sec); else return x * sec->W * RiskRateLong(cln, sec); } Оценка критического риска в инструменте: RX = funcX(N) * Cost , где: funcX(x) { if (x < 0) return –x * sec->F * RiskRateShortX(cln, sec); else return x * sec->W * RiskRateLongX(cln, sec); } Далее, для целей исчисления стоимостей позиций используется величина, учитывающая НКД: Cost_E = Cost + sec->AccruedInt N.B. При исчислении рисков и прибылей-убытков НКД не учитывается. Оценка фактической стоимости позиций в инструменте (Efact): if (N > 0) Efact = N * sec->W * Cost_E if (N < 0) Efact = N * sec->F * Cost_E Оценка плановой стоимости позиций в инструменте (Eplan): if (N) { double X = 0.0; if (N > 0) { if (sec->F > 1.005) X = positive(S - N * (sec->F – Sec->W) / ( sec->F – 1)) * (sec->F – 1); Eplan = [ N * Sec->W – max(B * (1 – Sec->W), X)) ] * Cost_E; } else { // (N < 0) if (Sec->W < 0.995) X = positive(B + N * (sec->F – Sec->W) / (1 – Sec->W)) * (1 – Sec->W); Eplan = [ N * sec->F – max(X, S * (sec->F – 1)) ] * Cost_E; } } else // (N == 0) Eplan = – max(B * (1 – Sec->W), S * (sec->F – 1)) * Cost_E; Вычисляются совокупные показатели по портфелю: Оценка совокупной фактической стоимости портфеля (Капитал фактический): Kfact = cln->MnyBalance – cln->Sum_tax + ∑Efact Оценка совокупной плановой стоимости портфеля (Капитал плановый): Kplan = cln->MnyBalance – cln->Sum_tax + ∑Eplan Оценка совокупного фактического риска клиента по портфелю (сумма по всем инструментам): ∑Rfact Оценка совокупного планового риска по портфелю (сумма по всем инструментам): ∑Rplan Оценка совокупного критического риска по портфелю (сумма по всем инструментам): ∑RX Фактическая обеспеченность клиентского портфеля: Cfact = Kfact / ∑Rfact · 100% Плановая обеспеченность клиентского портфеля: Cplan = K / ∑Rplan · 100% Критическая обеспеченность клиентского портфеля: CX = Kfact / ∑RX · 100% Использование капитала фактическое: Ufact = ∑Rfact / Kfact · 100% Плановое использование капитала: Uplan = ∑Rplan / Kplan Свободные средства клиента: Free = Kplan – ∑Rplan · 100%