Оценка сделок с акциями на фидуциарную ответственность реализована в соответствии с методологией Центрального Банка Российской Федерации для анализа сделок на активном рынке.
В качестве критерия для активного рынка используется листинг на Московской бирже. К активному рынку относятся акции из первого котировального списка.
Для расчета коридора цены, в котором должна быть совершена сделка, необходимо рассчитать показатель z и сравнить его с интервалом от -k до k.
k - это количество стандартных отклонений. ЦБ не раскрывает какой показатель k он использует в качестве критерия. Но в ТрэкРекордс предполагают что этот показатель варьируется от 2 до 3. По умолчанию ТрэкРекордс использует консервативный подход и по умолчанию использует k=2, соответствующее 95% доверительному интервалу. Но клиент может указать и другое значение k.
Показатель z рассчитывается по формуле:
где
x - цена сделки на момент времени,
M - значение средневзвешенной цены, рассчитываемой по итогам торгового периода.
Под торговым периодом понимается 1 час, начиная от момента времени сделки Т и до времени 'Т-1 час'. В этот интвервал времени необходимо получить всю информацию о совершенных на рынке сделках и рассчитать средневзвешенную цену. Данный интервал является кастомным и не может быть рассчитан по классическим свечам. По этому требуется информация обо всех сделках для расчета нужных показателей. За 1 день проходит от 3 до 4 млн сделок с акциями на Московской бирже. ТрэкРекордс хранит историю сделок начиная с 01.01.2023
Q - значение взвешенного среднего квадратического отклонения цены по итогам торгового периода.
Вот выкладка из презентации ЦБ
Чтобы было более понятно как считается показатель M и Q, прилагаем пример функции, написанный на языке Python
def check_stock_trade(isin, tradedatetime, price, quantity, k=2):
#получаем secid by isin
secid_listing = get_secid_by_isin(isin)
secid = secid_listing['secid']
moex_listing = secid_listing['moex_listing']
#получаем сделки за час назад от времени сделки
dFrom = pd.to_datetime(tradedatetime) - timedelta(hours=1)
#функция get_trades получает все сделки из базы ТР по secid в интервале dFrom до tradedatetime и формирует массив tradez
tradez = get_trades(secid, dFrom, tradedatetime)
#добавляем поле delta - разница между ценой сделки пользователя и ценой сделки в реестре
tradez['DELTA'] = price - tradez['PRICE']
tradez['PRICE_CHANGE'] = tradez['PRICE'].diff()
#расчет средневешенной цены за час. Параметр M
m = tradez['VALUE'].sum()/tradez['QUANTITY'].sum()
#поля для расчета взвешенного стандартного отклонения
tradez['M_DIFF'] = tradez['PRICE'] - m
tradez['M_DIFF_VALUE'] = tradez['M_DIFF'].pow(2) * tradez['QUANTITY']
#взвешенное стандартное отклонение
vol = tradez['QUANTITY'].sum()
print("tradez['M_DIFF_VALUE'].sum()", tradez['M_DIFF_VALUE'].sum())
q = np.sqrt(tradez['M_DIFF_VALUE'].sum()/vol)
z = (price-m)/q
#по умолчанию контроль по следке ок. Но если выходим за диапазон то внимание
control = 'ok'
if abs(z) > k:
control = 'attention'
result = {
"isin": isin,
"secid": secid,
"moex_listing":moex_listing,
"period_vol":vol,
"period": '1h',
"M": m,
"Q": q,
"Z":z,
"k":k,
"control": control
}
return result
Для расчета списка сделок используется меню "Фидуциарка". Перед запуском расчета необходимо добавить/загрузить блок сделок. Это можно сделать, нажав на кнопку "+ Добавить сделки" и ввести данные о сделках вручную или загрузить файл с данными о сделках.
После того, как блок сделок добавлен, необходимо создать задачу на расчет. Для этого нажимаем на кнопку калькулятора напротив блока сделок.
Во всплывающем меню задаются параметры ввода параметра k:
После запуска расчета вас перекинет на страницу с результатами. Будет создана новая задача на расчет, и в очередь постепенно будут добавлены ваши сделки. Прогресс выполнения задачи можно отслеживать, периодически нажимая на кнопку "Обновить".