Извлечение и использование факторов, опирающихся на микроструктуру

5.5/10

Сяньфэн Цзяо, Цзычжун Ли (равный вклад) · Пекинский университет / UC Davis · Чан Сюй, Ян Лю, Вэйцин Лю, Цзян Бянь · Microsoft / Microsoft Research · v1, 16 августа 2023 (CIKM 2023)

Оригинал: Jiao, X., Li, Z., Xu, C., Liu, Y., Liu, W. and Bian, J. «Microstructure-Empowered Stock Factor Extraction and Utilization», 2023 — arxiv.org/abs/2308.08135 (PDF).

Рисунки 1–5 воспроизведены из оригинала. Оригинал на arXiv по лицензии arXiv nonexclusive-distrib 1.0 (не Creative Commons); перевод для личной коллекции, не для публикации.

Ключевые слова: поток заявок; микроструктура; извлечение факторов; условное внимание; DeepSVDD; прогноз дневной доходности; исполнение.

Аннотация

Инвестиции в акции сильно изменились с приходом компьютерных технологий и высокочастотных данных. Поток заявок — самая тонкая гранулярность: стакан и сделки на тиковом уровне. Он даёт трейдеру картину, которой нет в свечах. Но извлечь из него факторы трудно: объём данных огромный, а классический factor mining рассчитан на дневные и часовые ряды.

Авторы предлагают каркас из двух блоков. Кодировщик контекста учит эмбеддинг текущего сегмента потока, сравнивая ожидаемый и фактический стакан. Экстрактор факторов без учителя выбирает сигналы, максимально непохожие на большинство в этом контексте. Из них собирают факторы для прикладных задач разной частоты.

Проверка — полный год потока заявок десяти ликвидных акций CSI 300, а не несколько дней, как в типичных tick-level работах. Факторы улучшают прогноз дневной доходности и минутное исполнение.

1. Введение

Фондовый рынок — центральный объект FinTech. Высокочастотные данные обновляются от секунды до миллисекунд и открывают микроструктуру в реальном времени [3, 4, 23, 34]. Поток заявок — самый сырой слой: хронологическая последовательность ордеров с типом, ценой, объёмом и временем. По нему видны настроения и стратегии, которые свечи показывают только с лагом.

Рисунок 1. Агрегированный поток заявок и свечной график
Рисунок 1. Слева — агрегированный поток заявок (числа в блоках — объём покупок/продаж на уровне цены за одну секунду). Справа — свечи того же интервала. Наверху — давление продавцов; свечи этого не показывают.

На рис. 1 объём продаж заметно больше объёма покупок — давление на продажу и вероятное снижение цены. Свечи дают только запаздывающий итог.

Трудности. Одна акция — порядка 90 000 заявок в день (пример: Ping An Bank, 000001.SZ, 2020). Глубокое обучение для факторов обычно работает на дневных и часовых рядах [5, 9, 15, 16, 36–38] и пропускает относительную силу сторон, настроение и тактику. Второй вызов — адаптация к разным задачам и гранулярностям. Предыдущие работы по потоку заявок бьют в мгновенный тренд [17, 22, 40] или краткосрочную реконструкцию стакана [31, 32], но не в дневные и минутные постановки.

Принципы метода: (1) моделировать именно микроструктуру, а не макро-взгляд; (2) обобщаться на прогноз доходности и исполнение на дневной и минутной частоте. День режут на короткие сегменты (порядка секунды) и извлекают сигналы по сегментам. Сегментов всё равно слишком много — оставляют только самые информативные. По теории информации [29] самые уникальные куски несут больше всего сведений. Контекст сегмента — ожидаемый и фактический рынок.

