Strasmore Research

شرح تداول الأزواج والتكامل المشترك

افهم لماذا لا يكفي الارتباط في تداول الأزواج، وابنِ نسبة التحوط والفارق ودرجة z يدوياً باستخدام أسعار إغلاق فعلية، مع أمثلة تكشف أخطاء الاستراتيجية.

يرتبط تداول الأزواج والتكامل المشترك ارتباطاً وثيقاً: تقوم الصفقة على فجوة بين سعري سهمين تعود باستمرار إلى مستوى مستقر، بينما يصف التكامل المشترك الخاصية الإحصائية التي تؤكد وجود مثل هذه الفجوة أصلاً. أما الارتباط فيقيس أمراً مختلفاً. فقد يسجل سهمان ارتباطاً مرتفعاً ثم يواصلان الابتعاد عن بعضهما إلى الأبد، كما قد يحافظ سهمان لا تتطابق تحركاتهما اليومية إلا قليلاً على فجوة مستقرة لسنوات. تبني هذه الصفحة نسبة التحوط والفارق ودرجة z يدوياً، وتقيس هذه العناصر الثلاثة باستخدام أسعار إغلاق فعلية، ثم تخصص مساحة مماثلة لشرح كيفية فشل هذا البناء.

ما التكامل المشترك في تداول الأزواج؟

يقيس الارتباط مدى تقارب التحركات اليومية المئوية لسهمين. وتتراوح قيمته بين ‎-1 و‎+1؛ وتعني القيمة ‎+1 أن السهمين ارتفعا وانخفضا معاً في كل جلسة ضمن العينة. لكنه لا يخبرك بشيء عن المسافة بين سعريهما.

أما التكامل المشترك فيتعلق بهذه المسافة. اطرح من سعر السهم B مضاعفاً ثابتاً لسعر السهم A، ثم راقب المتبقي. إذا بقيت هذه السلسلة المتبقية، أي الـ spread، ضمن نطاق محدود بدلاً من الابتعاد بلا حدود، يكون السهمان متكاملين مشتركاً. ويمكن للسعرين نفسيهما أن يتحركا إلى أي مستوى. أما التركيبة بينهما فلا تفعل ذلك.

تستخدم الكتب الدراسية صورة كلب مربوط ب leash. يسلك الشخص والكلب مسارات غير متوقعة في الشارع، لكن leash يحافظ على المسافة بينهما ضمن حدود معينة. يقيس الارتباط ما إذا كان السهمان يتحركان في اللحظة نفسها. أما التكامل المشترك فيقيس ما إذا كان leash يحافظ على المسافة.

يقيس الجدول أدناه الفكرة الأولى لدى خمسة أزواج معروفة خلال عامي 2024 و2025. يقيس العمود return_corr الارتباط بين التحركات اليومية المئوية، وهو ما يقصده الناس عادةً بكلمة الارتباط. أما العمود price_corr فيقيس الارتباط بين أسعار الإغلاق الخام، وهي قيمة قد تبدو مرتفعة لدى أي سهمين ارتفعا معاً.

الاستعلامارتباط العوائد اليومية مقابل ارتباط مستويات الأسعار، خمس أزواج مألوفة (2024-2025)
استعلام SQL الدقيق وراء كل رقم
WITH
    px AS (
        SELECT
            ticker,
            date,
            toFloat64(any(close)) AS close_px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('KO', 'PEP', 'HD', 'LOW', 'XOM', 'CVX', 'V', 'MA', 'AAPL', 'MSFT')
          AND date BETWEEN '2024-01-01' AND '2025-12-31'
        GROUP BY ticker, date
    ),
    rets AS (
        SELECT
            ticker,
            date,
            close_px,
            close_px / lagInFrame(close_px) OVER (
                PARTITION BY ticker ORDER BY date
                ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
            ) - 1 AS ret
        FROM px
    )
SELECT
    p.pair                                  AS pair,
    round(corr(a.ret, b.ret), 3)            AS return_corr,
    round(corr(a.close_px, b.close_px), 3)  AS price_corr
