المراجحة الإحصائية وتداول الأزواج في أسواق العملات الرقمية: من التكامل المشترك إلى مرشح كالمان
في عام 1987، حققت مجموعة من الفيزيائيين في مورغان ستانلي 50 مليون دولار في عام واحد من خلال تداول أزواج الأسهم باستخدام خوارزمية لم يستطع أي منهم شرحها بالكامل لإدارة البنك. لم تعترض الإدارة. في عام 2026، يمكنك تشغيل نفس الفكرة على بورصات العملات الرقمية — مع العقود الآجلة الدائمة، وسوق يعمل 24/7، وسيولة كان سيحسده عليها Nunzio Tartaglia. لكن هناك تحذير: ما نجح مع أسهم فورد وجنرال موتورز في عصر ما قبل الإنترنت يتطلب تكييفاً جدياً لعالم يمكن فيه لـ BTC أن ينخفض 20% في ليلة واحدة، ويمكن لمعدل التمويل أن ينقلب في كتلة واحدة.
هذه المقالة هي تحليل شامل للمراجحة الإحصائية وتداول الأزواج في أسواق العملات الرقمية. من النظرية الرياضية (التكامل المشترك، عملية أورنشتاين-أولنبك، مرشح كالمان) إلى كود Python عملي يمكنك تشغيله على بيانات حقيقية. الأسلوب هندسي: نشرح المعادلات، نعرض الكود، ولا نخفي المزالق.
1. تاريخ موجز: من يسوعي إلى الكوانتز
وُلدت المراجحة الإحصائية بشكلها الحديث على مكتب التداول في مورغان ستانلي في منتصف الثمانينيات. Nunzio Tartaglia — كاهن يسوعي سابق حاصل على دكتوراه في الفيزياء — جمع فريقاً من الرياضيين والفيزيائيين وعلماء الحاسوب. الهدف: إيجاد أنماط في أسعار الأسهم لا يراها المتداولون التقليديون.
كانت الفكرة بسيطة بشكل مذهل. إذا كانت أسهم كوكا كولا وبيبسي تتحرك معاً تاريخياً (منطقي — فهما يبيعان نفس الماء المحلى بألوان مختلفة)، فإن انحراف أسعارهما هو شذوذ مؤقت. نشتري المتأخر، نبيع المتقدم، ننتظر التقارب، ونحقق الربح. استراتيجية محايدة للسوق: اتجاه السوق لا يهمنا.
ضم فريق Tartaglia أشخاصاً غيّروا لاحقاً وول ستريت بأكمله:
- David Shaw — أسس لاحقاً D.E. Shaw & Co.، أحد أكبر صناديق التحوط الكمية
- Peter Muller — أسس PDT Partners، مجموعة المراجحة الإحصائية الأسطورية داخل مورغان ستانلي
- Robert Frey — انتقل لاحقاً إلى Renaissance Technologies مع Jim Simons
عمل الفريق كمختبر أبحاث داخل بنك استثماري. كانت الأتمتة على أحدث طراز: مجموعات VAX تولّد الإشارات، والتنفيذ عبر المحطات الطرفية. في أفضل السنوات (1987-1988)، حققت الاستراتيجية عشرات الملايين. ثم جاءت سنتان متتاليتان من الخسائر، وفي 1989 أغلق مورغان ستانلي المكتب.
لكن الفكرة كانت قد انتشرت. نشر خريجو المجموعة مفهوم تداول الأزواج في أنحاء وول ستريت. نشر Gatev وGoetzmann وRouwenhorst الورقة الأكاديمية الكلاسيكية في 2006 — "Pairs Trading: Performance of a Relative-Value Arbitrage Rule" — مُظهرين أن استراتيجية بسيطة لتداول الأزواج حققت باستمرار عوائد سنوية تقارب 11% من 1962 إلى 2002 في الأسهم الأمريكية. كان هذا رداً مقنعاً على فرضية كفاءة السوق: قد يكون السوق ككل فعالاً، لكن أزواج أصول محددة تنحرف بشكل منهجي عن التوازن.
اليوم، المراجحة الإحصائية صناعة بمئات المليارات من الدولارات تحت الإدارة، وأسواق العملات الرقمية توفر أرضاً خصبة بشكل خاص: سيولة مجزأة، بنية تحتية غير ناضجة، تداول على مدار الساعة، وعقود آجلة دائمة بمعدلات تمويل — أداة غير موجودة في الأسواق التقليدية.
2. الأساس الرياضي: الارتباط فخ
لماذا لا يعمل الارتباط
لنبدأ بالخطأ الذي يرتكبه نصف المبتدئين في التداول الكمي: "BTC وETH مرتبطان بمعامل 0.85، إذاً يمكننا تداول الزوج." لا. لا يمكنك. بالتحديد، يمكنك — لكنك ستخسر المال.
الارتباط يقيس العلاقة الخطية بين عوائد أصلين. يمكن لأصلين أن يكونا مرتبطين تماماً، لكن أسعارهما تتباعد إلى الأبد. المثال الكلاسيكي: مسارات عشوائية بزيادات مرتبطة — تتباعد إلى ما لا نهاية رغم الارتباط العالي. ستفتح مركزاً تتوقع "التقارب" الذي لن يأتي أبداً.