Кодировщик контекста: из истории копят buy/sell, отдельными генераторами предсказывают стакан следующего сегмента, сравнивают с фактом (expectation–reality). Конкатенация предсказанного, реального и меры расхождения — контекст. Экстрактор берёт сделки сегмента: активные покупки и продажи показывают, кто давит. Условное внимание сжимает сделки с учётом состояния рынка: крупный активный sell в растущем рынке — фиксация прибыли; в спокойном — паника. Дальше без учителя выбирают самые отличительные признаки и склеивают факторы под задачу.

Эмпирика — до года реальных данных, существенно шире [17, 32, 40]. На дневном прогнозе и минутном исполнении метод обходит микроструктурные бейзлайны.

Вклад. (1) Моделирование торговых деталей с микроструктурной, а не макро, точки зрения. (2) Каркас: исторический поток → контекст → отбор факторов по сегментам. (3) Год потока заявок и две задачи разной частоты.

2. Предварительные сведения

Извлечение факторов — поиск паттернов для прогноза: портфель, риск, стратегии. Статистика [1, 11, 24, 26] опирается на экспертизу и плохо переносится на меняющийся рынок. Глубокие сети для факторов почти всегда на дневных данных [5, 9, 15, 16, 36–38]: корреляции между днями, а не внутридневные ордер-паттерны.

Микроструктура в литературе тоньше. Ручные признаки мгновенного состояния, например отношение мгновенных покупок к покупкам [14]; глубокое обучение на тиках — цена [7, 17, 40], симуляции рынка [18, 20, 21, 28, 39]. Мгновенные признаки есть, но для дневных и минутных задач классический factor mining всё ещё сильнее.

2.2. Поток заявок

Определение ордера как в [10, 32]: $x=(p_x,w_x,t_x)$ в момент $t_x$ с ценой $p_x$ и размером $w_x\gt 0$ (продажа) или $w_x\lt 0$ (покупка) — обязательство продать (купить) до $|w_x|$ единиц не дешевле (не дороже) $p_x$. Поток — упорядоченная последовательность $X=\{x_1,\ldots,x_T\}$, $t_{x_1}\le\cdots\le t_{x_T}$. Из него получают стакан и сделки (рис. 2). Рыночные заявки на препроцессинге сводят к эквивалентным лимиткам; отмены отфильтровывают.

Рисунок 2. Обновление стакана по входящему потоку
Рисунок 2. Динамика LOB. Совпадение buy с sell — сделка и изменение стакана. Нет совпадения — сделка не пишется; заявка садится в книгу (на рисунке объём на 12,49 растёт с 200 до 300).

Сделки. Запись $z=(p_z,w_z,t_z)$: $w_z\gt 0$ — активная продажа, $w_z\lt 0$ — активная покупка. Последовательность $Z=\{z_1,\ldots,z_L\}$.

Стакан. Снимок спроса и предложения: $O_t=(O^b_t,O^s_t)$. Bid: $O^b_t=\{(p^{b,0}_t,v^{b,0}_t),\ldots,(p^{b,K}_t,v^{b,K}_t)\}$ с $p^{b,0}_t\gt p^{b,1}_t\gt\cdots\gt p^{b,K}_t$. Ask: $p^{s,0}_t\lt p^{s,1}_t\lt\cdots\lt p^{s,K}_t$.

Обновление мгновенное: \[ O_{t+1}=O_t\otimes x_{t+1}. \] При $t=0$ книга пуста. (i) Нет матча — заявка добавляется на свой уровень. Для покупки $w_{x_{t+1}}\lt 0$ и $p_{x_{t+1}}\lt p^{s,0}_t$: $v^{b,k}_{t+1}=v^{b,k}_t+|w_{x_{t+1}}|$ на уровне $p_{x_{t+1}}=p^{b,k}_t$. (ii) Есть матч — объём съедается. Для покупки $p_{x_{t+1}}\ge p^{s,0}_t$: \[ v^{s,k}_{t+1}=\max\Bigl(v^{s,k}_t-\bigl(|w_{x_{t+1}}|-\sum_{i=0}^{k-1}v^{s,i}_t\bigr),0\Bigr) \] на задетых уровнях. Частичный матч режут на исполненную часть и остаток. Цена сделки — средневзвешенная по пройденным уровням ask. (iii) Отмена откатывает предыдущее обновление.

