DeepLOB: التعلم العميق على دفاتر الأوامر المحدودة
دفتر الأوامر المحدودة هو بنية البيانات المركزية للأسواق الإلكترونية الحديثة. كل عرض شراء، وكل عرض بيع، وكل إلغاء — كل ذلك يقيم في دفتر الأوامر (LOB). على مدى عقود، صمم الباحثون الكميون يدويا سمات من هذه البيانات: نسب اختلال توازن الأوامر، وأسعار المنتصف المرجحة، وإشارات موضع الطابور. سلك DeepLOB طريقا مختلفا — فهو يتعلم هذه السمات مباشرة من اللقطات الخام لدفتر الأوامر باستخدام بنية هجينة من CNN وLSTM.
نشره Zhang وZohren وRoberts في معهد Oxford-Man سنة 2019، وأظهر DeepLOB أن شبكة عميقة واحدة، مدربة من البداية إلى النهاية على بيانات الدفتر الخام، تنافس أو تتفوق على خطوط الأساس الكلاسيكية القوية في التنبؤ بحركة سعر المنتصف. لكن ينبغي أن نكون دقيقين بشأن الأدلة. مجموعة البيانات المرجعية FI-2010 هي التي تستشهد بها معظم الأوراق البحثية، لكن المؤلفين أنفسهم يصفونها بأنها غير كافية — "قصيرة جدا، ومنخفضة المعدل، ومأخوذة من سوق أقل سيولة" — ويقدمون تقييما ثانيا أكبر بكثير على بيانات بورصة لندن (LSE) باعتباره نتيجتهم الأقوى. تمتد دراسة LSE هذه على مدى عام تقريبا من خمسة أسهم للتدريب وخمسة أسهم للاختبار، بحجم يبلغ 100 مليون عينة أو أكثر، وتثبت التعلم بالنقل: نموذج مدرب على مجموعة من الأسهم يتنبأ مع ذلك على أسهم لم يرها من قبل. نتيجة النقل هذه، وليست لوحة صدارة FI-2010، هي العنوان الحقيقي للورقة. يحلل هذا المنشور البنية، والرياضيات، والأرقام الحقيقية، وإعادة تنفيذ عملية باستخدام PyTorch.
دفتر الأوامر المحدودة باعتباره بنية بيانات

