Время прочтения: 5 мин.

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

Основополагающим документом для присвоения уровня риска клиенту  при маржинальной торговле является Указание Банка России от 26 ноября 2020 г. № 5636-У «О требованиях к осуществлению брокерской деятельности при совершении брокером отдельных сделок за счет клиента» Пункт 30.

Как показывает практика, один только объем денежных средств не является достаточным основанием для перевода клиента в повышенный уровень риска (далее ПУР). Денежные средства могут размещаться на брокерском счёте без дальнейшего совершения операций. В этом случае банк повышенных рисков не несет. Для оптимизации процесса оценки перевода клиента в ПУР предлагается использовать построенную модель классификации на основе алгоритма K ближайших соседей. В качестве предикторов используются следующие экономические критерии:

  1. Оборот денежных средств по брокерскому счету.
  2. Стратегия инвестирования.
  3. Диверсификация портфеля.
  4. Сумма сделки.

На основе тестовой базы мы составим обучающую выборку для модели, которая и предскажет вероятность принадлежности клиента к стандартному (СУР) или повышенному (ПУР) уровням риска.

Исходный датасет представлен ниже.

Так как в нем нет необходимых экономических показателей (кроме суммы сделки), рассчитаем их самостоятельно с использованием Python на основе имеющихся данных:

#Оборот денежных средств по брокерскому счету — как сумму всех сделок по каждому инвестору (столбец «BRIEF»):

df['cashflow'] = df.groupby('BRIEF')['сумма'].transform('sum')

#Стратегия инвестирования — на основе столбцов «NAME.1» (содержит классификацию ценных бумаг) и «NAME» (наименование ценных бумаг) создали столбец с классификацией ценных бумаг на «акции» и «облигации»:

for j, row in tqdm(df.iterrows(), total=df.index.stop):
    value = None
    if row['NAME.1'] is not np.nan:
        s = row['NAME.1']
        if re.findall('Акции|Другие ценные бумаги|Инвестиционный пай', s) != [] :
            value = 'Акции'
        elif re.findall('Облигаци|облигации|ОВВЗ|ценные бумаги РФ', s) != [] :
            value = 'Облигации'
    else:
        s = row['NAME']
        if re.findall('Доллары США|Многовалютный учет|Евро', s) != [] :
            value = 'Облигации'
        else:
            value = 'Акции'
    df.loc[j, 'strategy'] = value

Далее проведем классификацию, если инвестор использует:

— только облигации, его стратегия консервативная;

— только акции – агрессивная;

— оба финансовых инструмента – умеренная.

a = pd.DataFrame(df.groupby('BRIEF')['strategy'].unique())
a['str'] = [len(x) for x in a['strategy']]
for j, row in tqdm(a.iterrows(), total=a.index.stop):
    value = None
    if row['str'] == 2:
        value = 1 # Умеренный
    else:
        if row['strategy'] == '[Акции]':
            value = 2 # Агрессивный
        else:
            value = 0 # Консервативный
    a.loc[j, 'strat'] = value

# Диверсификация портфеля (количество различных ценных бумаг в разрезе инвесторов)

dvr = pd.DataFrame(df.groupby('BRIEF')['NAME'].unique())
dvr['diversification'] = [len(x) for x in dvr['NAME']]

Так же закодируем таргет-переменную, где клиент с СУР – 0, ПУР – 1.

df['trg'] = [ 0 if x == 'КСУР' else 1 for x in df['КПУР']]

# удалим все ненужные признаки

df = df[['cashflow', 'strat', 'diversification', 'СУММА_СДЕЛКИ', 'trg']]

Помимо получения предикторов, необходимо удалить дубликаты по всей таблице (если имеются), а также масштабировать значения переменных. Например, диверсификация портфеля может измеряться в десятках, а оборот денежных средств в миллионах и более, в связи с чем используем метод MinMaxScaler, который нормирует значения в диапазоне [0, 1].

from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
norm = scaler.fit_transform(df)
scaled_df = pd.DataFrame(norm, columns=['cashflow', 'strategy', 'diversification', 'amount', 'trg'])
scaled_df = scaled_df.drop_duplicates().copy()

Переходим к обучению модели, для чего разбиваем выборку на обучающую и тестовую:

X = scaled_df.iloc[:, :-1].values
y = scaled_df['trg']
from sklearn.model_selection import train_test_split
X_train , X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=27)

from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
KNN_model = KNeighborsClassifier(n_neighbors=5)
KNN_model.fit(X_train, y_train)
KNN_prediction = KNN_model.predict(X_test)

Как видим, модель показывает отличный результат на тестовой выборке. Для сравнения построим нейронную сеть.

import keras
import keras.models as M
import keras.layers as L
import keras.backend as K

K.clear_session()  
model = M.Sequential()
model.add(Dense(4, input_dim=4, activation='relu')) 
model.add(Dense(1,  activation='sigmoid'))
model.summary()

В качестве метрики также рассчитаем accuracy для того, чтобы сопоставить результаты с результатами обучения по методу К ближайших соседей:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
results = model.fit( X_train, y_train, batch_size=4, epochs=3, callbacks=[keras.callbacks.TensorBoard("./logs/keras")], validation_data = (X_test, y_test))

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

В результате работы выбранного нами алгоритма определяется выборка клиентов, которые соответствуют уровню ПУР. Для данной выборки создаём кампания смс-рассылки и push-уведомлений для ознакомления клиента с результатом анализа их уровня риска и приглашение на встречу в офис Банка с возможностью перехода на ПУР.

Таким образом, мы сделали вывод, что применение разработанной нами модели даст возможность увеличить приток клиентов, количество операций, что также даст Банку увеличение объёмов комиссии от маржинальной торговли. Один из плюсов данной системы – исключается репутационный риск, поскольку клиент информируется заранее о возможном переходе.