FROM
(
    SELECT
        tupleElement(t, 1) AS leg_a,
        tupleElement(t, 2) AS leg_b,
        tupleElement(t, 3) AS pair
    FROM
    (
        SELECT arrayJoin([
            ('KO',   'PEP',  'KO / PEP'),
            ('HD',   'LOW',  'HD / LOW'),
            ('XOM',  'CVX',  'XOM / CVX'),
            ('V',    'MA',   'V / MA'),
            ('AAPL', 'MSFT', 'AAPL / MSFT')
        ]) AS t
    )
) AS p
INNER JOIN rets AS a ON a.ticker = p.leg_a
INNER JOIN rets AS b ON b.ticker = p.leg_b AND b.date = a.date
WHERE isFinite(a.ret) AND isFinite(b.ret)
GROUP BY pair
ORDER BY return_corr DESC
Run this yourself

عند ترتيب الأزواج وفق الارتباط بين التحركات اليومية، يأتي HD / LOW في صدارة الجدول عند 0.868، بينما بلغ الارتباط بين مستويي السعرين خلال الفترة نفسها 0.849. وفي الصف الأخير، يسجل AAPL / MSFT ارتباطاً بين العوائد قدره 0.479، إلى جانب ارتباط سعري قدره 0.508. لا يجيب أي من العمودين عن السؤال الذي يطرحه متداول الأزواج. فكلاهما يقيس التحرك المشترك، بينما تحتاج الصفقة إلى مقياس للمسافة.

كيف تحسب نسبة التحوط والفارق السعري؟

خمس خطوات بالترتيب، باستخدام قائمتين من أسعار الإغلاق. تكفي لغة Python العادية لتنفيذها بالكامل، مع math بوصفه الاستيراد الوحيد: من دون حزم أو مزوّد بيانات أو اتصال بالشبكة.

  1. تمركز كل سلسلة. mean_a = sum(a) / len(a)، وينطبق الأمر نفسه على القائمة b.
  2. ملاءمة نسبة التحوط. هي ميل خط مستقيم يربط B بـ A: beta = sum((a[i] - mean_a) * (b[i] - mean_b) for i in range(len(a))) / sum((x - mean_a) ** 2 for x in a). واقرأها على أنها عدد وحدات A اللازمة لمعادلة وحدة واحدة من B.
  3. إنشاء الفارق السعري. spread = [b[i] - beta * a[i] for i in range(len(a))]. في الزوج المتكامل، تتحرك هذه السلسلة حول مستوى معين بدلاً من اتباع اتجاه مستمر.
  4. استخدام نافذة لاحقة. مع w = spread[i - win + 1 : i + 1]، يكون متوسط النافذة mu = sum(w) / len(w) ويكون الانحراف المعياري للعينة sd = math.sqrt(sum((x - mu) ** 2 for x in w) / (len(w) - 1)). تعني النافذة اللاحقة أن نهايتها تقع في اليوم الذي يجري تقييمه، وأنها لا تستخدم أي بيانات لاحقة له.
  5. حساب الدرجة وطباعتها. z = (spread[i] - mu) / sd، ثم اطبع سطر دخول عندما abs(z) > 1.5، وسطر خروج عندما abs(z) < 0.5. تعني قيمة z البالغة 2 أن الفارق السعري يقع على بُعد انحرافين معياريين فوق متوسطه الأخير.

تكفي قائمتان سعريتان محددتان مسبقاً لمراقبة التشغيل، كما أن استخدام win بقيمة 5 يجعل المثال التجريبي سهل القراءة. أما التطبيقات الجادة فتستخدم عادةً ما يقارب 63 جلسة، أي نحو ربع سنة. هذه الحدود، 1.5 للدخول و0.5 للخروج، مجرد أعراف انتقلت من درس تعليمي إلى آخر. وليست نتائج مستخلصة من البيانات، ولم تعتمد عليها أي من اللوحات أدناه.