Таблица 1. Обозначения.
СимволСмысл
$M,N$число исторических сегментов; сегментов за день
$t_0,\Delta t$старт торговой сессии; длина сегмента
$p_x,w_x$цена и размер заявки $x$
$X,x$поток и одна заявка
$X^b_i,X^s_i$buy/sell-поток сегмента $i$
$Z,z$сделки и одна сделка
$O_t,\hat O_t$фактический и предсказанный стакан
$\gamma(O_n,\hat O_n)$расхождение ожидания и факта
$\Delta O^b_i,\Delta O^s_i$накопленные buy/sell сегмента $i$
$\oplus$сложение объёмов на одинаковых уровнях
$\otimes$обновление стакана заявкой
$G_b,G_s$генераторы накопленных buy/sell
$F^M_n,r^M_n$контекст сегмента $n$ по $M$ прошлым и его эмбеддинг
$E_{\mathrm{trans}}$кодированная последовательность сделок
$\tilde X$$E_{\mathrm{trans}}$ плюс контекст $r^M_n$
$\mathrm{Mat}$взвешенная маска экстрактора
$F^{\mathrm{seg}}_n$признак сегмента $n$ из $H$ голов
$\mu$доля сегментов, идущих в факторы

3. Метод

День режут на сегменты; признаки считают по сегментам с учётом контекста. Кодировщик (3.1) кладёт историю в состояние рынка. Экстрактор (3.2) работает без меток задачи. Для более грубой частоты оставляют сегменты, сильнее всего отклоняющиеся от большинства в своём контексте.

Рисунок 3. Каркас: кодировщик контекста и экстрактор факторов
Рисунок 3. Слева — контекст из сгенерированного и реального стакана. Справа — сделки плюс контекст, условное внимание, max-pooling, признак сегмента.

3.1. Кодировщик контекста

День — $N$ сегментов длины $\Delta t$; $n$-й занимает $[t_0+(n-1)\Delta t,\,t_0+n\Delta t]$. Контекст $n$-го — предыдущие $M$ сегментов.

Стакан — снимок ожиданий участников [25]. По истории предсказывают стакан $n$-го сегмента и сравнивают с фактом. Если они близки, текущий кусок мало добавляет к тому, что уже видно из прошлого, — его можно считать менее важным.

Генератор стакана. Поведение в одну сторону обычно непрерывно [2, 13]: серия продаж склонна продолжаться. Отдельные генераторы для покупателей и продавцов. Сегмент $X_i$ делят на $X^b_i$ и $X^s_i$; накопленные объёмы $\Delta O^b_i=O_0\otimes X^b_i$, $\Delta O^s_i=O_0\otimes X^s_i$ ($O_0$ — пустая книга). Скрытые состояния LSTM: \[ h_{b,i}=\mathrm{RNN}_b(h_{b,i-1},\Delta O^b_i),\qquad h_{s,i}=\mathrm{RNN}_s(h_{s,i-1},\Delta O^s_i). \] Решения buy/sell смотрят на противоположную сторону — скрытые состояния шарят. Накопленные заявки сегмента $n$: \[ \Delta O^b_n=G_b(h_{b,n},h_{s,n}),\qquad \Delta O^s_n=G_s(h_{s,n},h_{b,n}). \] Предсказанный стакан: \[ \hat O_n=O_{n-1}\oplus\Delta O^b_n\oplus\Delta O^s_n. \]