التكامل المشترك: النهج الصحيح
التكامل المشترك خاصية لـسلاسل الأسعار، وليس العوائد. يُقال إن سلسلتين غير مستقرتين X(t) وY(t) متكاملتان تكاملاً مشتركاً إذا وُجد تركيب خطي:
S(t) = Y(t) - β · X(t)
يكون مستقراً — أي يعود إلى القيمة المتوسطة. يُسمى المعامل β نسبة التحوط (hedge ratio)، وS(t) يُسمى الفارق (spread).
الحدس: قد يصعد BTC وETH إلى القمر أو يهبطان إلى الهاوية، لكن إذا كان فرقهما (بالتحجيم الصحيح) يتذبذب حول مستوى ثابت — فهذا تكامل مشترك. وهذا بالضبط ما نحتاجه للتداول.
اختبار إنغل-غرانجر (1987)
إجراء من خطوتين حصل بسببه Robert Engle وClive Granger على جائزة نوبل في الاقتصاد عام 2003:
الخطوة 1. انحدار OLS: Y(t) = α + β · X(t) + ε(t). نحصل على نسبة التحوط β والبواقي ε(t).
الخطوة 2. اختبار ADF (ديكي-فولر المعزز) على البواقي ε(t). الفرضية الصفرية: ε(t) له جذر وحدة (غير مستقر). إذا كانت p-value < 0.05، نرفض H₀ — السلسلتان متكاملتان تكاملاً مشتركاً.
مهم: لاختبار التكامل المشترك، لا يمكن استخدام القيم الحرجة القياسية لـ ADF. قيم إنغل-غرانجر الحرجة مشتقة عبر محاكاة مونت كارلو وتأخذ في الاعتبار التبعية بين المتغيرات في انحدار OLS. في statsmodels، هذا مُنفذ بشكل صحيح في دالة coint().
اختبار يوهانسن
لأنظمة أكثر من متغيرين (مثل BTC وETH وSOL معاً)، يُستخدم اختبار يوهانسن. يجد جميع علاقات التكامل المشترك في النظام ويسمح ببناء محافظ من أصول متعددة. يعتمد الاختبار على نموذج VAR (الانحدار الذاتي المتجهي) ويستخدم معيارين: إحصائية الأثر وإحصائية القيمة الذاتية القصوى.
عملية أورنشتاين-أولنبك
إذا كان الفارق متكاملاً تكاملاً مشتركاً، يمكن نمذجة ديناميكياته كعملية أورنشتاين-أولنبك (OU):
dS(t) = θ(μ - S(t))dt + σ dW(t)
حيث:
- θ — سرعة العودة إلى المتوسط
- μ — المستوى المتوسط طويل الأجل
- σ — التقلب
- W(t) — عملية فينر (الحركة البراونية)
من معاملات عملية OU يُحسب نصف عمر العودة إلى المتوسط:
t½ = ln(2) / θ
نصف العمر مقياس بالغ الأهمية. إذا كان t½ = 5 أيام، يعود الفارق إلى المتوسط في حوالي 5 أيام. إذا كان t½ = 200 يوم، ستبقى في المركز نصف عام في انتظار التقارب. لاستراتيجيات العملات الرقمية، نصف العمر الأمثل هو 1-30 يوماً. أقصر — سريع جداً، العمولات تأكل الربح. أطول — بطيء جداً، خطر التحول الهيكلي.
عملياً، يُقدر θ عبر الانحدار:
ΔS(t) = a + b · S(t-1) + ε(t)
حيث θ = -b، وt½ = -ln(2) / b.
تطبيع Z-score
لتوليد إشارات التداول، يُطبّع الفارق:
z(t) = (S(t) - μ̂) / σ̂
حيث μ̂ وσ̂ هما المتوسط المتحرك والانحراف المعياري للفارق. يُظهر Z-score كم انحرافاً معيارياً ابتعد الفارق عن المتوسط. عتبات الدخول النموذجية: |z| > 2.0؛ الخروج: |z| < 0.5.
3. اختيار الأزواج في سوق العملات الرقمية
BTC-ETH: الكلاسيكي الذي (أحياناً) يعمل
BTC وETH هما الزوج الأكثر وضوحاً والأكثر سيولة. ارتباط العوائد مستقر فوق 0.7. لكن التكامل المشترك مسألة مختلفة. إنه يظهر ويختفي:
- في الأسواق الجانبية لعام 2023، كان BTC/ETH متكاملاً تكاملاً مشتركاً بشكل موثوق (p-value < 0.01)
- خلال فترة التباعد 2024-2025 (ارتفع BTC بسبب ETF، تأخر ETH)، انهار التكامل المشترك
- بحلول أوائل 2026، بعد إطلاق ETH ETF واستعادة نسبة ETH/BTC، استقر التكامل المشترك مجدداً
الخلاصة: يجب مراقبة التكامل المشترك باستمرار. تُعاد حسابات معاملات الانحدار على نافذة متحركة، وتتوقف الاستراتيجية تلقائياً إذا تجاوزت p-value اختبار ADF العتبة.
أزواج القطاعات
سوق العملات الرقمية مقسم بشكل ملائم حسب القطاعات، والأزواج داخل القطاع غالباً تُظهر تكاملاً مشتركاً مستقراً:
| القطاع | أمثلة الأزواج | الخصائص |
|---|---|---|
| سلاسل كتل L1 | SOL/AVAX, NEAR/APT | سيولة عالية، نصف عمر 3-10 أيام |
| بروتوكولات DeFi | AAVE/COMP, UNI/SUSHI | سيولة متوسطة، نصف عمر 5-15 يوماً |
| حلول L2 | ARB/OP, MATIC/MANTA | تقلب عالٍ في الفارق |
| عملات ميم | DOGE/SHIB | غير متوقع لكن ممتع (غير مُوصى به) |
أفضل الأزواج للمراجحة الإحصائية تمتلك ثلاث خصائص: (1) تكامل مشترك مستقر على نافذة تاريخية > 6 أشهر، (2) سيولة كافية — حجم يومي > 10 ملايين دولار لكل أصل، (3) نصف عمر مناسب — من 1 إلى 30 يوماً.
الفوري مقابل العقود الآجلة الدائمة (الأساس)
فئة منفصلة من "الأزواج" هي نفس الأصل في السوق الفوري وسوق العقود الآجلة. الفرق بين سعر العقد الآجل الدائم والسعر الفوري (الأساس) مستقر بحكم التعريف: آلية معدل التمويل تضغطه نحو الصفر. هذا يجعل تداول الأساس أحد أكثر أشكال المراجحة الإحصائية موثوقية في العملات الرقمية.
4. ثلاثة أساليب للتداول
أ. تداول الأساس: الفوري-الآجل وعوائد معدل التمويل
الشكل "الأنقى" للمراجحة الإحصائية في العملات الرقمية. الآلية:
- شراء الأصل في السوق الفوري (مثلاً، 1 BTC)
- فتح مركز بيع على العقد الآجل الدائم (1 BTC)
- إذا كان معدل التمويل إيجابياً (المراكز الطويلة تدفع للقصيرة) — تتلقى تمويلاً كل 8 ساعات
بمعدل تمويل متوسط 0.01% كل 8 ساعات، هذا حوالي 0.03% يومياً أو حوالي 11% سنوياً بدون مخاطر اتجاهية. في الأسواق الصاعدة، يمكن أن يرتفع معدل التمويل إلى 0.05-0.1% كل 8 ساعات — وهذا يعني 55-110% سنوياً.
المخاطر: تمويل سلبي (انعكاس السوق)، تصفية مركز البيع عند ارتفاع حاد في السعر (يحتاج هامش احتياطي)، ورسوم البورصة.
حتى مارس 2026، استقر معدل تمويل BTC المتوسط عند حوالي 0.015% لكل 8 ساعات — أعلى بنحو 50% من مستويات 2024.
ب. المراجحة بين البورصات
نفس العملة، بورصتان، أسعار مختلفة. السبب — اختلافات في السيولة وتكوين المتداولين وسرعة تحديث دفاتر الأوامر.
مثال: BTC على بينانس: 87,175. الفارق: $25 (0.029%).
الاستراتيجية: شراء على بينانس، بيع على بايبت. المشكلة: بحلول وقت تنفيذ كلا الأمرين، قد يكون الفارق قد اختفى. الحل: الاحتفاظ بأرصدة على كلتا البورصتين والتنفيذ المتزامن.
الرسوم النموذجية:
- بينانس: ~0.075% taker (مع خصم ~0.05%)
- بايبت: ~0.03% taker (VIP)
- الإجمالي: ~0.08%
هذا يعني أن الفارق يجب أن يتجاوز 0.08% لتكون الاستراتيجية مربحة. في 2026، تظهر مثل هذه الفوارق:
- على الأزواج الأقل سيولة (العملات البديلة) — بانتظام
- على الأزواج الرئيسية (BTC, ETH) — فقط في لحظات التقلب العالي
- بين CEX وDEX — أكثر تكراراً، لكن مع مخاطر MEV والانزلاق
بدون التموضع المشترك (co-location)، تأخير API يتراوح بين 10-100 مللي ثانية. مع شبكات محسنة — حوالي 1 مللي ثانية. معظم المتداولين الأفراد يعملون في نطاق 100-500 مللي ثانية، وهو كافٍ للعديد من استراتيجيات المراجحة لكنه غير كافٍ لمنافسة المؤسسات.
ج. تداول الأزواج بالرافعة المالية
تداول أزواج كلاسيكي على أصلين مختلفين باستخدام الرافعة المالية. هذه الأكثر تعقيداً من الاستراتيجيات الثلاث — والأكثر ربحية محتملة.
الآلية باستخدام زوج SOL/AVAX كمثال:
- حساب نسبة التحوط β (مثلاً، β = 1.3)
- عندما z-score > +2: بيع SOL، شراء AVAX × β
- عندما z-score < -2: شراء SOL، بيع AVAX × β
- الخروج: |z-score| < 0.5 أو انتهاء المهلة (مثلاً، 30 يوماً)
برافعة 3x على كل ساق ومتوسط عودة فارق 2σ → 3σ:
- العائد المستهدف لكل صفقة: ~3-6%
- المعدل: 2-4 صفقات شهرياً لكل زوج
- العائد السنوي المتوقع: 30-60% (قبل العمولات والانزلاق)
المخاطرة الرئيسية: يمكن أن ينهار الارتباط في أسوأ لحظة (عادةً أثناء انهيار السوق). المزيد في القسم 8.
5. مرشح كالمان لنسبة تحوط تكيفية
لماذا نسبة التحوط الثابتة مشكلة
النهج الكلاسيكي: تقدير β عبر OLS على نافذة تاريخية وتثبيتها. المشكلة: β تتغير مع الوقت. سوق العملات الرقمية غير مستقر بشكل خاص — تحولات السرديات (صيف DeFi → حماس NFT → رموز AI) تغير العلاقات الأساسية بين الأصول.
استخدام OLS المتحرك (الانحدار المتحرك) حل نصفي. يجب اختيار طول النافذة: قصيرة جداً — ضوضاء، طويلة جداً — تأخر. مرشح كالمان يحل هذه المشكلة بأناقة.

