Этот пример создает непрерывную марковскую модель динамики книги лимитов (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

При этой шкале индекс дисбаланса не дает никаких признаков будущих изменений в средней цене.
Для получения более подробной информации ограничьте шкалу времени одной минутой.
timeRange = seconds([36000 36060]); % One minute after 10 AM, when prices were climbing xlim(timeRange) legend('Location','SE') title("Exchange Data: One Minute")

По этой шкале резкие отклонения в индексе дисбаланса совпадают с соответствующими отклонениями в средней цене. Если взаимосвязь является прогностической, то есть дисбалансы определенного размера прогнозируют будущие изменения цен, то количественная оценка взаимосвязи может предоставить статистические возможности арбитража.
Постройте гистограмму межполостного времени в 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")

Межполостные времена следуют характерному образцу процесса Пуассона.
Вычислите среднее время ожидания между порядками путем подгонки экспоненциального распределения к межфакторному времени.
DTAvg = expfit(DT)
DTAvg = duration
0.040273 sec
Необработанный ряд дисбалансов I является неустойчивым. Для определения наиболее значительных динамических сдвигов ввести степень сглаживания dI, которое представляет собой количество обратных засечек, используемых для усреднения необработанных рядов дисбаланса.
dI = 10; % Hyperparameter
dTI = dI*DTAvgdTI = 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

Для создания марковской модели динамики собрать сглаженный индекс дисбаланса sI в ячейки, дискретизируя его в конечную коллекцию состояний rho (ρ). Количество ячеек numBins - гиперпараметр.
numBins = 3; % Hyperparameter
binEdges = linspace(-1,1,numBins+1);
rho = discretize(sI,binEdges);Для моделирования производительности прогноза агрегируйте цены через ведущее окно. Количество засечек в окне dS - гиперпараметр.
dS = 20; % Hyperparameter
dTS = dS*DTAvgdTS = duration
0.80547 sec
Установка соответствует интервалу в 20 клещей, или в среднем около 0,8 секунды. Дискретизировать движение цен в трех штатах DS () по знаку изменения форвардной цены.
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

Вместе, состояние индекса дисбаланса LOB rho () и состояние движения форвардной цены DS () описывают двухмерную непрерывную цепь Маркова (CTMC). Цепочка модулируется процессом Пуассона поступления заказов, который сигнализирует о любом переходе между состояниями.
Чтобы упростить описание, дайте двухмерному CTMC одномерное кодирование в состояния phi ()).
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
Последовательные состояния, а также состояния, связанные с/и выполняются следующим образом.

Гиперпараметры dI () и dS () определяют размер состояния качения, характеризующего динамику. В момент процесс переходит от (= ΔSбудущее) = j (или удерживается в том же состоянии, если i = j).
Выполнение торговой стратегии в любое время основано на вероятности того, что будет находиться в конкретном состоянии, обусловленном текущими и предыдущими значениями других состояний. Следуя [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 содержащий как в [4], применить правило Байеса,
Δ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
Строки проиндексированы по (). Условные вероятности для каждого из трех возможных состояний Δ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")

Яркий центральный квадрат 3 x 3 показывает, что в большинстве переходов от галочки к галочке изменение цены не ожидается (0). Яркие области в верхнем левом 3 х 3 квадрата (нисходящие цен
Вы можете найти возможности арбитража с помощью порогов 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% того, что нисходящее движение цены (-1) будет сопровождаться другим нисходящим движением цены = -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 год.