Сравнение ожидания и факта. Евклидово расстояние по объёмам на $K$ уровнях: \[ \gamma(O_n,\hat O_n)=\sum_{k=1}^{K}\|v_n^k-\hat v_n^k\|_2. \] Цель генераторов: \[ L_{\mathrm{gen}}=\frac1N\sum_{n=1}^{N}\|\gamma(O_n,\hat O_n)\|_2. \] Контекст: $F^M_n=\mathrm{Concat}(O_n,\hat O_n,\gamma(O_n,\hat O_n))$.

3.2. Экстрактор факторов

Сделки сегмента кодируют доминирование сторон. Активная покупка бьёт в ask (готов платить больше); активная продажа — в bid. Высокая доля активных покупок — бычий фон, продаж — медвежий. $Z_b=\{z_i:v_{z_i}\lt 0\}$, $Z_s=\{z_i:v_{z_i}\gt 0\}$. Кодирование $E_{\mathrm{trans}}=\mathrm{enc}(Z)\in\mathbb R^{L\times d_e}$, затем контекстное многоголовое внимание.

Условное внимание. Контекст $r^M_n=\mathrm{enc}(F^M_n)\in\mathbb R^{d_e}$. Для головы $i$: \[ Q_i=\tilde X W_i^Q,\quad K_i=\tilde X W_i^K,\quad V_i=E_{\mathrm{trans}}W_i^V, \] где $\tilde X=\mathrm{Concat}(E_{\mathrm{trans}},\mathbf 1_{d_e}^\top r^M_n)$ — сделки, к каждой из которых приписан контекст. Контекст входит в $Q$ и $K$, поэтому одна и та же лента сделок читается по-разному в разных состояниях рынка.

Взвешенная маска — без заглядывания вперёд и с разным весом однотипных и разнотипных сделок: \[ \mathrm{Mat}_{i,j}=\begin{cases} 0, & t_{z_i}\le t_{z_j},\\ w, & t_{z_i}\gt t_{z_j}\ \text{и}\ v_{z_i}v_{z_j}\gt 0,\\ 1-w, & t_{z_i}\gt t_{z_j}\ \text{и}\ v_{z_i}v_{z_j}\lt 0. \end{cases} \] Влияние разнотипных сделок обычно сильнее однотипных, поэтому $w\lt 0.5$. Счёт внимания: \[ a_i=\mathrm{softmax}\Bigl(\frac{Q_i K_i^\top}{\sqrt{d_e}}\cdot\mathrm{Mat}\Bigr). \] После max-pooling $h_i=\mathrm{maxpool}(a_i V_i)$; признак сегмента \[ F^{\mathrm{seg}}_n=\mathrm{Concat}(h_1,\ldots,h_H)W^H. \]

Рисунок 4. Оптимизация DeepSVDD и отбор факторов
Рисунок 4. Слева — гиперсфера DeepSVDD: выбросы дальше от центра $c$. Справа — фильтр по доле $\mu$ и две прикладные задачи.

Оптимизация. Без меток задачи — DeepSVDD [27]: сеть отображает признаки на гиперсферу радиуса $R\gt 0$ с центром $c$. $F^{\mathrm{seg}}_i=f(Z_i\mid F^M_i;\theta)$. Цель: \[ \min_{R,\theta}\ R^2+\frac1{\mu N}\sum_{i=1}^{N}\max\bigl\{0,\|F^{\mathrm{seg}}_i-c\|^2-R^2\bigr\}+\frac\lambda2\|\theta\|_2. \] $\mu\in(0,1]$ — доля аномалий (и одновременно доля сегментов, которые пойдут в факторы). $c$ задаётся случайной инициализацией. Индикатор уникальности $d_i=\|F^{\mathrm{seg}}_i-c\|$: чем дальше от центра, тем сегмент отличительнее. Для дневной задачи берут меньшую долю (самые редкие моменты); для минутной — статистики факторов внутри минуты.

4. Постановка эксперимента

Сначала учат апстрим-экстрактор важных торговых сигналов, затем применяют его на двух гранулярностях: дневной доходности и минутном исполнении.

