Strasmore Research

Pairs Trading میں Cointegration کی وضاحت

Pairs trading کے لیے cointegration ضروری ہے، correlation اس کا متبادل نہیں۔ حقیقی closing prices پر hedge ratio، spread اور z score خود بنانا سیکھیں۔

Pairs trading اور cointegration ایک دوسرے سے جڑے ہوئے تصورات ہیں۔ یہ trade دو stock prices کے درمیان ایسے gap پر مبنی ہوتی ہے جو بار بار ایک مستحکم سطح کی طرف واپس آتا ہے۔ cointegration وہ statistical property ہے جو بتاتی ہے کہ ایسا gap واقعی موجود ہے۔

Correlation ایک مختلف چیز کو measure کرتی ہے۔ دو stocks کی correlation بلند ہو سکتی ہے، پھر بھی وہ ہمیشہ کے لیے ایک دوسرے سے دور ہوتے رہیں۔ اسی طرح دو stocks کی روزانہ کی price moves بمشکل ایک دوسرے سے مطابقت رکھتی ہوں، لیکن ان کے درمیان gap برسوں تک مستحکم رہ سکتا ہے۔

یہ صفحہ hedge ratio، spread اور z score کو step by step تیار کرتا ہے۔ پھر حقیقی closing prices پر ان تینوں کی پیمائش کرتا ہے۔ آخر میں اتنی ہی تفصیل سے یہ بھی بیان کرتا ہے کہ یہ construction کہاں اور کیسے ناکام ہو سکتی ہے۔

Pairs trading میں cointegration کیا ہے؟

Correlation دو stocks کی روزانہ percentage moves کے باہمی تعلق کی مضبوطی کو ظاہر کرتا ہے۔ اس کی حد -1 سے +1 تک ہوتی ہے۔ +1 کا مطلب ہے کہ sample کے ہر سیشن میں دونوں stocks ایک ساتھ بڑھے اور گرے۔ یہ دونوں prices کے درمیان فاصلے کے بارے میں کچھ نہیں بتاتا۔

Cointegration اس فاصلے کے بارے میں بیان ہے۔ Stock B میں سے stock A کی ایک مقررہ multiple منہا کریں اور دیکھیں کہ کیا باقی رہ جاتا ہے۔ اگر یہ باقی رہ جانے والی series، یعنی spread، دور بھٹکنے کے بجائے ایک محدود range میں رہے تو دونوں names cointegrated کہلاتے ہیں۔ Prices خود کسی بھی سمت جا سکتی ہیں۔ ان کا یہ combination ایسا نہیں کر سکتا۔

اس تصور کو سمجھانے کے لیے textbooks میں عموماً پٹے سے بندھے کتے کی مثال دی جاتی ہے۔ سڑک پر چلنے والا شخص اور کتا دونوں غیر متوقع راستوں پر جا سکتے ہیں، لیکن پٹا ان کے درمیان فاصلے کو محدود رکھتا ہے۔ Correlation یہ پوچھتا ہے کہ کیا دونوں ایک ہی وقت میں قدم بڑھاتے ہیں۔ Cointegration یہ پوچھتا ہے کہ کیا پٹا فاصلہ برقرار رکھتا ہے۔

نیچے دیا گیا panel 2024 اور 2025 کے دوران پانچ معروف pairs میں پہلے تصور کی پیمائش کرتا ہے۔ return_corr کالم روزانہ percentage moves کی correlation دکھاتا ہے، اور عموماً اسی کو correlation کہا جاتا ہے۔ price_corr کالم raw closing prices کی correlation دکھاتا ہے۔ یہ عدد تقریباً ہر ایسے دو names کو بہتر دکھا سکتا ہے جو دونوں اوپر گئے ہوں۔