نموذج فضاء الحالة
نمثل العلاقة بين Y(t) وX(t) كنموذج خطي بمعاملات متغيرة مع الزمن:
معادلة الملاحظة:
Y(t) = α(t) + β(t) · X(t) + ε(t), ε(t) ~ N(0, R)
معادلة الحالة:
[α(t+1), β(t+1)]ᵀ = [α(t), β(t)]ᵀ + w(t), w(t) ~ N(0, Q)
المعاملات α(t) وβ(t) تُعامل كـحالة مخفية تنجرف ببطء (مسار عشوائي). مرشح كالمان يقدر هذه الحالة المخفية بشكل أمثل من الملاحظات المشوشة.
- R (ضوضاء الملاحظة) — تباين ضوضاء الملاحظة. كلما زاد R، كان رد فعل المرشح أبطأ تجاه البيانات الجديدة.
- Q (ضوضاء الحالة) — مصفوفة التغاير لضوضاء الحالة. كلما زاد Q، كان تكيف المرشح أسرع.
نسبة Q/R تحدد "نعومة" المرشح — مشابهة لاختيار طول النافذة في OLS المتحرك، لكن بدون اقتطاع صارم للبيانات.
المزايا مقارنة بـ OLS المتحرك
الفوارق المحسوبة بمرشح كالمان أكثر استقراراً وعودة إلى المتوسط بشكل ملحوظ من فوارق الانحدار المتحرك. يستخدم مرشح كالمان جميع الملاحظات السابقة بأوزان تتناقص أسياً، بدلاً من اقتطاع البيانات عند طول نافذة ثابت. بالإضافة إلى ذلك، لا يتطلب مرشح كالمان ضبط معامل "طول النافذة" — بدلاً من ذلك، يُعاير تلقائياً التوازن بين القصور والتكيف عبر مصفوفتي Q وR.
التنفيذ باستخدام filterpy
import numpy as np
from filterpy.kalman import KalmanFilter
def create_kalman_filter(
delta: float = 1e-4,
obs_noise: float = 1.0
) -> KalmanFilter:
"""
ينشئ مرشح كالمان لتقدير نسبة التحوط التكيفية.
delta: تباين ضوضاء الحالة (Q = delta * I).
delta أكبر → تكيف أسرع، ضوضاء أكثر.
obs_noise: تباين ضوضاء الملاحظة (R).
"""
kf = KalmanFilter(dim_x=2, dim_z=1)
kf.x = np.zeros((2, 1))
kf.F = np.eye(2)
kf.P = np.eye(2) * 1000
kf.Q = np.eye(2) * delta
kf.R = np.array([[obs_noise]])
return kf
def estimate_hedge_ratio(
prices_y: np.ndarray,
prices_x: np.ndarray,
delta: float = 1e-4,
obs_noise: float = 1.0
) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
"""
تقدير نسبة التحوط التكيفية بمرشح كالمان.
الإرجاع:
alphas: مصفوفة القاطع (α)
betas: مصفوفة نسب التحوط (β)
spreads: مصفوفة الفوارق Y - α - β*X
"""
n = len(prices_y)
kf = create_kalman_filter(delta, obs_noise)
alphas = np.zeros(n)
betas = np.zeros(n)
spreads = np.zeros(n)
for t in range(n):
kf.H = np.array([[1.0, prices_x[t]]])
kf.predict()
kf.update(np.array([[prices_y[t]]]))
alphas[t] = kf.x[0, 0]
betas[t] = kf.x[1, 0]
spreads[t] = prices_y[t] - kf.x[0, 0] - kf.x[1, 0] * prices_x[t]
return alphas, betas, spreads
معامل delta هو المفتاح. لأزواج العملات الرقمية ذات التقلب العالي (عملات ميم، عملات بديلة صغيرة)، استخدم delta = 1e-3. للأزواج المستقرة (BTC/ETH, SOL/AVAX) — delta = 1e-5.
6. إشارات الدخول والخروج
عتبات Z-Score
منطق الإشارات الأساسي:
def generate_signals(
spreads: np.ndarray,
lookback: int = 60,
entry_z: float = 2.0,
exit_z: float = 0.5,
stop_z: float = 4.0
) -> np.ndarray:
"""
توليد إشارات التداول بناءً على z-score الفارق.
إرجاع مصفوفة: +1 (شراء الفارق)، -1 (بيع الفارق)، 0 (خارج المركز)
"""
signals = np.zeros(len(spreads))
position = 0
for t in range(lookback, len(spreads)):
window = spreads[t - lookback:t]
mu = np.mean(window)
sigma = np.std(window)
if sigma < 1e-10:
continue
z = (spreads[t] - mu) / sigma
if position == 0:
if z > entry_z:
position = -1 # بيع الفارق (بيع Y، شراء X)
elif z < -entry_z:
position = 1 # شراء الفارق (شراء Y، بيع X)
else:
if position == 1 and z > -exit_z:
position = 0
elif position == -1 and z < exit_z:
position = 0
elif abs(z) > stop_z:
position = 0
signals[t] = position
return signals
مرشحات الزخم
يمكن تحسين إشارة العودة إلى المتوسط النقية بالمرشحات:
-
مرشح الزخم: لا تفتح مركزاً إذا كان الفارق يستمر في التباعد. انتظر انعكاس الفارق قبل الدخول. تقنياً: z-score تجاوز العتبة، لكن التغير الحالي في الفارق يتجه بالفعل نحو المتوسط.
-
مرشح التقلب: زيادة عتبة الدخول في فترات التقلب العالي. عندما يصاب السوق بالذعر، يمكن أن يبقى z-score فوق 3σ لأسابيع.
-
مرشح التكامل المشترك: قبل كل صفقة، التحقق من أن التكامل المشترك لا يزال قائماً (اختبار ADF متحرك). إذا كانت p-value > 0.1 — إيقاف التداول مؤقتاً.
خروج مبني على الزمن
إذا كان المركز مفتوحاً لأكثر من 2× نصف العمر والفارق لم يعد — الإغلاق إجبارياً. إذا لم يعد الفارق خلال 2× الوقت المتوقع، فمن المرجح أن التكامل المشترك قد انهار ولا فائدة من الانتظار.
7. الاختبار الرجعي: الطريقة الصحيحة
تحليل المشي للأمام
الاختبار الرجعي القياسي (التدريب على كل البيانات → الاختبار على كل البيانات) عديم الفائدة للمراجحة الإحصائية. معاملات الانحدار مُلائمة بشكل مفرط للبيانات، والنتيجة ستكون متفائلة.
نهج المشي للأمام:
- تقسيم البيانات إلى فترات: [تدريب₁ → اختبار₁] → [تدريب₂ → اختبار₂] → ...
- في كل فترة تدريب: تقدير التكامل المشترك، حساب نسبة التحوط، اختيار عتبات z-score
- في فترة الاختبار: التداول بمعاملات ثابتة
- دمج جميع فترات الاختبار للتقييم النهائي
الإعداد النموذجي للعملات الرقمية: تدريب = 180 يوماً، اختبار = 30 يوماً، خطوة = 30 يوماً.

