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

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

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 (ρ) и состояние движения форвардной цены DS (ΔS) описать двумерную непрерывную цепь Маркова (CTMC). Цепь модулируется пуассоновским процессом прибытия порядка, который сигнализирует о любом переходе среди состояний.

Чтобы упростить описание, придайте двумерному CTMC одномерную кодировку в состояния phi (φ=(ρ,Δ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, процесс переходит от φ=(ρprevious,ΔScurrent)=i кому φ=(ρcurrent,ΔSfuture)=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,ρcurrent,Δ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 в таблице. Пометьте строки и столбцы составными состояниями φ=(ρ,ΔS).

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

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

Представление 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), при условии, что предыдущий и текущий дисбаланс состоят ρ оба равны 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.

Похожие темы