Машинное обучение для статистического арбитража 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 objects. Axes object 1 with title Imbalance Index (Smoothed) contains 3 objects of type line, constantline. Axes object 2 with title Imbalance Index (Discretized) contains an object of type line. Axes object 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 object. The axes object with title Trading Matrix contains an object of type image.

Яркие, центральные 3 x 3 квадрата показывают, что в большинстве переходов, метки деления к метке деления, никакое изменение цен не ожидается (ΔSfuture=0). Засветка в верхних левых 3 x 3 квадрата (нисходящая динамика цен ΔSfuture=-1) и нижние правые 3 x 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, Альваро, Себастьян Джэймангэл и Джейсон Риччи. "Купите Низко, Продайте Высоко: Высокочастотная Торговая Перспектива". 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.

Похожие темы