نموذج تكاليف المعاملات
للعملات الرقمية يجب مراعاة:
| المكون | القيمة النموذجية | ملاحظة |
|---|---|---|
| رسوم صانع السوق | 0.02% | أوامر محددة |
| رسوم آخذ السوق | 0.05-0.075% | أوامر سوقية |
| الانزلاق | 0.01-0.1% | يعتمد على السيولة |
| معدل التمويل | ±0.01%/8ساعات | لمراكز العقود الآجلة |
| الفارق (عرض-طلب) | 0.01-0.05% | على البورصات الكبرى |
الدخول والخروج من مركز زوجي يتضمن 4 صفقات (2 ساقين × دخول + خروج). إجمالي التكاليف: ~0.3-0.5% لكل رحلة ذهاب وعودة. هذا يعني أن متوسط الربح لكل صفقة يجب أن يتجاوز 0.5% للحصول على قيمة متوقعة إيجابية.
نموذج الانزلاق
نموذج خطي: slippage = k × (order_size / ADV)، حيث ADV هو متوسط الحجم اليومي. للعملات الرقمية، k ≈ 0.1 لأكبر 10 عملات وk ≈ 0.3-0.5 للعملات البديلة.
نموذج أكثر واقعية هو تأثير الجذر التربيعي: slippage = k × sqrt(order_size / ADV). يعكس البنية المجهرية الحقيقية للسوق بشكل أفضل.
المقاييس
def calculate_metrics(returns: np.ndarray, rf: float = 0.04) -> dict:
"""
حساب المقاييس الرئيسية للاستراتيجية.
rf: معدل خالٍ من المخاطر (سنوي)
"""
daily_rf = rf / 365
excess = returns - daily_rf
ann_return = np.mean(returns) * 365
ann_vol = np.std(returns) * np.sqrt(365)
sharpe = (ann_return - rf) / ann_vol if ann_vol > 0 else 0
cumulative = np.cumprod(1 + returns)
running_max = np.maximum.accumulate(cumulative)
drawdowns = (cumulative - running_max) / running_max
max_dd = np.min(drawdowns)
calmar = ann_return / abs(max_dd) if max_dd != 0 else 0
win_rate = np.mean(returns > 0) if len(returns) > 0 else 0
gains = returns[returns > 0].sum()
losses = abs(returns[returns < 0].sum())
profit_factor = gains / losses if losses > 0 else float('inf')
return {
'annual_return': f'{ann_return:.1%}',
'annual_volatility': f'{ann_vol:.1%}',
'sharpe_ratio': f'{sharpe:.2f}',
'max_drawdown': f'{max_dd:.1%}',
'calmar_ratio': f'{calmar:.2f}',
'win_rate': f'{win_rate:.1%}',
'profit_factor': f'{profit_factor:.2f}',
}
المعايير المرجعية للمراجحة الإحصائية في العملات الرقمية:
- نسبة شارب > 1.5 — استراتيجية جيدة
- أقصى تراجع < 15% — مخاطر مقبولة
- نسبة كالمار > 2.0 — نسبة عائد/تراجع ممتازة
- عامل الربح > 1.5 — ميزة مستدامة
8. مشاكل العالم الحقيقي
الانزلاق والسيولة
في الاختبار الرجعي، تدخل فوراً بسعر الوسط. في الواقع — لا. على العملات البديلة بحجم يومي 5 ملايين دولار، يمكن لأمر بقيمة 50 ألف دولار أن يحرك السعر 0.2-0.5%. لاستراتيجية الأزواج، هذا انزلاق مضاعف (ساقان)، ويمكن أن يلتهم كل الربح.
الحل: استخدام أوامر محددة (صانع وليس آخذ)، تقسيم الأوامر إلى أجزاء (TWAP/VWAP)، وتحديد حجم المركز بصرامة نسبة إلى ADV (حد أقصى 1-2% من الحجم اليومي).
مخاطر معدل التمويل
في تداول الأساس، تتلقى معدل التمويل، لكنه يمكن أن يصبح سلبياً. في السوق الهابطة في ديسمبر 2022، كان معدل تمويل BTC -0.02% كل 8 ساعات — إذا كنت تحتفظ بمركز "شراء فوري + بيع دائم"، كنت تدفع 60 دولاراً يومياً لكل 100 ألف دولار من المركز.
الحماية: مراقبة معدل التمويل في الوقت الحقيقي وإغلاق المركز عند انعكاس المعدل. نهج أكثر تقدماً هو مراجحة معدل التمويل بين البورصات (شراء على البورصة ذات التمويل المنخفض، بيع على البورصة ذات التمويل العالي).
انهيار الارتباطات في الأزمات
مارس 2020، مايو 2021، نوفمبر 2022، أغسطس 2024 — في كل انهيار للعملات الرقمية، تنكسر الارتباطات. بالتحديد، الارتباطات تتعزز (كل شيء يهبط معاً)، لكن التكامل المشترك ينهار — يمكن للفارق أن يطير إلى 10σ ولا يعود.
هذا هو كعب أخيل تداول الأزواج. الاستراتيجية تكسب مبالغ صغيرة بثبات، ثم تخسر مبلغاً كبيراً في يوم واحد. النمط الكلاسيكي "التقاط العملات المعدنية أمام محدلة البخار".
الحماية:
- وقف خسارة صارم: إغلاق المركز عند z-score > 4σ
- حدود الرافعة: حد أقصى 2-3x على كل ساق
- مرشح VIX/التقلب: تقليل حجم المركز عند ارتفاع التقلب الضمني
- التنويع: تداول 10-20 زوجاً في وقت واحد، لا تراهن كل شيء على واحد
متطلبات رأس المال
للمراجحة الإحصائية الجادة في العملات الرقمية:
- تداول الأساس: من 50 ألف دولار (زوج واحد، بورصة واحدة)
- المراجحة بين البورصات: من 100 ألف دولار (أرصدة في بورصتين)
- محفظة تداول أزواج (10 أزواج): من 200 ألف دولار
- المستوى المؤسسي: من مليون دولار
بمبالغ أقل، العمولات وأحجام المراكز الدنيا تجعل الاستراتيجية غير فعالة.
9. تنفيذ شامل بـ Python
جلب البيانات
import ccxt
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
def fetch_ohlcv(
exchange_id: str,
symbol: str,
timeframe: str = '1h',
days: int = 365
) -> pd.DataFrame:
"""جلب بيانات OHLCV عبر ccxt."""
exchange = getattr(ccxt, exchange_id)({
'enableRateLimit': True,
})
since = int((datetime.now() - timedelta(days=days)).timestamp() * 1000)
all_candles = []
while True:
candles = exchange.fetch_ohlcv(
symbol, timeframe, since=since, limit=1000
)
if not candles:
break
all_candles.extend(candles)
since = candles[-1][0] + 1
if len(candles) < 1000:
break
df = pd.DataFrame(
all_candles,
columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
df.set_index('timestamp', inplace=True)
return df
sol = fetch_ohlcv('binance', 'SOL/USDT', '1h', 365)
avax = fetch_ohlcv('binance', 'AVAX/USDT', '1h', 365)
prices = pd.DataFrame({
'SOL': sol['close'],
'AVAX': avax['close']
}).dropna()
اختبار التكامل المشترك
from statsmodels.tsa.stattools import coint, adfuller
from statsmodels.regression.linear_model import OLS
from statsmodels.tools import add_constant
def test_cointegration(y: np.ndarray, x: np.ndarray) -> dict:
"""
اختبار تكامل مشترك كامل مع تشخيص.
"""
score, pvalue, crit_values = coint(y, x)
x_const = add_constant(x)
model = OLS(y, x_const).fit()
alpha, beta = model.params
spread = y - alpha - beta * x
adf_stat, adf_pvalue, _, _, adf_crit, _ = adfuller(spread, maxlag=20)
spread_lag = spread[:-1]
spread_diff = np.diff(spread)
spread_lag_const = add_constant(spread_lag)
hl_model = OLS(spread_diff, spread_lag_const).fit()
theta = -hl_model.params[1]
half_life = np.log(2) / theta if theta > 0 else np.inf
return {
'coint_pvalue': pvalue,
'cointegrated': pvalue < 0.05,
'hedge_ratio': beta,
'intercept': alpha,
'adf_statistic': adf_stat,
'adf_pvalue': adf_pvalue,
'half_life_hours': half_life,
'half_life_days': half_life / 24,
'spread_mean': np.mean(spread),
'spread_std': np.std(spread),
}
result = test_cointegration(
prices['SOL'].values,
prices['AVAX'].values
)
print(f"تكامل مشترك: {result['cointegrated']} "
f"(p-value: {result['coint_pvalue']:.4f})")
print(f"نسبة التحوط: {result['hedge_ratio']:.4f}")
print(f"نصف العمر: {result['half_life_days']:.1f} أيام")
مرشح كالمان + مختبر رجعي
from filterpy.kalman import KalmanFilter
class PairsBacktester:
"""
مختبر رجعي بنظام المشي للأمام لتداول الأزواج
مع مرشح كالمان.
"""
def __init__(
self,
prices_y: np.ndarray,
prices_x: np.ndarray,
kalman_delta: float = 1e-4,
obs_noise: float = 1.0,
entry_z: float = 2.0,
exit_z: float = 0.5,
stop_z: float = 4.0,
lookback: int = 60,
fee_rate: float = 0.001, # 0.1% ذهاب وعودة لكل ساق
slippage_rate: float = 0.0005, # 0.05% انزلاق لكل ساق
):
self.prices_y = prices_y
self.prices_x = prices_x
self.n = len(prices_y)
self.kalman_delta = kalman_delta
self.obs_noise = obs_noise
self.entry_z = entry_z
self.exit_z = exit_z
self.stop_z = stop_z
self.lookback = lookback
self.fee_rate = fee_rate
self.slippage_rate = slippage_rate
def run(self) -> pd.DataFrame:
"""تشغيل الاختبار الرجعي. يُرجع DataFrame بالنتائج."""
kf = KalmanFilter(dim_x=2, dim_z=1)
kf.x = np.zeros((2, 1))
kf.F = np.eye(2)
kf.P = np.eye(2) * 1000
kf.Q = np.eye(2) * self.kalman_delta
kf.R = np.array([[self.obs_noise]])
alphas = np.zeros(self.n)
betas = np.zeros(self.n)
spreads = np.zeros(self.n)
for t in range(self.n):
kf.H = np.array([[1.0, self.prices_x[t]]])
kf.predict()
kf.update(np.array([[self.prices_y[t]]]))
alphas[t] = kf.x[0, 0]
betas[t] = kf.x[1, 0]
spreads[t] = (
self.prices_y[t] - kf.x[0, 0]
- kf.x[1, 0] * self.prices_x[t]
)
positions = np.zeros(self.n)
z_scores = np.zeros(self.n)
position = 0
for t in range(self.lookback, self.n):
window = spreads[t - self.lookback:t]
mu = np.mean(window)
sigma = np.std(window)
if sigma < 1e-10:
continue
z = (spreads[t] - mu) / sigma
z_scores[t] = z
if position == 0:
if z > self.entry_z:
position = -1
elif z < -self.entry_z:
position = 1
else:
if position == 1 and z > -self.exit_z:
position = 0
elif position == -1 and z < self.exit_z:
position = 0
elif abs(z) > self.stop_z:
position = 0
positions[t] = position
spread_returns = np.diff(spreads) / np.abs(
spreads[:-1] + 1e-10
)
pnl = np.zeros(self.n)
for t in range(1, self.n):
if positions[t - 1] != 0:
raw_return = positions[t - 1] * spread_returns[t - 1]
pnl[t] = raw_return
if positions[t] != positions[t - 1]:
total_cost = 2 * (self.fee_rate + self.slippage_rate)
pnl[t] -= total_cost
return pd.DataFrame({
'price_y': self.prices_y,
'price_x': self.prices_x,
'alpha': alphas,
'beta': betas,
'spread': spreads,
'z_score': z_scores,
'position': positions,
'pnl': pnl,
'cumulative_pnl': np.cumsum(pnl),
})
bt = PairsBacktester(
prices_y=prices['SOL'].values,
prices_x=prices['AVAX'].values,
kalman_delta=1e-4,
entry_z=2.0,
exit_z=0.5,
stop_z=4.0,
lookback=60,
fee_rate=0.001,
slippage_rate=0.0005,
)
results = bt.run()
daily_pnl = results['pnl'].resample('D').sum() if hasattr(
results.index, 'freq'
) else results['pnl']
metrics = calculate_metrics(daily_pnl.values)
for k, v in metrics.items():
print(f'{k}: {v}')
هيكل التداول الحي
import ccxt
import asyncio
import logging
logger = logging.getLogger(__name__)
class LivePairsTrader:
"""
هيكل أساسي لتداول الأزواج الحي.
للإنتاج: إضافة منطق إعادة المحاولة، المراقبة،
التنبيهات، تسوية الأرصدة.
"""
def __init__(
self,
exchange_id: str,
symbol_y: str,
symbol_x: str,
api_key: str,
secret: str,
position_size_usd: float = 1000.0,
entry_z: float = 2.0,
exit_z: float = 0.5,
):
self.exchange = getattr(ccxt, exchange_id)({
'apiKey': api_key,
'secret': secret,
'enableRateLimit': True,
})
self.symbol_y = symbol_y
self.symbol_x = symbol_x
self.position_size = position_size_usd
self.entry_z = entry_z
self.exit_z = exit_z
self.position = 0 # +1, -1, 0
self.kf = create_kalman_filter(delta=1e-4)
self.spread_history = []
async def update(self):
"""دورة تحديث واحدة."""
ticker_y = self.exchange.fetch_ticker(self.symbol_y)
ticker_x = self.exchange.fetch_ticker(self.symbol_x)
price_y = ticker_y['last']
price_x = ticker_x['last']
self.kf.H = np.array([[1.0, price_x]])
self.kf.predict()
self.kf.update(np.array([[price_y]]))
alpha = self.kf.x[0, 0]
beta = self.kf.x[1, 0]
spread = price_y - alpha - beta * price_x
self.spread_history.append(spread)
if len(self.spread_history) < 60:
logger.info(f"Warming up: {len(self.spread_history)}/60")
return
window = np.array(self.spread_history[-60:])
z = (spread - np.mean(window)) / np.std(window)
logger.info(
f"β={beta:.4f} spread={spread:.4f} z={z:.2f} "
f"pos={self.position}"
)
new_position = self.position
if self.position == 0:
if z > self.entry_z:
new_position = -1
elif z < -self.entry_z:
new_position = 1
else:
if self.position == 1 and z > -self.exit_z:
new_position = 0
elif self.position == -1 and z < self.exit_z:
new_position = 0
if new_position != self.position:
await self._execute_trade(
new_position, price_y, price_x, beta
)
self.position = new_position
async def _execute_trade(
self, target: int, price_y: float, price_x: float,
beta: float
):
"""تنفيذ صفقة زوجية."""
if target == 0:
logger.info("Closing position")
elif target == 1:
size_y = self.position_size / price_y
size_x = (self.position_size * beta) / price_x
logger.info(
f"Long spread: buy {size_y:.4f} {self.symbol_y}, "
f"sell {size_x:.4f} {self.symbol_x}"
)
elif target == -1:
size_y = self.position_size / price_y
size_x = (self.position_size * beta) / price_x
logger.info(
f"Short spread: sell {size_y:.4f} {self.symbol_y}, "
f"buy {size_x:.4f} {self.symbol_x}"
)
async def run_loop(self, interval_seconds: int = 60):
"""الحلقة الرئيسية."""
logger.info(
f"Starting live trading: "
f"{self.symbol_y}/{self.symbol_x}"
)
while True:
try:
await self.update()
except Exception as e:
logger.error(f"Error in update: {e}")
await asyncio.sleep(interval_seconds)
بدلاً من الخاتمة
المراجحة الإحصائية ليست الكأس المقدسة. إنها حرفة. بين "أعرف ما هو التكامل المشترك" و"لدي استراتيجية تعمل بثبات" تقع هوة من التفاصيل الهندسية: معالجة البيانات الصحيحة، الاختبار الرجعي الصحيح بنظام المشي للأمام، نموذج انزلاق واقعي، المراقبة في الوقت الحقيقي.
أسواق العملات الرقمية لا تزال تقدم فرصاً للمراجحة الإحصائية أكثر من الأسواق التقليدية — السيولة المجزأة، والبنية التحتية غير الناضجة للسوق، والأدوات الفريدة مثل العقود الآجلة الدائمة بمعدلات التمويل تخلق عدم كفاءة تم تحكيمها إلى الصفر منذ فترة طويلة في بورصة نيويورك.
لكن النافذة تُغلق. اللاعبون المؤسسيون يدخلون أسواق العملات الرقمية، ورأس مال المراجحة ينمو (وفقاً للتقديرات، نما حجم رأس مال المراجحة في بورصات العملات الرقمية بنسبة 215% في 2025)، والهوامش تنضغط. إذا كنت تنوي القيام بالمراجحة الإحصائية في العملات الرقمية — من الأفضل أن تبدأ الآن.
كل الكود في هذه المقالة متاح كنقطة انطلاق. لا تشغله في الإنتاج بدون اختبار جدي. وتذكر: الاستراتيجية الوحيدة المضمونة العمل هي إدارة المخاطر.
الأوراق الأكاديمية الرئيسية:
- Engle, R.F. & Granger, C.W.J. (1987). "Co-Integration and Error Correction: Representation, Estimation, and Testing". Econometrica, 55(2), 251-276.
- Gatev, E., Goetzmann, W.N. & Rouwenhorst, K.G. (2006). "Pairs Trading: Performance of a Relative-Value Arbitrage Rule". The Review of Financial Studies, 19(3), 797-827.
- Vidyamurthy, G. (2004). Pairs Trading: Quantitative Methods and Analysis. Wiley.
- Avellaneda, M. & Lee, J.H. (2010). "Statistical Arbitrage in the US Equities Market". Quantitative Finance, 10(7), 761-782.
- Frontiers (2026). "Deep learning-based pairs trading: real-time forecasting of co-integrated cryptocurrency pairs". Frontiers in Applied Mathematics and Statistics.
مكتبات مفيدة:
- statsmodels — التكامل المشترك، ADF، OLS
- filterpy — مرشح كالمان
- ccxt — API موحد لأكثر من 100 بورصة
- arbitragelab — مكتبة متخصصة لتداول الأزواج (OU، Kalman، copulas)
MarketMaker.cc Team
البحوث والاستراتيجيات الكمية