exponenta event banner

Машинное обучение для статистического арбитража II: разработка функций и моделей

Этот пример создает непрерывную марковскую модель динамики книги лимитов (LOB) и разрабатывает стратегию алгоритмической торговли на основе закономерностей, наблюдаемых в данных. Она является частью серии связанных примеров машинного обучения для статистического арбитража (см. Приложения машинного обучения).

Анализ исследовательских данных

Чтобы предсказать будущее поведение системы, необходимо обнаружить закономерности в исторических данных. Огромное количество данных, получаемых от таких обменов, как NASDAQ, создает вычислительные проблемы, предлагая при этом статистические возможности. Этот пример исследует данные LOB путем поиска индикаторов динамики цен, следуя подходу, приведенному в [4].

Необработанные данные

Груз LOBVars.matпредварительно обработанный набор данных LOB системы безопасности NASDAQ INTC.

load LOBVars

Набор данных содержит следующую информацию для каждого заказа: время поступления t (секунды с полуночи), уровень 1 запрашивающая цена MOAsk, цена торгов уровня 1 MOBid, средняя цена Sи индекс дисбаланса I.

Создание графика, показывающего внутридневную эволюцию индекса дисбаланса LOB I и средняя цена S.

figure

t.Format = "hh:mm:ss";

yyaxis left
plot(t,I)
ylabel("Imbalance Index")

yyaxis right
plot(t,S/10000,'LineWidth',2)
ylabel("Midprice (Dollars)")

xlabel("Time")

title('Exchange Data: One Day')
legend(["Imbalance","Midprice"],'Location','NE')
grid on

Figure contains an axes. The axes with title Exchange Data: One Day contains 2 objects of type line. These objects represent Imbalance, Midprice.

При этой шкале индекс дисбаланса не дает никаких признаков будущих изменений в средней цене.

Для получения более подробной информации ограничьте шкалу времени одной минутой.

timeRange = seconds([36000 36060]); % One minute after 10 AM, when prices were climbing
xlim(timeRange)
legend('Location','SE')
title("Exchange Data: One Minute")

Figure contains an axes. The axes with title Exchange Data: One Minute contains 2 objects of type line. These objects represent Imbalance, Midprice.

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

Постройте гистограмму межполостного времени в LOB.

DT = diff(t); % Interarrival Times
DT.Format = "s";

figure
binEdges = seconds(0.01:0.01:1);
histogram(DT,binEdges)
xlabel("Seconds")
ylabel("Number of Orders")
title("LOB Interarrival Times")

Figure contains an axes. The axes with title LOB Interarrival Times contains an object of type histogram.

Межполостные времена следуют характерному образцу процесса Пуассона.

Вычислите среднее время ожидания между порядками путем подгонки экспоненциального распределения к межфакторному времени.

DTAvg = expfit(DT)
DTAvg = duration
   0.040273 sec

Сглаженные данные

Необработанный ряд дисбалансов I является неустойчивым. Для определения наиболее значительных динамических сдвигов ввести степень сглаживания dI, которое представляет собой количество обратных засечек, используемых для усреднения необработанных рядов дисбаланса.

dI = 10; % Hyperparameter
dTI = dI*DTAvg
dTI = duration
   0.40273 sec

Установка соответствует интервалу в 10 делений, или в среднем около 0,4 секунды. Сглаживайте индексы дисбаланса над задним окном.

sI = smoothdata(I,'movmean',[dI 0]);

Визуализация степени сглаживания для оценки потерянной или сохраненной волатильности.

figure
hold on
plot(t,I)
plot(t,sI,'c','LineWidth',2)
hold off

xlabel("Time")
xlim(timeRange)
ylabel("Imbalance Index")
title("Imbalance Data: One Minute")
legend(["Raw","Smoothed"],'Location','SE')
grid on

Figure contains an axes. The axes with title Imbalance Data: One Minute contains 2 objects of type line. These objects represent Raw, Smoothed.

Дискретизированные данные

Для создания марковской модели динамики собрать сглаженный индекс дисбаланса sI в ячейки, дискретизируя его в конечную коллекцию состояний rho (ρ). Количество ячеек numBins - гиперпараметр.

numBins = 3; % Hyperparameter
binEdges = linspace(-1,1,numBins+1);
rho = discretize(sI,binEdges);

Для моделирования производительности прогноза агрегируйте цены через ведущее окно. Количество засечек в окне dS - гиперпараметр.

dS = 20; % Hyperparameter
dTS = dS*DTAvg
dTS = duration
   0.80547 sec

Установка соответствует интервалу в 20 клещей, или в среднем около 0,8 секунды. Дискретизировать движение цен в трех штатах DS (ΔS) по знаку изменения форвардной цены.

DS = NaN(size(S));
shiftS = S(dS+1:end);
DS(1:end-dS) = sign(shiftS-S(1:end-dS));

Визуализация дискретизированных данных.