استفسار کریںروزانہ return correlation بمقابلہ price-level correlation، پانچ معروف pairs (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

روزانہ moves کی correlation کے لحاظ سے HD / LOW panel میں سب سے اوپر ہے، جس کی reading 0.868 ہے۔ اسی window کے دوران دونوں price levels کی correlation 0.849 رہی۔ آخری row میں AAPL / MSFT کی return correlation 0.479 ہے، جبکہ price correlation 0.508 ہے۔ دونوں میں سے کوئی بھی کالم اس سوال کا جواب نہیں دیتا جو pairs trader پوچھ رہا ہے۔ دونوں co-movement کو ناپتے ہیں، جبکہ trade کے لیے فاصلے کی پیمائش درکار ہوتی ہے۔

hedge ratio اور spread کیسے calculate کیے جاتے ہیں؟

Closing prices کی دو lists پر، ترتیب وار پانچ steps۔ Plain Python سے یہ کام مکمل ہو جاتا ہے، اور math واحد import ہے: کسی package، data vendor یا network کی ضرورت نہیں۔

  1. ہر series کو center کریں۔ mean_a = sum(a) / len(a)، اور list b کے لیے بھی یہی کریں۔
  2. hedge ratio fit کریں۔ یہ B کو A کے مقابل ایک straight line کی slope ہے: 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 کی ان units کی تعداد سمجھیں جو B کی ایک unit کو offset کرتی ہیں۔
  3. spread بنائیں۔ spread = [b[i] - beta * a[i] for i in range(len(a))]۔ cointegrated pair میں یہ series trend کرنے کے بجائے ایک level کے آس پاس رہتی ہے۔
  4. trailing window لیں۔ w = spread[i - win + 1 : i + 1] کے ساتھ window mean mu = sum(w) / len(w) اور sample standard deviation sd = math.sqrt(sum((x - mu) ** 2 for x in w) / (len(w) - 1)) ہوگا۔ Trailing کا مطلب ہے کہ window اسی دن پر ختم ہوتی ہے جس دن کو score کیا جا رہا ہو، اور اس کے بعد کا کوئی data استعمال نہیں ہوتا۔
  5. score اور print کریں۔ z = (spread[i] - mu) / sd، پھر entry line اس وقت print کریں جب abs(z) > 1.5، اور exit line اس وقت جب abs(z) < 0.5۔ z کی قدر 2 کا مطلب ہے کہ spread اپنی حالیہ average سے دو standard deviations اوپر ہے۔

اس run کو دیکھنے کے لیے hard-coded price lists کی دو مثالیں کافی ہیں، جبکہ win کی قدر 5 رکھنے سے toy example آسانی سے سمجھ آتا ہے۔ حقیقی analysis میں عموماً تقریباً 63 sessions، یعنی قریباً ایک quarter، کی window استعمال کی جاتی ہے۔ 1.5 پر enter اور 0.5 پر exit کی یہ thresholds ایک tutorial سے دوسرے tutorial تک منتقل ہونے والی conventions ہیں۔ یہ research findings نہیں ہیں، اور نیچے موجود panels میں سے کسی نے انہیں اخذ نہیں کیا۔

حقیقی prices پر pairs trading کا z score کیسا دکھائی دیتا ہے؟

یہاں یہی calculation دو معروف beverage names، KO اور PEP، پر کی گئی ہے۔ Hedge ratio صرف 2023 کے closing prices سے حاصل کیا گیا، پھر اسے 2024 اور 2025 کے دوران مستقل رکھا گیا؛ chart اسی مدت کا احاطہ کرتا ہے۔ جس sample پر آپ بعد میں score نکالتے ہیں، اسی sample پر slope fit کرنا backtesting میں look-ahead bias پیدا کرتا ہے۔ Fit window اور scoring window کو الگ رکھنا اس bias کے خلاف سب سے کم لاگت والا دفاع ہے۔

استفسار کریںKO/PEP spread کا ہفتہ وار z score، hedge ratio صرف 2023 پر fit کیا گیا
ہر عدد کے پیچھے موجود درست 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

اس trace میں 105 weekly readings شامل ہیں۔ یہ window -1.53 کے z score سے شروع ہوتی ہے اور -0.68 پر ختم ہوتی ہے۔ کسی ایک نقطے کے بجائے اس کی shape دیکھیں۔ جو pair strategy کے مفروضے کے مطابق عمل کرتا ہے، وہ threshold کو cross کرتا ہے، چند ہفتوں میں واپس zero کی سمت آتا ہے، اور پھر دوبارہ threshold cross کرتا ہے۔ جو pair mean reversion کھو چکا ہو، وہ threshold سے باہر ٹھہر جاتا ہے۔ Chart پر یہ صورتِ حال درمیان سے دور ایک طویل flat stretch کی شکل میں دکھائی دیتی ہے۔

کیا cointegrated spread ہمیشہ واپس آتا ہے؟

نہیں۔ اس بات کو سمجھنے کا درست طریقہ یہ ہے کہ ہر ابتدائی مقام کے بعد کیا ہوا، اسے ناپا جائے۔ ذیل کا پینل 2019 سے 2025 کے آخر تک ہر session کو اس دن کے z score کے مطابق buckets میں تقسیم کرتا ہے، پھر بیس sessions بعد اسی spread کے اوسط z score کی رپورٹ دیتا ہے۔ اس میں fitted spread کے بجائے price ratio کا log استعمال کیا گیا ہے، اس لیے بعد میں کی گئی کسی regression estimation کا chart پر اثر نہیں پڑتا۔

استفسار کریںابتدائی z score کے لحاظ سے، بیس sessions بعد KO/PEP spread کہاں تھا (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 bucket میں شروع ہونے والے sessions کا اس دن اوسط z score -2.42 تھا، جبکہ بیس sessions بعد اسی spread کا اوسط -0.84 رہا؛ یہ نتیجہ 138 sessions پر مبنی تھا۔ دوسری جانب z above 2 bucket کی ابتدا 2.64 پر ہوئی اور بیس sessions بعد اس کی پیمائش 0.92 رہی۔ دونوں سروں سے صفر کی طرف کھنچنے والی curve وہ شکل ہے جو mean reversion پیدا کرتی ہے۔

اسے count column کو سامنے رکھ کر پڑھیں۔ بیرونی buckets میں sessions کی تعداد سب سے کم ہے، اور ایک bucket کے اندر موجود sessions ایک دوسرے سے بہت زیادہ overlap کرتے ہیں؛ اس لیے چند طویل stretches زیادہ تر rows فراہم کرتے ہیں۔ اوسط کسی ایک entry کے بارے میں ضمانت نہیں ہوتا۔

پیئرز ٹریڈنگ کیوں کام کرنا بند کر دیتی ہے؟

ہیج ریشو مستقل نہیں ہوتا۔ ہر calendar year میں اسے دوبارہ fit کریں؛ یہ تبدیل ہوتا رہتا ہے۔

استفسار کریںہر calendar year میں hedge ratio دوبارہ fit کیا گیا، دو sector pairs
ہر عدد کے پیچھے موجود درست 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

2.338 اور 2019 کے دوران، نیز -0.543 اور 2025 کے دوران PEP کا KO پر measured slope، ساتھ موجود دوسرے sector pair کے ساتھ تقابل کے لیے دکھایا گیا ہے۔ ایسا backtest جو پوری history پر ایک ہی slope fit کرے اور پہلے دن سے اسی کے مطابق trades لے، ہر ابتدائی trade کو ایک ایسا number دے دیتا ہے جسے اس وقت کوئی استعمال نہیں کر سکتا تھا۔ حل سادہ مگر مؤثر ہے: trailing window پر دوبارہ fit کریں، اور ہر دن کی scoring اسی دن دستیاب parameters سے کریں۔ ایک قابلِ تکرار backtest کسی دوسرے شخص کے لیے اس discipline کی جانچ ممکن بناتا ہے۔

Corporate actions ایک ہی رات میں ایک leg کو بدل دیتے ہیں۔ 4-for-1 split ایک share کو چار shares میں بدل دیتا ہے اور quoted price کو ایک چوتھائی کر دیتا ہے۔ اگر اس تاریخ کے دوران spread کو unadjusted prices پر calculate کیا جائے تو یہ ایسی سطح پر چھلانگ لگا دیتا ہے جہاں کبھی trading نہیں ہوئی۔ Mergers، spin-offs اور index changes بھی اسی نوعیت کی تبدیلیاں، اگرچہ نسبتاً خاموشی سے، پیدا کرتے ہیں۔ ابتدا split-adjusted price history سے کریں، اور یہ بات پیشِ نظر رکھیں کہ کسی symbol کو ایک بالکل مختلف company کے نام دوبارہ مختص کیا جا سکتا ہے؛ یہی وجہ ہے کہ ticker symbols datasets میں خراب ہو جاتے ہیں۔

Break اور opportunity وقوع پذیر ہوتے وقت ایک جیسے دکھائی دیتے ہیں۔ کسی pair کا اب تک کا سب سے وسیع z score یا تو اس کا بہترین entry point ہوتا ہے، یا اس تعلق کے ختم ہونے کے بعد پہلے ہفتے کی علامت۔ اس دن دونوں صورتیں stretched spread جیسی دکھائی دیتی ہیں۔ یہاں sizing وہ بوجھ اٹھاتی ہے جو statistics نہیں اٹھا سکتے: Kelly criterion position sizing اور volatility targeting position sizing اس بات کے دو frameworks ہیں کہ account کے کتنے حصے کی value کو ایک spread متاثر کر سکتا ہے، جبکہ maximum drawdown یہ measure کرتا ہے کہ mean کے غلط رخ پر طویل عرصے تک رہنے سے equity curve پر کیا اثر پڑتا ہے۔

Rolling z score، cointegration test نہیں ہوتا۔ اس کے لیے formal tests موجود ہیں۔ Engle-Granger procedure پہلے regression چلاتا ہے، پھر باقی رہ جانے والے spread کی stationarity test کرتا ہے، جبکہ Johansen test اس تصور کو دو names سے آگے بڑھاتا ہے۔ z score یہ فرض کرتا ہے کہ وہ property موجود ہے جسے یہ tests جانچتے ہیں۔ یہ ایسے spread پر بھی بڑی value دکھا دے گا جس کا کوئی مستحکم mean موجود نہ ہو، کیونکہ trending series ہمیشہ اپنی trailing average سے خاصے فاصلے پر رہتی ہے۔

Data notes اور ان اعداد میں شامل نہ ہونے والی چیزیں

Correlation panel میں 2024-01-01 سے 2025-12-31 تک کے daily closes استعمال کیے گئے ہیں، اور consecutive closes سے returns calculate کیے گئے ہیں؛ ہر name کا پہلا session خارج کر دیا گیا ہے۔ z score trace میں hedge ratio صرف 2023 کے closes پر fit کیا گیا، پھر 2024 اور 2025 کی scoring trailing 63-session mean اور sample standard deviation سے کی گئی، جسے ہر ہفتے کی آخری reading تک sample کیا گیا ہے۔ Reversion panel میں 2018 سے history load کی گئی اور 2019 کے بعد کے اعداد report کیے گئے ہیں، اس لیے ہر scored day کے پیچھے مکمل trailing window موجود ہے۔ یہ panel mid-November 2025 پر رک جاتا ہے تاکہ sample کے اندر ہر day کے آگے twenty sessions موجود ہوں۔

ان میں سے کوئی بھی panel strategy نہیں ہے۔ ان میں trading costs، bid-ask spread، short leg کی borrow fee، dividends یا financing شامل نہیں ہیں۔ صرف closing prices استعمال کی گئی ہیں، جس کا مطلب ہے کہ close پر دکھایا گیا entry ایسا entry ہے جس پر کوئی شخص حقیقت میں fill نہیں ہو سکتا تھا۔

عمومی سوالات

Correlation اور cointegration میں کیا فرق ہے؟

Correlation یہ پیمانہ ہے کہ دو stocks ایک ہی دنوں میں اور ایک ہی سمت میں حرکت کرتے ہیں یا نہیں۔ اس کی حد -1 سے +1 تک ہوتی ہے۔ Cointegration یہ جانچتی ہے کہ آیا ان کی prices کے درمیان فاصلہ ایک مستحکم range کے اندر رہتا ہے۔ کوئی pair پہلے پیمانے پر بلند score حاصل کر سکتا ہے مگر دوسرے پر ناکام ہو سکتا ہے۔ یہی عام وجہ ہے کہ correlation screen ایسے pairs سامنے لاتی ہے جو بعد میں ایک دوسرے سے دور ہوتے جاتے ہیں۔

Pairs trading میں hedge ratio کیسے calculate کیا جاتا ہے؟

ایک stock کی price کو دوسرے stock کی price کے مقابل ایک straight line میں fit کریں اور slope حاصل کریں۔ یہ slope بتاتا ہے کہ دوسرے stock کی ایک unit کی exposure کو offset کرنے کے لیے پہلے stock کی کتنی units درکار ہیں۔ یہ مقدار وقت کے ساتھ بدلتی رہتی ہے، اس لیے زیادہ تر implementations اسے پورے sample پر صرف ایک بار fit کرنے کے بجائے trailing window پر دوبارہ fit کرتی ہیں۔

Pairs traders داخلے اور اخراج کے لیے کون سا z score استعمال کرتے ہیں؟

Tutorial examples عموماً trailing mean سے 1.5 سے 2 standard deviations کے فاصلے پر entry لیتے ہیں اور تقریباً 0.5 پر exit کرتے ہیں۔ یہ اعداد پہلے کی تحریروں سے وراثت میں ملنے والی conventions ہیں، نہ کہ باقاعدہ طور پر ناپی گئی optimal values۔ ان اعداد کو بدلنے سے trades کی تعداد بھی بدلتی ہے اور ہر trade کو برقرار رکھنے کا دورانیہ بھی۔

کیا دو stocks کم correlation کے باوجود cointegrated ہو سکتے ہیں؟

ہاں۔ Correlation روزانہ کی تبدیلیوں پر calculate کی جاتی ہے، جبکہ cointegration gap کی level پر۔ اس لیے دو names کی روزمرہ movements شاذونادر ہی ایک سمت میں ہونے کے باوجود ان کے درمیان طویل مدت کا فاصلہ مستحکم رہ سکتا ہے۔ اس کے برعکس صورتِ حال بھی ممکن ہے: روزانہ کی correlation بلند ہو، مگر gap سال بہ سال وسیع ہوتا جائے۔

Cointegrated pair کام کرنا کیوں بند کر دیتا ہے؟

Gap کو ایک ساتھ رکھنے والا تعلق بدل سکتا ہے۔ اس کی وجوہات میں merger، spin-off، کسی کمپنی کے business mix میں تبدیلی، یا index میں ایسی تبدیلی شامل ہے جو stock کے owners کو بدل دے۔ Break سے پہلے کے دنوں کے statistics عام reversion سے پہلے کے دنوں جیسے ہی دکھائی دیتے ہیں۔ اسی لیے اس risk کو پہلے سے predict کرنے کے بجائے position sizing میں شامل کرنا ضروری ہے۔


یہاں موجود ہر panel اپنے نیچے موجود exact SQL کے ساتھ فراہم کیا گیا ہے، اس لیے windows، fit period اور bucket edges سب واضح ہیں۔ اپنے follow کیے جانے والے pair پر وہی spread اور z score چلانے کے لیے Strasmore terminal پر سوال plain English میں لکھیں۔

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