4.1. Данные

Две части: дневные свечи (бейзлайн дневных факторов) и поток заявок с шагом 10 мс (внутридневные микрофакторы). Десять самых активных акций CSI 300, 2 января — 31 декабря 2020, разбиение train/val/test = 7/1/4.

Дневные признаки: high, open, low, close, VWAP, объём. Поток режут окнами по 4 секунды: примерно 4,56 / 0,67 / 2,64 млн сегментов на train/val/test. Признаки заявки: цена, размер, время (где есть). Всё нормируют z-score. Это год десяти бумаг, а не несколько дней горстки тикеров, как в [17, 32, 40].

4.2. Прикладные задачи

Дневная доходность $y=p_{T+2}/p_{T+1}-1$ ($p_t$ — close дня $t$). Кроме чистого LSTM на свечах все методы добавляют внутридневной фактор из потока, конкатенируя его с дневным LSTM-фактором.

Исполнение по постановке [8]: продать одну единицу за фиксированный горизонт с максимальной выгодой. Минутные статистики факторов потока идут в учительскую модель OPD и затем ведут ученика.

4.3. Бейзлайны

Группа 1 — базовые модели. LSTM [12]: только дневная частота, без внутридневки. OPD [8]: дистилляция оракульной политики для снижения издержек исполнения.

Группа 2 — внутридневные признаки из сделок. Случайная и равномерная выборка внутри дня; высокочастотные признаки LOB [20] (time-insensitive и time-sensitive); ценовой фактор (max/min цены сделок за день); объёмный (max/min объёма); классический order imbalance [14] — лог-разность глубин пяти лучших bid/ask; time-sensitive imbalance [6, 30].

Группа 3 — метод и абляции. Без CE и CAM; без CE (контекст — текущий реальный стакан); без взвешенной маски. Признаки групп 2–3 добавляют к моделям группы 1.

4.4. Реализация

Кодировщик: $M=100$; $\mathrm{RNN}_{s/b}$ — LSTM, hidden 64; $G_{s/b}$ — MLP, hidden 64. Экстрактор: один слой условного внимания, hidden 16, 4 головы. В (13): $\mu=0.02$, $\lambda=0.1$. $\Delta t=4$ с, Adam, learning rate $1\times 10^{-3}$, GPU Nvidia A100.

Дневной прогноз: верхние 2% сегментов как микродополнение; из них цена, объём, время, фактор; MLP собирает дневное представление. Метрики: IC (Пирсон), Rank IC (Спирмен), Rank IR: \[ \mathrm{RankIR}=\frac{\mathrm{Mean}(\mathrm{RankIC})}{\mathrm{Std}(\mathrm{RankIC})}. \]

Исполнение: mean, median, max, min, дисперсия и размах минутных факторов — в учителя OPD. Метрики PA и GLR [8]: \[ \mathrm{PA}=\frac{10^4}{|D|}\sum_{k=1}^{|D|}\Bigl(\frac{P^k_{\mathrm{strategy}}}{\bar P^k}-1\Bigr),\qquad \mathrm{GLR}=\frac{\mathbb E[\mathrm{PA}\mid\mathrm{PA}\gt 0]}{\mathbb E[|\mathrm{PA}|\mid\mathrm{PA}\lt 0]}. \] $P^k_{\mathrm{strategy}}$ — средняя цена исполнения заявки $k$, $\bar P^k$ — средняя рыночная цена инструмента в тот день. В оригинале знаменатель GLR записан как $\mathbb E[\mathrm{PA}\mid\mathrm{PA}\lt 0]$; по величинам в табл. 3 (около единицы) это отношение среднего выигрыша к среднему модулю проигрыша.

5. Результаты

Метод вытаскивает самые информативные моменты дня из микросекундного потока и работает и на дневной, и на минутной частоте. Абляции подтверждают вклад кодировщика, условного внимания и маски. Кейс на одной бумаге: выделенные сегменты совпадают с дисбалансом стакана.

