Этот пример создает непрерывное время модель Маркова динамики предела порядка книги (LOB) и разрабатывает стратегию алгоритмической торговли на основе шаблонов, наблюдаемых в данных. Это часть серии связанных примеров машинного обучения для статистического арбитража (см. Приложения машинного обучения).
Чтобы предсказать будущее поведение системы, необходимо обнаружить шаблоны в исторических данных. Огромный объем данных, доступных от обменов, таких как NASDAQ, создает вычислительные проблемы, предлагая статистические возможности. Этот пример исследует данные LOB, ища индикаторы ценового импульса, следуя подходу в [4].
Загрузка LOBVars.mat
, предварительно обработанный набор данных LOB NASDAQ security INTC.
load LOBVars
Набор данных содержит следующую информацию для каждого порядка: время прибытия t
(секунды с полуночи), запрашиваемая цена уровня 1 MOAsk
, цена торгов уровня 1 MOBid
, midprice 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*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
Чтобы создать марковскую модель динамики, соберите сглаженный индекс дисбаланса 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
() по признаку форвардного изменения цены.
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
() определить размер состояния качения, характеризующего динамику. В момент времени , процесс переходит от кому (или удерживает в том же состоянии, если ).
Выполнение торговой стратегии в любое время основывается на вероятности находясь в конкретном состоянии, обусловленном текущими и предыдущими значениями других состояний. Следуя [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], применить правило Байеса,
.
Числитель является матрицей вероятностей перехода 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
Строки индексируются (). Условные вероятности для каждого из трех возможных состояний считываются из соответствующего столбца, условно .
Представление 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 показывает, что в большинстве переходов, такт на такт, изменения цены не ожидается (). Яркие области в левом верхнем углу 3 х 3 квадрата (движения вниз по цене ) и правее внизу 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.
Q
создается на базисе как доступных данных обмена, так и установок гиперпараметров. Использование Q
информирование о будущих торговых решениях зависит от сохранения рынка в том же статистическом шаблоне. Проявляет ли рынок импульс в определенных состояниях, является проверкой слабой формы Эффективной рыночной гипотезы (EMH). Для крупноторговых активов, таких как тот, который используется в этом примере (INTC), EMH, вероятно, удержит длительные периоды, и арбитражные возможности быстро исчезнут. Однако отказ EMH может возникнуть в некоторых активах в течение коротких временных интервалов. Рабочая торговая стратегия делит фрагмент торгового дня, достаточно короткую, чтобы показать степень статистического равновесия, на период обучения для оценки Q
, используя оптимальные установки гиперпараметров и период валидации, на который можно торговать. Для реализации такой стратегии смотрите Машинное обучение для статистического арбитража III: Обучение, Настройка и Предсказание.
Этот пример начинается с необработанных данных о LOB и преобразует его в сводные данные (Q
матрица) возможностей статистического арбитража. Анализ использует математику моделей марковских цепей в непрерывном времени, сначала в распознавании пуассоновского процесса межпаровальных времен LOB, затем путем дискретизации данных в двумерные состояния, представляющие мгновенное положение рынка. Описание переходов состояний, выведенное эмпирически, приводит к возможности алгоритмической торговой стратегии.
[1] Cartea, Álvaro, Sebastian Jaimungal, and Jason Ricci. «Купить низко, продать высоко: высокочастотная торговая перспектива». SIAM Journal по финансовой математике 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] Norris, J. R. Markov Chains. Кембридж, Великобритания: Cambridge University Press, 1997.
[4] Rubisov, Anton D. «Statistical Arbitrage Using Limit Order Book Imbalance». Магистерская диссертация, Университет Торонто, 2015.