يحتفظ دفتر الأوامر المحدودة بقائمتين مرتبتين — عروض الشراء (أوامر الشراء) وعروض البيع (أوامر البيع) — كل منهما منظمة حسب مستوى السعر. عند كل مستوى، يسجل الدفتر السعر والحجم الإجمالي للأوامر الراكدة.
بالنسبة لدفتر أوامر يحتوي على مستوى، فإن لقطة واحدة في الزمن هي متجه من قيمة:
حيث و هما سعر وحجم البيع عند المستوى ، و و هما القيمتان المقابلتان في جانب الشراء. يحمل المستوى 1 أفضل عرض شراء وأفضل عرض بيع (BBO)؛ والفرق بينهما هو فرق العرض والطلب (spread).
في مجموعة البيانات المرجعية FI-2010، يكون ، مما يعطي 40 سمة لكل لقطة. بنيت FI-2010 من نحو 4 ملايين رسالة أمر محدودة خام من خمسة أسهم فنلندية في NASDAQ Nordic (Kesko وOutokumpu وSampo وRautaruukki وWartsila) على مدى عشرة أيام تداول متتالية، من 1 إلى 14 يونيو 2010. والأهم من ذلك، أن DeepLOB لا يتدرب على 4 ملايين لقطة: المجموعة المرجعية تخفض معدل أخذ العينات لتلك الرسائل (كل 10 أحداث) إلى تمثيل مطبع من 394,337 عينة. هذا الشكل المنخفض المعدل والمطبع هو ما يراه النموذج فعليا — وهو أحد الأسباب التي تجعل المؤلفين يحذرون من اعتبار FI-2010 الكلمة الأخيرة.
سعر المنتصف وحركاته
سعر المنتصف في الزمن هو متوسط أفضل عرض شراء وبيع:
يتنبأ DeepLOB باتجاه حركة سعر المنتصف على أفق مستقبلي قدره من الأحداث. التسمية هي عائد منعم، لكن انتبه إلى وجود اصطلاحين للتنعيم في الأدبيات، وهما غير قابلين للتبادل:
- المتوسط المستقبلي مقابل السعر الحالي (Tsantekidis وآخرون): مقارنة متوسط سعر المنتصف على مدى الأحداث الـ التالية بسعر المنتصف الحالي الخام.
- المتوسط المستقبلي مقابل المتوسط السابق (Ntakaris وآخرون، وهي تسمية FI-2010 المعيارية، وأيضا التي استخدمها DeepLOB لبيانات LSE الخاصة به): يكون كل من المرجع والهدف منعمين.
تنعيم المرجع (وليس المستقبل فقط) يقلل بشكل جوهري من ضوضاء التسمية الناتجة عن التقلبات أحادية التيك (single-tick)، ولهذا يفضل شكل المتوسط السابق/التالي. وأيا كان ما تستخدمه، يجزأ العائد المستمر إلى ثلاث فئات — صعود، هبوط، ثبات — باستخدام عتبات ثابتة :
توفر مجموعة بيانات FI-2010 تسميات لخمسة آفاق للتنبؤ: من الأحداث.
سمات دفتر الأوامر التقليدية
قبل التعلم العميق، اعتمد الباحثون على سمات مصممة يدويا. فهم هذه السمات أمر أساسي، لأن DeepLOB مبني عمدا ليشبه الكثير منها — فبنيته مستوحاة من هذه الكميات حتى حين لا يعيد إنتاجها بدقة.
اختلال توازن دفتر الأوامر (OBI)
أكثر إشارات البنية الدقيقة استخداما. عند أعلى الدفتر:
زيادة حجم الشراء نسبة إلى حجم البيع يشير إلى ضغط تصاعدي. اختلال التوازن متعدد المستويات يجمع عبر مستوى:
سعر المنتصف المرجح بالحجم
سعر المنتصف المعياري يرجح الجانبين بالتساوي. أما سعر المنتصف المرجح بالحجم (ويسمى أيضا المنتصف المرجح، أو VAMP) فيميل نحو الجانب الأثقل من الدفتر. بكتابة اختلال توازن أعلى الدفتر بالصيغة ، يكون هو المتوسط المرجح باختلال التوازن للسعرين:
لاحظ الترجيح المتقاطع: يرجح سعر البيع بحجم الشراء والعكس صحيح. عندما يهيمن حجم الشراء ()، ينزاح المنتصف المرجح نحو البيع — مما يعكس التوقع بأن الدفتر المختل التوازن سيستقر بالتحرك نحو الجانب الأثقل.
كلمة تحذير حول التسمية. هذا المنتصف الساكن المرجح بالحجم ليس سعر Stoikov الدقيق (microprice). سعر Stoikov الدقيق (2018) هو مقدر معدل وفق مبدأ المارتينجال يحصل عليه من تصحيح تكراري لكيفية تطور الفرق واختلال التوازن — وفكرته بأكملها هي أن المنتصف المرجح الساذج متحيز وليس مارتينجال. إنهما كيانان متمايزان؛ نستخدم المنتصف المرجح هنا لبساطته، لا باعتباره بديلا عن السعر الدقيق.
اختلال توازن العمق
يقيس شكل الدفتر فيما وراء BBO:
الفرق والفرق النسبي
هذه السمات قوية لكنها محدودة. فهي تتطلب خبرة في المجال لتصميمها، ولا تلتقط التفاعلات اللاخطية المعقدة، وتتجاهل الديناميكيات الزمنية عبر اللقطات المتتالية. يعالج DeepLOB هذه القيود الثلاث جميعها.
بنية DeepLOB