5.1. Сравнение с бейзлайнами

Таблица 2. Прогноз дневной доходности.
МетодIC↑Rank IC↑Rank IR↑
Random Sample0,01180,01890,0534
Uniform Sample0,02120,02290,0684
Price-Based Transaction Factor0,02920,02370,0730
Volume-Based Transaction Factor0,03580,03220,0983
Order Imbalance0,03500,02850,0871
High-Freq LOB Feature0,04520,04120,1287
Time-Sensitive Order Imbalance0,03640,03210,0984
Наш метод (без CE, CAM)0,05610,06440,2050
Наш метод (без CE)0,05290,06320,1992
Наш метод (без Mat)0,05820,06700,1908
Наш метод0,08170,07870,2179

Правила отбора внутри дня лучше случайной и равномерной выборки по всем трём метрикам. Полный метод бьёт лучший rule-based бейзлайн (High-Freq LOB Feature) на 81% по IC, 91% по Rank IC, 69% по Rank IR. В отличие от жёстких правил каркас подстраивается под меняющуюся бумагу.

Таблица 3. Исполнение: Price Advantage и Gain-Loss Ratio.
МетодPAGLR
OPD0,580,94
High-Freq LOB Feature1,620,96
Price-Based Transaction Factor1,180,94
Volume-Based Transaction Factor1,031,00
Time-Sensitive Order Imbalance2,201,00
Order Imbalance1,460,97
Наш метод (без CE, CAM)2,231,03
Наш метод (без CE)2,451,03
Наш метод (без Mat)2,731,01
Наш метод3,051,03

Любой rule-based внутридневной фактор улучшает голый OPD. Лучший rule-based — Time-Sensitive Order Imbalance (PA 2,20). Полный метод: PA 3,05 (+38,64%) и GLR 1,03 (+3%).

5.2. Абляции

Вариант без CE и CAM уже обходит все внешние бейзлайны на обеих задачах, но слабее варианта без CE (контекст = текущий реальный стакан). Полный метод лучше обоих: исторические стаканы дают рабочий контекст для ленты сделок. Снятие маски тоже сажает метрики: моделировать разное влияние однотипных и разнотипных сделок имеет смысл.

5.3. Кейс

Рисунок 5. Кейс: индикаторы уникальности, цена и состав потока
Рисунок 5. 000568.SZ, 30 ноября 2020. Красные треугольники — индикаторы уникальности. Интервал B (примерно 11:18–13:03) совпадает с разворотом; доля bid и крупных входящих заявок растёт.

Случайный тестовый день, бумага 000568.SZ. «Volume of bid side in LOB» — объём покупок на топ-5 уровнях. «Ratio of inflow volume size» — доля крупных (XL/L) против мелких (M/S) входящих заявок.

Индикаторы кучно лежат в интервале B (11:18–13:03) — разворот тренда. В спокойном интервале A (11:00–11:10) дисбаланса почти нет. В точке $i$ (11:19:28) доля крупного входящего объёма прыгает с 38,4% до 54,5% — институциональный вход, начало движения основной силы вверх. В точке $j$ (11:25:36) покупатели уже доминируют: доля bid-объёма +33,0 п.п. (54,2% → 87,2%), дальше устойчивый рост цены. Модель ловит сигнал до хода.

6. Заключение

Каркас, который из потока заявок достаёт торговые детали и превращает их в факторы для анализа тренда. Исторический поток кодирует контекст (ожидание против факта); без учителя отбираются сегменты, непохожие на большинство. На годе реальных данных метод работает и на дневном прогнозе доходности, и на минутном исполнении — шире типичных tick-level выборок в несколько дней.

Литература

Перевод: основной текст, таблицы 1–3, рисунки 1–5. · arXiv:2308.08135 · лицензия arXiv nonexclusive-distrib 1.0