كيف تبدو قيمة z لاستراتيجية تداول الأزواج على الأسعار الفعلية؟

إليك الحساب نفسه لسهمي مشروبيْن استهلاكيين معروفين، KO وPEP. استُخرجت نسبة التحوّط من أسعار الإغلاق في عام 2023 فقط، ثم ظلت ثابتة طوال عامي 2024 و2025، وهما الفترتان اللتان يغطيهما الرسم البياني. إن ملاءمة الميل على العينة نفسها التي ستستخدمها لاحقاً لحساب القيم تعني وجود انحياز النظر إلى المستقبل في الاختبار التاريخي، ويفصل إبقاء نافذة الملاءمة عن نافذة حساب القيم بينهما، وهو أبسط وسيلة دفاع ضد هذا الانحياز.

الاستعلامدرجة z الأسبوعية لفارق KO/PEP، مع ملاءمة نسبة التحوط على 2023 فقط
استعلام SQL الدقيق وراء كل رقم
WITH
    daily AS (
        SELECT
            date,
            anyIf(toFloat64(close), ticker = 'PEP') AS pep,
            anyIf(toFloat64(close), ticker = 'KO')  AS ko
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('KO', 'PEP')
          AND date BETWEEN '2023-01-01' AND '2025-12-31'
        GROUP BY date
        HAVING pep > 0 AND ko > 0
    ),
    fitted AS (
        SELECT covarSamp(pep, ko) / varSamp(ko) AS beta
        FROM daily
        WHERE date < '2024-01-01'
    ),
    spread AS (
        SELECT
            daily.date                          AS date,
            daily.pep - fitted.beta * daily.ko  AS spread_usd
        FROM daily
        CROSS JOIN fitted
    ),
    scored AS (
        SELECT
            date,
            (spread_usd - avg(spread_usd) OVER (
                 ORDER BY date ROWS BETWEEN 62 PRECEDING AND CURRENT ROW))
            / stddevSampStable(spread_usd) OVER (
                 ORDER BY date ROWS BETWEEN 62 PRECEDING AND CURRENT ROW) AS z
        FROM spread
    )
SELECT
    toString(toMonday(date))   AS week,
    round(argMax(z, date), 2)  AS z_score
FROM scored
WHERE date >= '2024-01-01'
  AND isFinite(z)
GROUP BY week
ORDER BY week
Run this yourself

يضم المسار 105 قراءة أسبوعية. تبدأ النافذة عند قيمة z تبلغ -1.53، وتنتهي عند -0.68. اقرأ الشكل العام، لا أي نقطة منفردة. الزوج الذي يتصرف كما تفترض الاستراتيجية يتجاوز عتبته، ثم يقضي بضعة أسابيع في العودة نحو الصفر، قبل أن يتجاوز العتبة مجدداً. أما الزوج الذي توقف عن العودة إلى متوسطه، فيستقر خارج العتبة ويبقى هناك؛ ويظهر ذلك على الرسم في صورة امتداد أفقي طويل بعيداً عن الوسط.

هل يعود spread المتكامل مشتركاً دائماً؟

لا. والطريقة الصادقة لفهم ذلك هي قياس ما حدث بعد كل نقطة بداية. يجمع الرسم أدناه جلسات التداول من عام 2019 حتى أواخر عام 2025 في فئات بحسب قيمة z في ذلك اليوم، ثم يعرض متوسط قيمة z لـ spread نفسه بعد عشرين جلسة. ويستخدم لوغاريتم نسبة السعر بدلاً من spread مقدَّر، لذلك لا يؤثر أي انحدار جرى تقديره لاحقاً في الرسم البياني.