figure

subplot(3,1,1)
hold on
plot(t,sI,'c','LineWidth',2)
for i = 2:numBins
    yline(binEdges(i),'b--');
end
hold off
xlim(timeRange)
ylim([-1 1])
yticks(binEdges)
title("Imbalance Index (Smoothed)")
grid on

subplot(3,1,2)
plot(t,rho,'co','MarkerSize',3)
xlim(timeRange)
ylim([1 numBins])
yticks(1:numBins)
ylabel("\rho")
title("Imbalance Index (Discretized)")
grid on

subplot(3,1,3)
plot(t,DS,'ro','MarkerSize',3)
xlim(timeRange)
ylim([-1 1])
yticks([-1 0 1])
ylabel("\DeltaS")
title("Price Movement")
grid on

Figure contains 3 axes. Axes 1 with title Imbalance Index (Smoothed) contains 3 objects of type line, constantline. Axes 2 with title Imbalance Index (Discretized) contains an object of type line. Axes 3 with title Price Movement contains an object of type line.

Процесс Маркова с непрерывным временем

Вместе, состояние индекса дисбаланса LOB rho (start) и состояние движения форвардной цены DS (ΔS) описывают двухмерную непрерывную цепь Маркова (CTMC). Цепочка модулируется процессом Пуассона поступления заказов, который сигнализирует о любом переходе между состояниями.

Чтобы упростить описание, дайте двухмерному CTMC одномерное кодирование в состояния phi (start= (, ΔS)).

numStates = 3*numBins; % numStates(DS)*numStates(rho)

phi = NaN(size(t));
for i = 1:length(t)
    switch DS(i)
        case -1
            phi(i) = rho(i);
        case 0
            phi(i) = rho(i) + numBins;
        case 1
            phi(i) = rho(i) + 2*numBins;
    end
end

Последовательные состояния, а также состояния, связанные с/и ΔS, выполняются следующим образом.

Гиперпараметры dI (ΔtI) и dS (ΔtS) определяют размер состояния качения, характеризующего динамику. В момент времени t процесс переходит от (ΔSток) = i к (αток, ΔSбудущее) = j (или удерживается в том же состоянии, если i = j).

Оценка параметров процесса

Выполнение торговой стратегии в любое время t основано на вероятности того, что ΔSfuture будет находиться в конкретном состоянии, обусловленном текущими и предыдущими значениями других состояний. Следуя [3] и [4], определите эмпирические вероятности перехода, а затем оцените их на прогностическую мощность.

% Transition counts

C = zeros(numStates);
for i = 1:length(phi)-dS-1  
    C(phi(i),phi(i+1)) = C(phi(i),phi(i+1))+1;
end

% Holding times

H = diag(C);

% Transition rate matrix (infinitesimal generator)

G = C./H;
v = sum(G,2);
G = G + diag(-v);

% Transition probability matrix (stochastic for all dI)

P = expm(G*dI); % Matrix exponential