تتكون البنية من ثلاث كتل، لكل منها دور متميز:
- الكتلة الالتفافية — تستخرج السمات المكانية من لقطة دفتر الأوامر
- وحدة inception — تلتقط الأنماط الزمنية متعددة المقاييس
- كتلة LSTM — تنمذج التبعيات التسلسلية عبر الزمن
المدخل إلى الشبكة هو موتر بالشكل ، حيث هي نافذة النظر إلى الوراء (100 خطوة زمنية في الورقة) و لعشرة مستويات من السعر والحجم على الجانبين.
الكتلة 1: استخراج السمات الالتفافي
تعمل الطبقات الالتفافية الأولى على طول بعد السمات لتعلم التفاعلات بين السعر والحجم عند كل مستوى.
الطبقة 1: التفاف بحجم مرشح وخطوة يطبق على كل زوج سعر-حجم. هذا يلخص كل زوج في سمة واحدة — بما يماثل حساب "تفاعل سعر-حجم" عند كل مستوى. يتقلص العرض من 40 إلى 20.
الطبقة 2: التفاف بخطوة يعمل عبر أزواج الشراء-البيع المتطابقة عند المستوى نفسه. هذا يلتقط معلومات الفرق واختلال التوازن لكل مستوى. يتقلص العرض من 20 إلى 10.
الطبقة 3: التفاف يدمج عبر المستويات العشرة جميعها، مطويا بعد العمق إلى عرض 1. هذا ينتج سمة مجمعة واحدة لكل خطوة زمنية تشفر ملف العمق الكامل.
كل خطوة / يتبعها التفافان على طول المحور الزمني، كل منهما بتنشيط LeakyReLU وتطبيع دفعة (batch normalization). لاحظ أن هذين الالتفافين بـ padding=(1, 0) لا يحافظان على البعد الزمني: كل منهما يقصره بخطوة واحدة (). عبر الطبقات الست من هذا النوع في الكتل 1-3، يتقلص المحور الزمني من 100 إلى 94 قبل وحدة inception — وهو ما تجعله تعليقات الشكل في الكود أدناه صريحا.
يتجنب التصميم عمدا المرشحات المكانية الكبيرة. مرشحات تحترم بنية الإقران الطبيعية لبيانات LOB — السعر مع الحجم، والشراء مع البيع. هذا التحيز الاستقرائي حاسم: مرشح سيخلط المستويات والجوانب المتجاورة بطريقة لا معنى لها ماليا.
الكتلة 2: وحدة inception
بعد أن تقلص الكتلة الالتفافية السمات الـ 40 إلى تمثيل مكاني مدمج (عرض 1)، تعمل وحدة inception على طول البعد الزمني لالتقاط الأنماط على مقاييس زمنية متعددة في آن واحد.
تحتوي وحدة inception في DeepLOB على أربعة مسارات متوازية، كل منها ينتج 32 قناة، وتجمع جميعها:
- عنق زجاجة التفاف زمني : أنماط زمنية قصيرة المدى (3 خطوات زمنية)
- عنق زجاجة التفاف زمني : أنماط زمنية متوسطة المدى (5 خطوات زمنية)
- تجميع أقصى التفاف : مسار تجميع يحتفظ بعرض منعم ومنخفض المعدل
- (تعمل اختزالات كأعناق زجاجة لحظية قبل الالتفافات الزمنية)
يستخدم كل مسار زمني حشوا متماثلا بحيث يحافظ على البعد الزمني داخل كتلة inception (على عكس الكتل الالتفافية أعلاه). تجمع المخرجات على طول بعد القنوات، مما يمنح الشبكة وصولا إلى سمات زمنية متعددة المقاييس في آن واحد.
هذا مستوحى من بنية inception في GoogLeNet، لكنه مكيف للبيانات الزمنية أحادية البعد بدلا من الصور ثنائية البعد. الفكرة الأساسية هي أن ديناميكيات LOB تعمل على مقاييس زمنية متعددة: ضوضاء تيك بتيك، والزخم قصير المدى، والارتداد إلى المتوسط على أفق أطول، كلها تتعايش معا.
تقدم إعادة التنفيذ بـ PyTorch أدناه متغيرا مبسطا بثلاثة مسارات (الالتفافان الزمنيان إضافة إلى مسار ) لكي يبقى الكود مقروءا؛ وهي تحذف مسار التجميع الأقصى. ننوه بهذا صراحة لأنه انحراف عن الورقة، وليس الوحدة الأصلية.
الكتلة 3: نمذجة التسلسل بـ LSTM
يغذى مخرج وحدة inception إلى طبقة LSTM التي تعالج التسلسل بطوله بأكمله. تلتقط LSTM التبعيات الزمنية بعيدة المدى التي قد تفوتها الالتفافات وحدها — تغيرات النظام، وتأثيرات وقت اليوم، وظروف السوق المتطورة.
تمرر الحالة المخفية النهائية لـ LSTM عبر طبقة متصلة بالكامل بتنشيط softmax لإنتاج توزيع احتمالي على الفئات الثلاث (صعود، هبوط، ثبات).
دالة الخسارة
يدرب النموذج بالانتروبيا المتقاطعة الفئوية:
حيث هي التسمية الحقيقية المشفرة بترميز one-hot و هي الاحتمال المتنبأ به للفئة .
إعادة التنفيذ بـ PyTorch
بني DeepLOB الأصلي في Keras على خلفية TensorFlow؛ وأضاف مستودع المؤلفين (zcakhaa) لاحقا نقلا إلى PyTorch. الكود أدناه هو إعادة تنفيذ توضيحية خاصة بنا بـ PyTorch، وليس الكود الرسمي. وهو ينحرف عن الورقة بطريقتين ننوه بهما داخليا: يحذف مسار التجميع الأقصى في inception (ثلاثة مسارات بدلا من أربعة)، ويزيد عدد القنوات. تستخدم الورقة 16 مرشحا في كل الكتل الالتفافية و32 مرشحا لكل مسار inception (مدخل LSTM )، مما يعطي نموذجا مدمجا بنحو 60 ألف معامل. يستخدم المقتطف أدناه 32 مرشحا التفافيا / 64 مرشح inception (مدخل LSTM 192) — متسق داخليا وقابل للتشغيل، لكنه أثقل من الأصل. لمطابقة الورقة، اضبط قنوات الالتفاف على 16، وقنوات inception على 32، وinput_size=96.
import torch
import torch.nn as nn
class DeepLOB(nn.Module):
"""
DeepLOB-style CNN-Inception-LSTM for limit order books.
Reimplementation inspired by Zhang, Zohren, Roberts (2019),
IEEE Transactions on Signal Processing, arXiv:1808.03668.
NOTE: this is an illustrative reimplementation, NOT the official model.
Differences from the paper:
- inception has 3 paths here vs 4 in the paper (max-pool path omitted);
- channel counts are scaled up (paper: 16 conv / 32 inception, input 96).
Input shape: (batch_size, 1, T, 40)
T = lookback window (e.g. 100)
40 = 10 levels x 4 features (ask_price, ask_vol, bid_price, bid_vol)
"""
def __init__(self, num_classes: int = 3, T: int = 100):
super().__init__()
self.num_classes = num_classes
self.conv1 = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=(1, 2), stride=(1, 2)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
)
self.conv2 = nn.Sequential(
nn.Conv2d(32, 32, kernel_size=(1, 2), stride=(1, 2)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
)
self.conv3 = nn.Sequential(
nn.Conv2d(32, 32, kernel_size=(1, 10)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
nn.Conv2d(32, 32, kernel_size=(4, 1), padding=(1, 0)), # time -1
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(32),
)
self.inp1 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=(1, 1), padding=(0, 0)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(64),
)
self.inp2 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=(1, 1), padding=(0, 0)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, kernel_size=(3, 1), padding=(1, 0)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(64),
)
self.inp3 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=(1, 1), padding=(0, 0)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(64),
nn.Conv2d(64, 64, kernel_size=(5, 1), padding=(2, 0)),
nn.LeakyReLU(negative_slope=0.01),
nn.BatchNorm2d(64),
)
self.lstm = nn.LSTM(
input_size=192, # 64 * 3 paths from the simplified inception
hidden_size=64,
num_layers=1,
batch_first=True,
)
self.fc = nn.Linear(64, num_classes)
def forward(self, x: torch.Tensor) -> torch.Tensor:
"""
Args:
x: Tensor of shape (batch, 1, T, 40)
Returns:
Tensor of shape (batch, num_classes)
"""
h = self.conv1(x) # (batch, 32, T-2, 20)
h = self.conv2(h) # (batch, 32, T-4, 10)
h = self.conv3(h) # (batch, 32, T-6, 1) e.g. T=100 -> 94
h_inp1 = self.inp1(h) # (batch, 64, T-6, 1)
h_inp2 = self.inp2(h) # (batch, 64, T-6, 1)
h_inp3 = self.inp3(h) # (batch, 64, T-6, 1)
h = torch.cat([h_inp1, h_inp2, h_inp3], dim=1) # (batch, 192, T-6, 1)
h = h.squeeze(-1) # (batch, 192, T-6)
h = h.permute(0, 2, 1) # (batch, T-6, 192)
h, _ = self.lstm(h)
h = h[:, -1, :] # take last hidden state
out = self.fc(h)
return out
معالجة البيانات المسبقة
تأتي مجموعة بيانات FI-2010 مطبعة بطريقة z-score. بالنسبة لبيانات دفتر الأوامر الحية، تحتاج إلى تطبيع مماثل:
import numpy as np
from torch.utils.data import Dataset
class LOBDataset(Dataset):
"""Dataset for limit order book snapshots."""
def __init__(
self,
data: np.ndarray,
labels: np.ndarray,
T: int = 100,
):
"""
Args:
data: shape (num_snapshots, 40), raw LOB features
labels: shape (num_snapshots,), class labels {0, 1, 2}
T: lookback window length
"""
self.data = data
self.labels = labels
self.T = T
self.mean = data[:len(data) // 2].mean(axis=0)
self.std = data[:len(data) // 2].std(axis=0)
self.std[self.std == 0] = 1.0
self.data = (self.data - self.mean) / self.std
def __len__(self) -> int:
return len(self.data) - self.T
def __getitem__(self, idx: int):
x = self.data[idx : idx + self.T].reshape(1, self.T, 40)
y = self.labels[idx + self.T - 1]
return torch.tensor(x, dtype=torch.float32), torch.tensor(
y, dtype=torch.long
)
حلقة التدريب
def train_deeplob(
model: DeepLOB,
train_loader,
val_loader,
epochs: int = 50,
lr: float = 0.01,
device: str = "cuda",
):
model = model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=lr, eps=1)
best_val_f1 = 0.0
for epoch in range(epochs):
model.train()
train_loss = 0.0
for x_batch, y_batch in train_loader:
x_batch = x_batch.to(device)
y_batch = y_batch.to(device)
optimizer.zero_grad()
logits = model(x_batch)
loss = criterion(logits, y_batch)
loss.backward()
optimizer.step()
train_loss += loss.item()
model.eval()
all_preds, all_labels = [], []
with torch.no_grad():
for x_val, y_val in val_loader:
x_val = x_val.to(device)
preds = model(x_val).argmax(dim=1).cpu()
all_preds.extend(preds.numpy())
all_labels.extend(y_val.numpy())
from sklearn.metrics import f1_score
val_f1 = f1_score(all_labels, all_preds, average="weighted")
print(
f"Epoch {epoch+1}/{epochs} | "
f"Train Loss: {train_loss/len(train_loader):.4f} | "
f"Val F1: {val_f1:.4f}"
)
if val_f1 > best_val_f1:
best_val_f1 = val_f1
torch.save(model.state_dict(), "deeplob_best.pt")
أهم المعاملات الفائقة للتدريب من الورقة الأصلية:
- المحسن (Optimizer): Adam مع (كبير بشكل غير معتاد — يساعد على تثبيت التحديثات على البيانات المالية المشوشة)
- معدل التعلم: 0.01
- حجم الدفعة: 32
- نافذة النظر إلى الوراء: خطوة زمنية
نتتبع F1 المرجح بدلا من الدقة في التحقق، لأن الفئات الثلاث غير متوازنة — وكما يبين القسم التالي، فإن F1 هو المقياس الذي تركز عليه الورقة الأصلية لهذا السبب بالضبط.
ما بني DeepLOB لالتقاطه

أحد الجوانب الجذابة في DeepLOB هو مدى ارتباط كتله الوثيق بالاستلهام من السمات المصممة يدويا أعلاه. نريد أن نكون حذرين هنا: تقدم الورقة هذه باعتبارها حدوسا تصميمية، لا خصائص مثبتة للشبكة المدربة. فهي لا تنشر تصورات للمرشحات، ولا ارتباطات بين التنشيط واختلال التوازن، ولا تحليلا لما تركز عليه LSTM. لذا اقرأ ما يلي باعتباره نية معمارية، لا نتائج مقاسة.
الكتلة الالتفافية الأولى. مرشحات تقرن السعر بالحجم عند كل مستوى. بنيويا، هذه هي العملية ذاتها التي تشكل سعرا مرجحا بالحجم — وتعلل الورقة الطبقة الأولى بملاحظة أن خرائط سماتها تشكل كمية تشبه السعر الدقيق. الشبكة مبنية لـ استرجاع شيء من تلك العائلة؛ ولا ندعي أنها تعيد اكتشاف أي مقدر محدد بشكل مثبت.
الكتلة الالتفافية الثانية. بالعمل عبر أزواج الشراء-البيع، توضع هذه المرشحات لتعلم سمات تشبه اختلال التوازن على مستويات متعددة — مرة أخرى، بالبناء وليس بارتباط مبرهن.
وحدة inception. الالتفافات الزمنية متعددة المقاييس مقصود بها التقاط الزخم على ترددات مختلفة: يستجيب مسار للبنية اللحظية، ومسار للاتجاهات قصيرة المدى، ومسار لاتجاهات أطول قليلا، و(في الوحدة الكاملة) مسار التجميع الأقصى لعرض منعم.
طبقة LSTM. يضيف المكون التكراري ذاكرة للتبعيات بعيدة المدى التي لا يمكن للالتفافات تمثيلها — تحولات النظام وتأثيرات وقت اليوم. نتجنب الادعاءات الأقوى (مثل أن LSTM تنفذ "انتباها تكيفيا" يعيد ترجيح البيانات الحديثة في الأنظمة المتقلبة)؛ فالورقة لا تبين هذا.
الأداء على FI-2010
تقيم الورقة الأصلية بروتوكولين. يستخدم الإعداد 1 تقسيم التطبيع الأسبق للمجموعة؛ والإعداد 2 هو إعداد التعلم العميق الذي يقارن به معظم العمل اللاحق. ولأن FI-2010 غير متوازنة الفئات، تركز الورقة على F1، لا الدقة، وتورد أرقاما قائمة على الدقة والاستدعاء لخطوط الأساس غير العصبية (SVM وMLP). إليك الأرقام الحقيقية للإعداد 2 (F1، %):
| الأفق (k) | SVM | MLP | CNN-I | LSTM | DeepLOB |
|---|---|---|---|---|---|
| 10 | 35.88 | 48.27 | 55.21 | 66.33 | 83.40 |
| 20 | — | — | — | — | 72.82 |
| 50 | — | — | — | — | 80.35 |
عند ، يورد DeepLOB أيضا دقة قدرها 84.47% إلى جانب F1 البالغ 83.40. لا يورد الإعداد 2 سوى — ولا يوجد صف هنا. (يورد الإعداد 1 فعلا ، بقيم F1 لـ DeepLOB قدرها 77.66 / 74.96 / 76.58 على التوالي.) تشير الشرطات أعلاه إلى خلايا خطوط الأساس التي لا تجدولها الورقة عند تلك الآفاق في هذا البروتوكول.
تبرز عدة ملاحظات:
- يتفوق DeepLOB على خطوط الأساس بهامش واسع عند الأفق القصير. عند ، يفوق F1 البالغ 83.40 بشكل كبير LSTM (66.33) وCNN-I (55.21) وMLP (48.27) وSVM (35.88). الترتيب النوعي — النماذج العميقة التكرارية الالتفافية فوق شبكات CNN وMLP وSVM العادية — هو الخلاصة المتينة.
- اتجاه الأفق غير رتيب، وليس "كلما طال كان أسهل". عبر الإعداد 2، يسير F1 لـ DeepLOB بالشكل بينما يسير بالشكل — نمط على شكل حرف U، حيث يكون الأصعب، لا مسيرة تصاعدية نظيفة. وما إذا كان أفق ما "أسهل" يعتمد بشدة على الإعداد، وعتبة ، ومخطط تنعيم التسمية؛ ولا ينبغي أن نقرأ قانونا كونيا في هذه الأرقام.
- لا يهيمن DeepLOB على كل طريقة كلاسيكية في كل خلية. أمام خطوط أساس قوية مثل C(TABL) تضيق الهوامش عند بعض الآفاق، لذا فإن عبارة "يتفوق على كل الأساليب الكلاسيكية في كل مكان" تبالغ في الأمر. الادعاء الذي يمكن الدفاع عنه هو أنه منافس إلى الأفضل، وأفضل بوضوح عند الأفق القصير.
ومرة أخرى: رأي الورقة نفسها هو أن FI-2010 صغيرة جدا ومنخفضة المعدل جدا لحسم المسألة. دليلها الأقوى هو دراسة LSE، حيث يتدرب DeepLOB على مجموعة من الأسهم ويتنبأ مع ذلك على أسهم محتجزة — نتيجة تعلم بالنقل لا تستطيع FI-2010 إظهارها.
LOBFrame وأزمة التكرار

يقدم إطار العمل المرجعي LOBFrame (Briola وBartolucci وAste، 2024) مكملا واقعيا لهذه النتائج. ففي حين أن بنية DeepLOB سليمة، يبرز إطار العمل عدة تحفظات مهمة:
الاعتماد على البنية الدقيقة. يتباين أداء النموذج بشكل كبير عبر الأسهم ذات الخصائص البنيوية الدقيقة المختلفة. الأسهم السائلة ذات التيك الكبير أسهل في التنبؤ من الأدوات غير السائلة ذات التيك الصغير. النموذج الذي يبدو قويا على سهم ما قد يتدهور بشكل كبير على آخر.
التنبؤ مقابل الربح. الدقة العالية في التصنيف لا تترجم تلقائيا إلى ربح تداول. يشدد LOBFrame على المقاييس المرتبطة بما إذا كانت الحركة المتنبأ بها كبيرة بما يكفي لتجاوز فرق العرض والطلب. يحتاج النموذج إلى أن يكون صحيحا بما يكفي من المرات، وعلى حركات كبيرة بما يكفي، للتغلب على الفرق — وبالنسبة للأسهم ذات الفرق الضيق فإن هذا الحد مرتفع.
حساسية التسمية. اختيار العتبة والأفق يؤثر بشكل كبير على كل من الدقة المبلغ عنها والقيمة العملية للتنبؤات. التسميات الضيقة جدا تنتج أهدافا مشوشة؛ والتسميات الواسعة جدا تنتج تنبؤات "دقيقة" بشكل بديهي لكنها عديمة الفائدة.
ما وراء DeepLOB: المشهد الحالي

منذ نشر DeepLOB، ظهرت عدة امتدادات:
المحولات لدفاتر الأوامر المحدودة (Wallbridge، 2020). كثيرا ما يشار إليه على نحو فضفاض بـ "TransLOB" في الأدبيات اللاحقة، لكن النموذج نفسه هو مستخرج سمات التفافي سببي/متمدد يتبعه انتباه ذاتي متعدد الرؤوس مقنع — وليس ببساطة DeepLOB مع استبدال LSTM بمحول؛ فهو لا يعيد استخدام مكدس inception+conv. وقد أورد حالة فنية جديدة على FI-2010 في وقته.
متغيرات مجال العملات المشفرة. تطبق عدة مجموعات بنى على طراز DeepLOB على أسواق العملات المشفرة، حيث تختلف ديناميكيات دفتر الأوامر اختلافا كبيرا عن الأسهم — فروق أوسع، وتداول على مدار الساعة طوال أيام الأسبوع، ومزيج مختلف من المشاركين يتطلب كل ذلك إعادة تدريب.
متغيرات معززة بالانتباه. يدرج خط من العمل انتباها متعدد الرؤوس بين كتلتي inception وLSTM، مما يتيح للشبكة التركيز على المستويات أو الخطوات الزمنية الأكثر إفادة للتنبؤ الحالي.
LOB-Bench (Nagy وFrey وLi وSarkar وVyetrenko وZohren وCalinescu وFoerster، 2025). يحول هذا المعيار الانتباه من التنبؤ إلى التوليد، مسجلا مدى واقعية النماذج التوليدية لبيانات دفتر الأوامر — وهو ذو صلة بالاختبار الرجعي وتدريب الوكلاء أكثر من التنبؤ الاتجاهي.
اعتبارات عملية للإنتاج
إذا كنت تفكر في نشر نموذج على طراز DeepLOB في نظام تداول حي، تنشأ عدة مخاوف هندسية:
زمن الاستجابة
يجب أن ينتج النموذج التنبؤات ضمن ميزانية زمن الاستجابة لنظام التداول الخاص بك. بالنسبة لأنظمة HFT العاملة بزمن استجابة دون المللي ثانية، قد يكون حتى استدلال PyTorch المحسن بطيئا جدا. تشمل الخيارات:
- تصدير ONNX مع تحسين TensorRT
- التكميم إلى INT8
- النشر على FPGA للتطبيقات الأكثر حساسية لزمن الاستجابة
خط أنابيب البيانات
يتوقع النموذج لقطات دفتر أوامر مطبعة ومحاذاة بتردد ثابت. في الممارسة العملية، تصل تحديثات LOB بشكل غير متزامن. تحتاج إلى:
- محرك إعادة بناء لقطات يحافظ على حالة الدفتر الحالية
- مأخذ عينات بتردد ثابت ينتج موتر المدخل
- تطبيع متصل (online) باستخدام إحصاءات متدحرجة
استقرار السمات
معاملات تطبيع z-score المحسوبة على بيانات التدريب تنجرف مع الوقت. تتغير الأسعار، وتتحول أنظمة التقلب، وتتطور بنية السوق. يحتاج نظام الإنتاج إلى:
- نوافذ تطبيع متدحرجة (مثلا، إعادة حساب الإحصاءات يوميا)
- اكتشاف الأنظمة لتشغيل إعادة تدريب النموذج
- مراقبة انزياح توزيع المدخلات
الإفراط في التكيف مع البنية الدقيقة
أنماط LOB خاصة بالمنصة وخاصة بالأداة. النموذج المدرب على أسهم NASDAQ لن يعمل على BTC/USDT في Binance دون إعادة تدريب. وحتى داخل المنصة نفسها، يمكن للنماذج أن تفرط في التكيف مع:
- نظام حجم التيك (أسهم ذات تيك كبير مقابل تيك صغير)
- أنماط وقت اليوم (مزاد الافتتاح، ركود الغداء، تقاطع الإغلاق)
- سلوك صانع السوق الذي يتغير مع الوقت
الخلاصة
يمثل DeepLOB تطبيقا نظيفا وحسن التعليل للتعلم العميق على البنية الدقيقة للسوق. بنيته ثلاثية الكتل — CNN للسمات المكانية، وinception للأنماط الزمنية متعددة المقاييس، وLSTM للتبعيات التسلسلية — تنطبق بشكل طبيعي على بنية بيانات دفتر الأوامر المحدودة.
الفكرة الأساسية ليست فقط أن نموذجا عميقا يمكنه مطابقة السمات المصممة يدويا أو التفوق عليها، بل أن التحيزات الاستقرائية للبنية — مرشحات ، وتوازي inception، والذاكرة التكرارية — تشفر معرفة حقيقية بالمجال حول كيفية عمل دفاتر الأوامر. هذه ليست شبكة عميقة عامة ألقي بها على بيانات مالية؛ إنها بنية مصممة حول الهندسة المحددة لدفتر الأوامر المحدودة. ودليلها الأكثر إقناعا ليس لوحة صدارة FI-2010 التي يرتاب بها المؤلفون أنفسهم، بل نتيجة التعلم بالنقل على عام من بيانات LSE.
بالنسبة للممارسين، يعد DeepLOB خط أساس قويا ولبنة بناء مفيدة. وبالنسبة للباحثين، فهو يبرهن أن تصميم البنية المدروس — وليس مجرد حجم النموذج — هو ما يقود الأداء على البيانات المالية المهيكلة. فقط تذكر أن تستشهد بالأرقام الحقيقية، وأن تراقب مخطط التسمية، وأن تعامل دقة التصنيف على أنها بعيدة كل البعد عن ربح التداول.
المراجع
-
Zhang, Z., Zohren, S., & Roberts, S. (2019). DeepLOB: Deep Convolutional Neural Networks for Limit Order Books. IEEE Transactions on Signal Processing, 67(11), 3001-3012. arXiv:1808.03668
-
Ntakaris, A., Magris, M., Kanniainen, J., Gabbouj, M., & Iosifidis, A. (2018). Benchmark Dataset for Mid-Price Forecasting of Limit Order Book Data with Machine Learning Methods. Journal of Forecasting, 37(8), 852-866. arXiv:1705.03233
-
Briola, A., Bartolucci, S., & Aste, T. (2024). Deep Limit Order Book Forecasting (LOBFrame). arXiv:2403.09267
-
Wallbridge, J. (2020). Transformers for Limit Order Books. arXiv:2003.00130
-
Cont, R., Kukanov, A., & Stoikov, S. (2014). The Price Impact of Order Book Events. Journal of Financial Econometrics, 12(1), 47-88.
-
Stoikov, S. (2018). The Micro-Price: A High-Frequency Estimator of Future Prices. Quantitative Finance, 18(12), 1959-1966.
-
Nagy, P., Frey, S., Li, K., Sarkar, B., Vyetrenko, S., Zohren, S., Calinescu, A., & Foerster, J. (2025). LOB-Bench: Benchmarking Generative AI for Finance — an Application to Limit Order Book Data. ICML 2025. arXiv:2502.09172
-
DeepLOB code (original in Keras/TensorFlow; the repository also provides a PyTorch port): github.com/zcakhaa/DeepLOB-Deep-Convolutional-Neural-Networks-for-Limit-Order-Books
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.