الاستعلامموضع فارق KO/PEP بعد عشرين جلسة، حسب درجة z الابتدائية (2019-2025)
استعلام SQL الدقيق وراء كل رقم
WITH
    daily AS (
        SELECT
            date,
            anyIf(toFloat64(close), ticker = 'PEP') AS pep,
            anyIf(toFloat64(close), ticker = 'KO')  AS ko
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('KO', 'PEP')
          AND date BETWEEN '2018-01-01' AND '2025-12-31'
        GROUP BY date
        HAVING pep > 0 AND ko > 0
    ),
    spread AS (
        SELECT
            date,
            log(pep / ko) AS log_ratio
        FROM daily
    ),
    scored AS (
        SELECT
            date,
            (log_ratio - avg(log_ratio) OVER (
                 ORDER BY date ROWS BETWEEN 62 PRECEDING AND CURRENT ROW))
            / stddevSampStable(log_ratio) OVER (
                 ORDER BY date ROWS BETWEEN 62 PRECEDING AND CURRENT ROW) AS z
        FROM spread
    ),
    horizon AS (
        SELECT
            date,
            z,
            leadInFrame(z, 20) OVER (
                ORDER BY date ROWS BETWEEN CURRENT ROW AND 20 FOLLOWING
            ) AS z_fwd
        FROM scored
        WHERE isFinite(z)
    )
SELECT
    multiIf(z < -2, 'z below -2',
            z < -1, 'z -2 to -1',
            z <  0, 'z -1 to 0',
            z <  1, 'z 0 to 1',
            z <  2, 'z 1 to 2',
                    'z above 2')  AS z_bucket,
    round(avg(z), 2)              AS avg_z_start,
    round(avg(z_fwd), 2)          AS avg_z_20d_later,
    count()                       AS episode_count
FROM horizon
WHERE date >= '2019-01-01'
  AND date <= '2025-11-15'
  AND isFinite(z_fwd)
GROUP BY z_bucket
ORDER BY avg_z_start
Run this yourself

بدأت الجلسات الواقعة ضمن فئة z below -2 بمتوسط قدره -2.42 في ذلك اليوم، ثم بلغ متوسط spread نفسه -0.84 بعد عشرين جلسة، وذلك عبر 138 جلسة. أما في الطرف الآخر، فبدأت فئة z above 2 عند 2.64، وبلغت قراءتها 0.92 بعد عشرين جلسة. والمنحنى الذي يتحرك نحو الصفر من الطرفين هو الشكل الذي تنتجه العودة إلى المتوسط.

اقرأ الرسم مع إبقاء عمود العدد نصب عينيك. فالفئات الطرفية تضم أقل عدد من الجلسات، كما أن الجلسات داخل الفئة الواحدة تتداخل بدرجة كبيرة؛ لذلك توفر حفنة من الفترات الطويلة معظم الصفوف. والمتوسط ليس وعداً بشأن أي دخول منفرد.

لماذا تتوقف استراتيجية تداول الأزواج عن العمل؟

نسبة التحوط ليست ثابتة. أعد تقديرها في كل سنة تقويمية، وستتغير.

الاستعلامإعادة ملاءمة نسبة التحوط كل سنة تقويمية، لزوجين من القطاعات
استعلام SQL الدقيق وراء كل رقم
WITH daily AS (
    SELECT
        date,
        anyIf(toFloat64(close), ticker = 'PEP') AS pep,
        anyIf(toFloat64(close), ticker = 'KO')  AS ko,
        anyIf(toFloat64(close), ticker = 'LOW') AS lowes,
        anyIf(toFloat64(close), ticker = 'HD')  AS hd
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('KO', 'PEP', 'HD', 'LOW')
      AND date BETWEEN '2019-01-01' AND '2025-12-31'
    GROUP BY date
    HAVING ko > 0 AND pep > 0 AND hd > 0 AND lowes > 0
)
SELECT
    toYear(date)                                  AS year,
    round(covarSamp(pep, ko) / varSamp(ko), 3)    AS pep_on_ko_beta,
    round(covarSamp(lowes, hd) / varSamp(hd), 3)  AS lowes_on_hd_beta
FROM daily
GROUP BY year
ORDER BY year
Run this yourself

