Этот пример создает непрерывное время модель Маркова динамики книги лимитного приказа (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*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 x 3 квадрата (нисходящая динамика цен ) и нижние правые 3 x 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, Альваро, Себастьян Джэймангэл и Джейсон Риччи. "Купите Низко, Продайте Высоко: Высокочастотная Торговая Перспектива". SIAM Journal на Финансовой Математике 5, № 1 (январь 2014): 415–44. https://doi.org/10.1137/130911196.
[2] Guilbaud, Фабьен и Хуиен Пам. "Оптимальная Высокочастотная Торговля с Порядками Предела и Рынка". Количественные Финансы 13, № 1 (январь 2013): 79–94. https://doi.org/10.1080/14697688.2012.708779.
[3] Норрис, J. R. Цепи Маркова. Кембридж, Великобритания: Издательство Кембриджского университета, 1997.
[4] Рубисов, Антон Д. "Статистический Арбитраж Используя Книжную Неустойчивость Лимитного приказа". Магистерская диссертация, Университет Торонто, 2015.