Получение торговой матрицы Q содержащий Prob (ΔSfuture 'βprevious, ΔScurrent), как в [4], применить правило Байеса,

Prob (ΔSfuture 'ρprevious, ρcurrent, ΔScurrent) =Prob (ρcurrent, ΔSfuture 'ρprevious, ΔScurrent) Prob (ρcurrent 'ρprevious, ΔScurrent).

Числитель - матрица вероятности перехода P. Вычислить знаменатель PCond.

PCond = zeros(size(P));
phiNums = 1:numStates;
modNums = mod(phiNums,numBins);
for i = phiNums
    for j = phiNums
        idx = (modNums == modNums(j));
        PCond(i,j) = sum(P(i,idx));        
    end    
end

Q = P./PCond;

Показ Q в таблице. Помечайте строки и столбцы составными состояниями

binNames = string(1:numBins);
stateNames = ["("+binNames+",-1)","("+binNames+",0)","("+binNames+",1)"];
QTable = array2table(Q,'RowNames',stateNames,'VariableNames',stateNames)
QTable=9×9 table
               (1,-1)      (2,-1)       (3,-1)       (1,0)      (2,0)      (3,0)       (1,1)        (2,1)       (3,1)  
              ________    _________    _________    _______    _______    _______    _________    _________    ________

    (1,-1)     0.59952      0.30458      0.19165    0.39343    0.67723     0.7099    0.0070457     0.018196    0.098447
    (2,-1)     0.74092      0.58445      0.40023    0.25506    0.41003    0.56386    0.0040178    0.0055189    0.035914
    (3,-1)     0.79895      0.60866      0.55443    0.19814      0.385    0.42501    0.0029096    0.0063377    0.020554
    (1,0)     0.094173     0.036014     0.019107    0.88963    0.91688    0.75192     0.016195     0.047101     0.22897
    (2,0)      0.12325     0.017282     0.015453    0.86523    0.96939     0.9059     0.011525     0.013328    0.078648
    (3,0)       0.1773      0.02616     0.018494    0.81155    0.95359    0.92513     0.011154     0.020252    0.056377
    (1,1)     0.041132    0.0065127    0.0021313    0.59869    0.39374    0.21787      0.36017      0.59975        0.78
    (2,1)     0.059151    0.0053554    0.0027769    0.65672    0.42325    0.26478      0.28413       0.5714     0.73244
    (3,1)     0.095832     0.010519    0.0051565     0.7768     0.6944     0.3906      0.12736      0.29508     0.60424

Строки проиндексированы по (ΔScurrent). Условные вероятности для каждого из трех возможных состояний ΔSfuture считываются из соответствующего столбца, зависящего от αтока.

Представлять Q с тепловой картой.

figure
imagesc(Q)
axis equal tight
hCB = colorbar;
hCB.Label.String = "Prob(\DeltaS_{future} | \rho_{previous},\rho_{current},\DeltaS_{current})";
xticks(phiNums)
xticklabels(stateNames)
xlabel("(\rho_{current},\DeltaS_{future})")
yticks(phiNums)
yticklabels(stateNames)
ylabel("(\rho_{previous},\DeltaS_{current})")
title("Trading Matrix")

Figure contains an axes. The axes with title Trading Matrix contains an object of type image.

Яркий центральный квадрат 3 x 3 показывает, что в большинстве переходов от галочки к галочке изменение цены не ожидается (ΔSfuture = 0). Яркие области в верхнем левом 3 х 3 квадрата (нисходящие движения цен ΔSfuture = -1) и нижнем правом 3 х 3 квадрата (восходящие движения цен ΔSfuture = + 1) демонстрируют динамику, которая может быть использована в торговой стратегии.

Вы можете найти возможности арбитража с помощью порогов Q выше заданной вероятности триггера. Например:

trigger = 0.5;
QPattern = (Q > trigger)
QPattern = 9x9 logical array

   1   0   0   0   1   1   0   0   0
   1   1   0   0   0   1   0   0   0
   1   1   1   0   0   0   0   0   0
   0   0   0   1   1   1   0   0   0
   0   0   0   1   1   1   0   0   0
   0   0   0   1   1   1   0   0   0
   0   0   0   1   0   0   0   1   1
   0   0   0   1   0   0   0   1   1
   0   0   0   1   1   0   0   0   1

Запись в позиции (1,1) показывает вероятность более чем 50% того, что нисходящее движение цены (ΔScurrent = -1) будет сопровождаться другим нисходящим движением цены (ΔSfuture = -1), при условии, что предыдущее и текущее состояния дисбаланса

Торговая стратегия?

Q строится на основе доступных данных обмена и параметров гиперпараметра. Используя Q информирование о будущих торговых решениях зависит от того, будет ли рынок продолжать действовать по той же статистической схеме. Показывает ли рынок динамику в определенных штатах - это тест слабой формы Эффективной рыночной гипотезы (EMH). Для сильно торгуемых активов, таких как тот, который используется в этом примере (INTC), EMH, вероятно, будет удерживаться в течение длительных периодов, и возможности арбитража быстро исчезнут. Однако сбой EMH может произойти в некоторых активах в течение коротких временных интервалов. Рабочая торговая стратегия делит часть торгового дня, достаточно короткую, чтобы показать степень статистического равновесия, на период обучения для оценки Q, используя оптимальные настройки гиперпараметров и период проверки, на котором можно торговать. Для реализации такой стратегии см. Машинное обучение для статистического арбитража III: обучение, настройка и прогнозирование.

Резюме

Этот пример начинается с необработанных данных на LOB и преобразует их в сводку ( Q матрица) возможностей статистического арбитража. Анализ использует математику непрерывных моделей цепи Маркова, сначала в распознавании процесса Пуассона межвенных времен LOB, затем путем дискретизации данных в двумерные состояния, представляющие мгновенное положение рынка. Описание переходов состояний, выведенное эмпирически, приводит к возможности алгоритмической торговой стратегии.

Ссылки

[1] Картея, Альваро, Себастьян Хаймунгал и Джейсон Риччи. «Покупайте низко, продавайте высоко: высокочастотная торговая перспектива». Журнал СИАМ по финансовой математике 5, № 1 (январь 2014): 415-44. https://doi.org/10.1137/130911196.

[2] Гилбо, Фабьен и Хюен Фам. «Оптимальная высокочастотная торговля с лимитом и рыночными заказами». Количественное финансирование 13, № 1 (январь 2013 года): 79-94. https://doi.org/10.1080/14697688.2012.708779.

[3] Норрис, J. R. Markov Chains. Кембридж, Великобритания: Cambridge University Press, 1997.

[4] Рубисов, Антон Д. «Статистический арбитраж с использованием дисбаланса книги лимитов». Магистерская диссертация, Университет Торонто, 2015 год.

Связанные темы