يمثل الميل السعري لـ PEP بالنسبة إلى KO، مقاساً 2.338 عبر 2019 و-0.543 عبر 2025، مع عرض زوج القطاع الثاني إلى جانبه للمقارنة. إن ملاءمة ميل واحد على كامل السجل التاريخي ثم التداول وفقه منذ اليوم الأول تمنح كل صفقة مبكرة قيمة لم يكن أحد قادراً على امتلاكها في ذلك الوقت. الحل بسيط وفعّال: أعد تقدير النموذج على نافذة متحركة، وقيّم كل يوم باستخدام المعلمات المتاحة في ذلك اليوم. ويجعل الاختبار الرجعي القابل لإعادة الإنتاج هذه المنهجية قابلة للتحقق من جانب شخص آخر.

تُعيد إجراءات الشركات صياغة أحد طرفي الزوج بين عشية وضحاها. يؤدي تقسيم السهم بنسبة 4 إلى 1 إلى تحويل سهم واحد إلى أربعة أسهم، وإلى خفض السعر المعلن إلى ربعه. لذلك يقفز spread المحسوب عبر ذلك التاريخ باستخدام أسعار غير معدلة إلى مستوى لم يُتداول عنده قط. وتُحدث عمليات الاندماج، والانفصال، وتغييرات المؤشرات أثراً مماثلاً ولكن بصورة أقل وضوحاً. ابدأ باستخدام السجل التاريخي للأسعار المعدلة وفقاً للتقسيمات، ولاحظ أن الرمز قد يُعاد تخصيصه لشركة مختلفة تماماً، وهو سبب تعطل رموز ticker في مجموعات البيانات.

يبدو الانقطاع والفرصة متطابقين أثناء حدوثهما. فأكبر قيمة z score سجلها زوج ما على الإطلاق قد تكون أفضل نقطة دخول أتاحها، أو قد تكون الأسبوع الأول لعلاقة انتهت. ويبدو كلا الاحتمالين كـ spread متسع في ذلك اليوم. ويتحمل تحديد حجم المركز الجانب الذي لا تستطيع الإحصاءات حسمه: يوفر كل من تحديد حجم المركز وفق معيار Kelly وتحديد حجم المركز وفق استهداف التقلب إطاراً لتحديد مقدار ما يُسمح لـ spread واحد بتحريكه من الحساب، بينما يقيس الحد الأقصى للتراجع أثر بقاء منحنى الأسهم فترة طويلة في الجانب الخطأ من المتوسط.

لا يُعد z score المتحرك اختباراً للتكامل المشترك. توجد اختبارات رسمية لهذا الغرض. تُجري طريقة Engle-Granger الانحدار، ثم تختبر استقرارية spread المتبقي، بينما يوسّع اختبار Johansen الفكرة لتشمل أكثر من ورقة مالية واحدة. ويفترض z score تحقق الخاصية التي تختبرها تلك الأساليب، وسيعرض بسهولة رقماً كبيراً لـ spread لا يمتلك متوسطاً مستقراً على الإطلاق، لأن السلسلة المتجهة في اتجاه معين تظل دائماً بعيدة عن متوسطها المتحرك.

ملاحظات البيانات وما تستبعده هذه الأرقام

تستخدم لوحة الارتباطات أسعار الإغلاق اليومية من 2024-01-01 إلى 2025-12-31، وتحسب العوائد من أسعار الإغلاق المتتالية، مع إسقاط الجلسة الأولى لكل ورقة مالية. ويُلائم مسار z score نسبة التحوط باستخدام أسعار إغلاق عام 2023 فقط، ثم يقيّم عامي 2024 و2025 باستخدام متوسط متحرك من 63 جلسة وانحراف معياري للعينة، مع أخذ القراءة الأخيرة من كل أسبوع. وتحمل لوحة الارتداد السعري السجل التاريخي بدءاً من 2018، وتعرض البيانات ابتداءً من 2019، بحيث يملك كل يوم جرى تقييمه نافذة متحركة كاملة خلفه. وتتوقف في منتصف نوفمبر 2025، بحيث يملك كل يوم عشرين جلسة لاحقة ضمن العينة.

لا تمثل أي من هذه اللوحات استراتيجية تداول. فهي لا تتضمن تكاليف التداول، أو spread بين سعري العرض والطلب، أو رسوم اقتراض المركز القصير، أو توزيعات الأرباح، أو تكاليف التمويل. وتستخدم أسعار الإغلاق فقط، ما يعني أن الدخول المسجل عند سعر الإغلاق كان دخولاً لا يستطيع أي متداول تنفيذه فعلياً عند ذلك السعر.

الأسئلة الشائعة

ما الفرق بين الارتباط والتكامل المشترك؟

يقيس الارتباط ما إذا كان سهمان يتحركان في الأيام نفسها وفي الاتجاه نفسه، على مقياس يتراوح بين -1 و+1. أما التكامل المشترك فيقيس ما إذا كانت المسافة بين سعريهما تبقى ضمن نطاق مستقر. وقد يسجل زوج ما نتيجة مرتفعة في المقياس الأول ويفشل في الثاني. وهذا هو السبب المعتاد في أن تكشف أداة فرز الارتباط عن أزواج تتباعد لاحقاً.

كيف تحسب نسبة التحوط في تداول الأزواج؟

طابِق خطاً مستقيماً لسعر أحد السهمين مقابل سعر السهم الآخر، ثم خذ ميل الخط. ويمثل هذا الميل عدد وحدات السهم الأول التي تعادل وحدة واحدة من السهم الثاني. وتتغير هذه النسبة بمرور الوقت، لذلك تعيد معظم التطبيقات تقديرها باستخدام نافذة زمنية متحركة بدلاً من تقديرها مرة واحدة على كامل العينة.

ما درجة z التي يستخدمها متداولو الأزواج للدخول والخروج؟

تدخل الأمثلة التعليمية عادةً عندما يبتعد الفارق بنحو 1.5 إلى 2 من الانحرافات المعيارية عن متوسطه المتحرك، وتخرج عندما يقترب من 0.5. وهذه الأرقام أعراف موروثة من شروحات سابقة، وليست قيماً مثلى مقاسة. ويؤدي تغييرها إلى تغيير عدد الصفقات ومدة الاحتفاظ بكل صفقة.

هل يمكن أن يكون سهمان متكاملين تكاملاً مشتركاً مع ارتباط منخفض؟

نعم. يُحسب الارتباط على أساس التغيرات اليومية، بينما يُحسب التكامل المشترك على مستوى الفارق. لذلك يمكن لسهمين نادراً ما تتطابق تحركاتهما اليومية أن يحافظا مع ذلك على مسافة مستقرة طويلة الأجل. ويحدث العكس أيضاً: قد يترافق ارتباط يومي مرتفع مع فارق يتسع عاماً بعد عام.

لماذا تتوقف فاعلية زوج متكامل تكاملاً مشتركاً؟

قد تتغير الصلة التي تحافظ على الفارق ضمن نطاقه، بسبب اندماج أو فصل شركة، أو تغير في مزيج أعمال إحدى الشركتين، أو تعديل في أحد المؤشرات يغير الجهات المالكة للسهم. وتبدو الإحصاءات في الأيام السابقة للانفصال مماثلة لتلك التي تسبق عودة عادية إلى المتوسط. ولذلك يجب تحديد حجم المركز تحسباً لهذا الاحتمال بدلاً من محاولة التنبؤ به.

كل لوحة هنا مرفقة بعبارة SQL الدقيقة المستخدمة خلفها. لذلك تظهر جميع النوافذ وفترة الملاءمة وحدود الشرائح. ولتشغيل spread ودرجة z نفسيهما على زوج تتابعه، اطرح السؤال باللغة الإنجليزية البسيطة على منصة Strasmore.

#pairs trading#cointegration#mean reversion#backtesting#statistics