Strasmore Research
গভীর বিশ্লেষণ Matt Connorদ্বারা Matt Connor

Pairs Trading ও Cointegration কীভাবে কাজ করে

Cointegration pairs trading-এর প্রকৃত ভিত্তি, correlation আলাদা পরীক্ষা। বাস্তব closing price দিয়ে hedge ratio, spread ও z score হাতে-কলমে তৈরি ও যাচাই করুন।

Pairs trading এবং cointegration একসঙ্গে বিবেচনা করা হয়। এই ট্রেডের ভিত্তি হলো দুটি শেয়ারের দামের এমন একটি ব্যবধান, যা বারবার একটি স্থিতিশীল স্তরে ফিরে আসে। Cointegration হলো সেই পরিসংখ্যানগত বৈশিষ্ট্য, যা নির্দেশ করে যে এমন একটি ব্যবধান আদৌ বিদ্যমান।

Correlation ভিন্ন বিষয় পরিমাপ করে। দুটি শেয়ারের মধ্যে correlation বেশি হলেও তারা চিরতরে পরস্পর থেকে দূরে সরে যেতে পারে। আবার, যেসব শেয়ারের দৈনিক দামের ওঠানামা খুব কমই একসঙ্গে চলে, সেগুলোর ব্যবধানও বছরের পর বছর স্থিতিশীল থাকতে পারে।

এই পৃষ্ঠায় hedge ratio, spread এবং z score হাতে-কলমে তৈরি করা হয়েছে। এরপর বাস্তব closing price ব্যবহার করে তিনটিরই পরিমাপ দেখানো হয়েছে। পাশাপাশি, এই নির্মাণ কোথায় ব্যর্থ হয়, তার ওপরও সমান গুরুত্ব দেওয়া হয়েছে।

পেয়ার্স ট্রেডিংয়ে cointegration কী?

Correlation হলো দুটি শেয়ারের দৈনিক শতাংশ পরিবর্তনের ঘনিষ্ঠতার পরিমাপ। এর মান -1 থেকে +1 পর্যন্ত হতে পারে। +1 মানে নমুনায় প্রতিটি ট্রেডিং সেশনে শেয়ার দুটি একই সময়ে বেড়েছে বা কমেছে। এটি দুই শেয়ারের দামের ব্যবধান সম্পর্কে কিছু বলে না।

Cointegration ওই ব্যবধান সম্পর্কে একটি ধারণা। শেয়ার B-এর দাম থেকে শেয়ার A-এর একটি নির্দিষ্ট গুণিতক বাদ দিয়ে অবশিষ্ট অংশটি দেখুন। এই অবশিষ্ট ধারাটি, অর্থাৎ spread, যদি দূরে সরে না গিয়ে একটি সীমিত পরিসরের মধ্যে থাকে, তাহলে শেয়ার দুটিকে cointegrated বলা হয়। শেয়ার দুটির দাম নিজের মতো করে যেকোনো দিকে যেতে পারে। কিন্তু তাদের সমন্বিত অবস্থানটি পারে না।

এটি বোঝাতে পাঠ্যবইয়ে সাধারণত leash-এ বাঁধা কুকুরের উদাহরণ দেওয়া হয়। পথচারী এবং কুকুরটি রাস্তায় অনির্দেশ্য পথে চলতে পারে, কিন্তু leash তাদের মধ্যকার দূরত্বকে সীমিত রাখে। Correlation জানতে চায় তারা একই সময়ে পা বাড়ায় কি না। Cointegration জানতে চায় leash দূরত্ব ধরে রাখতে পারছে কি না।

নিচের প্যানেলটি 2024 এবং 2025 জুড়ে পরিচিত পাঁচটি জোড়ার ক্ষেত্রে প্রথম ধারণাটি পরিমাপ করে। return_corr কলামে দৈনিক শতাংশ পরিবর্তনের correlation দেখানো হয়েছে, যা সাধারণত এই শব্দটি দিয়ে বোঝানো হয়। price_corr কলামে কাঁচা closing price-এর correlation দেখানো হয়েছে। উভয় শেয়ারের দাম বেড়ে থাকলে এই সংখ্যা প্রায় যেকোনো দুটি শেয়ারকেই বাস্তবের চেয়ে বেশি ঘনিষ্ঠ বলে দেখাতে পারে।

কুয়েরিদৈনিক-রিটার্ন পারস্পরিক সম্পর্ক বনাম মূল্য-স্তরের পারস্পরিক সম্পর্ক, 5টি পরিচিত জোড়া (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

দৈনিক পরিবর্তনের correlation অনুযায়ী সাজালে, HD / LOW প্যানেলের শীর্ষে রয়েছে, যার মান 0.868। একই সময়সীমায় দুই দামের স্তরের correlation ছিল 0.849। নিচের সারিতে AAPL / MSFT-এর return correlation 0.479, আর price correlation 0.508। পেয়ার্স ট্রেডার যে প্রশ্নের উত্তর খুঁজছেন, কোনো কলামই তার উত্তর দেয় না। উভয়ই co-movement পরিমাপ করে, কিন্তু ট্রেডের জন্য দরকার দূরত্বের একটি পরিমাপ।

হেজ অনুপাত ও spread কীভাবে হিসাব করবেন?

Closing price-এর দুটি list-এর ওপর ধারাবাহিকভাবে পাঁচটি ধাপ। সবকিছু করার জন্য plain Python-ই যথেষ্ট; একমাত্র import হলো math। কোনো package, data vendor বা network প্রয়োজন নেই।

  1. প্রতিটি series-এর কেন্দ্র নির্ধারণ করুন। mean_a = sum(a) / len(a), এবং list b-এর ক্ষেত্রেও একইভাবে।
  2. হেজ অনুপাত নির্ণয় করুন। এটি হলো B-কে A-এর বিপরীতে সরলরেখায় fit করার 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)। এটিকে এমনভাবে পড়ুন: B-এর 1 unit-এর ঝুঁকি offset করতে A-এর কত unit প্রয়োজন।
  3. spread তৈরি করুন। spread = [b[i] - beta * a[i] for i in range(len(a))]। Cointegrated pair-এর ক্ষেত্রে এই series সাধারণত একটি নির্দিষ্ট স্তরের আশেপাশে থাকে, trend অনুসরণ করে না।
  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, তারপর abs(z) > 1.5 হলে entry line এবং abs(z) < 0.5 হলে exit line print করুন। z-এর মান 2 হলে spread তার সাম্প্রতিক গড়ের চেয়ে দুই standard deviation উপরে রয়েছে।

এই code চালিয়ে দেখার জন্য দুটি hard-coded price list-ই যথেষ্ট, আর win-এর মান 5 রাখলে toy example বোঝা সহজ হয়। বাস্তব বিশ্লেষণে সাধারণত প্রায় 63টি session, অর্থাৎ প্রায় এক quarter-এর কাছাকাছি data ব্যবহার করা হয়। Entry-এর জন্য 1.5 এবং exit-এর জন্য 0.5—এই threshold দুটির প্রচলন এক tutorial থেকে আরেক tutorial-এ চলে এসেছে। এগুলো কোনো গবেষণালব্ধ ফল নয়, এবং নিচের panel-গুলোর কোনোটি এই threshold নির্ধারণ করেনি।

বাস্তব দামের ক্ষেত্রে pairs trading z score কেমন দেখায়?

এখানে একই হিসাব দুটি পরিচিত beverage কোম্পানি, KO এবং PEP-এর ওপর করা হয়েছে। Hedge ratio নেওয়া হয়েছে শুধু 2023 সালের closing price থেকে। এরপর 2024 ও 2025 জুড়ে, অর্থাৎ চার্টে দেখানো সময়সীমায়, এটি অপরিবর্তিত রাখা হয়েছে। যে একই sample দিয়ে পরে score নির্ণয় করা হয়, তার ওপর slope fit করাকে backtesting-এ look-ahead bias বলা হয়। তাই fit window এবং scoring window আলাদা রাখা এর বিরুদ্ধে সবচেয়ে কম খরচের সুরক্ষা।

কুয়েরিKO/PEP স্প্রেডের সাপ্তাহিক z স্কোর, হেজ অনুপাত শুধুমাত্র 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টি weekly reading রয়েছে। এটি -1.53 z score দিয়ে শুরু হয়েছে এবং -0.68 z score-এ শেষ হয়েছে। কোনো একটি বিন্দুর বদলে রেখার আকৃতি দেখুন। কৌশলটি যে আচরণ ধরে নেয়, সেই অনুযায়ী চলা কোনো pair threshold অতিক্রম করে, কয়েক সপ্তাহে শূন্যের দিকে ফিরে আসে এবং আবার threshold অতিক্রম করে। কোনো pair mean reversion বন্ধ করে দিলে সেটি threshold-এর বাইরে স্থির হয়ে থাকে। চার্টে এর ফলে মাঝামাঝি বিন্দু থেকে অনেক দূরে একটি দীর্ঘ সমতল অংশ দেখা যায়।

কয়েনটিগ্রেটেড spread কি সবসময় ফিরে আসে?

না। এটি বোঝার নির্ভরযোগ্য উপায় হলো প্রতিটি শুরুর অবস্থার পর কী ঘটেছে, তা মাপা। নিচের প্যানেলে 2019 থেকে 2025 সালের শেষভাগ পর্যন্ত প্রতিটি সেশনকে ওই দিনের z score অনুযায়ী bucket-এ ভাগ করা হয়েছে। এরপর একই spread-এর 20 সেশন পরের গড় z score দেখানো হয়েছে। এখানে fitted spread-এর পরিবর্তে price ratio-এর log ব্যবহার করা হয়েছে। ফলে পরে করা কোনো regression-এর প্রভাব চার্টে পড়েনি।

কুয়েরিশুরুর z স্কোর অনুযায়ী, 20 সেশন পরে KO/PEP স্প্রেড কোথায় ছিল (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-এ শুরু হওয়া সেশনগুলোর ওই দিনের গড় ছিল -2.42। একই spread 20 সেশন পরে, 138টি সেশনের ভিত্তিতে, গড়ে -0.84 ছিল। বিপরীত প্রান্তে, z above 2 bucket 2.64 থেকে শুরু হয়েছিল এবং 20 সেশন পরে এর মান ছিল 0.92। দুই প্রান্ত থেকেই শূন্যের দিকে টানা বক্ররেখাই mean reversion-এর বৈশিষ্ট্য।

Count column-টি সামনে রেখে চার্টটি পড়ুন। বাইরের bucket-গুলোতে সেশনের সংখ্যা সবচেয়ে কম। একই bucket-এর সেশনগুলোর মধ্যে বড় ধরনের overlap আছে। তাই অল্প কয়েকটি দীর্ঘ সময়পর্বই অধিকাংশ row তৈরি করে। কোনো গড় একক entry সম্পর্কে নিশ্চয়তা দেয় না।

পেয়ার্স ট্রেডিং কেন কাজ করা বন্ধ করে?

হেজ রেশিও কোনো স্থির সংখ্যা নয়। প্রতি ক্যালেন্ডার বছরে এটি নতুন করে নির্ণয় করলে রেশিও বদলে যায়।

কুয়েরিপ্রতি ক্যালেন্ডার বছরে পুনরায় ফিট করা হেজ অনুপাত, 2টি খাতভিত্তিক জোড়া
প্রতিটি সংখ্যার পেছনের সঠিক 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 সময়পর্বে KO-এর তুলনায় PEP-এর slope মাপা হয়েছে। তুলনার জন্য পাশে দ্বিতীয় sector pair-টিও দেখানো হয়েছে। পুরো ইতিহাসের ওপর একটি slope নির্ণয় করে প্রথম দিন থেকেই সেটি দিয়ে ট্রেড করলে প্রতিটি প্রাথমিক ট্রেডে এমন একটি সংখ্যা ব্যবহার করা হয়, যা সেই সময় কোনো ট্রেডারের হাতে থাকতে পারত না। সমাধানটি সরল, কিন্তু কার্যকর: trailing window ব্যবহার করে slope নতুন করে নির্ণয় করুন এবং প্রতিটি দিনের জন্য ওই দিনে উপলভ্য parameters দিয়ে score হিসাব করুন। একটি পুনরুৎপাদনযোগ্য backtest অন্য কাউকে এই নিয়মানুবর্তিতা যাচাই করার সুযোগ দেয়।

Corporate action রাতারাতি একটি leg-এর বৈশিষ্ট্য বদলে দেয়। 4-for-1 split হলে একটি শেয়ার চারটি শেয়ারে পরিণত হয় এবং quoted price এক-চতুর্থাংশে নেমে আসে। ফলে unadjusted price-এর ওপর ওই তারিখ পেরিয়ে হিসাব করা spread এমন একটি স্তরে লাফ দেয়, যেখানে কখনও ট্রেড হয়নি। Merger, spin-off এবং index পরিবর্তনও একই ধরনের ঘটনা ঘটায়, তবে অনেক সময় নীরবে। শুরুতেই split-adjusted price history ব্যবহার করুন। মনে রাখুন, কোনো ticker symbol সম্পূর্ণ ভিন্ন একটি কোম্পানির নামে পুনরায় বরাদ্দ হতে পারে। এটাই কেন ticker symbol dataset-এ সমস্যা তৈরি করে

Break এবং সুযোগ ঘটার সময় দেখতে একই রকম লাগে। কোনো pair-এর ইতিহাসে সর্বোচ্চ z score হয়তো তার দেওয়া সেরা entry, অথবা সম্পর্কটি ভেঙে যাওয়ার পরের প্রথম সপ্তাহ। ওই দিন দুটিই stretched spread হিসেবে দেখা যায়। পরিসংখ্যান যে ঝুঁকি মাপতে পারে না, position sizing সেখানে গুরুত্বপূর্ণ ভূমিকা নেয়। Kelly criterion position sizing এবং volatility targeting position sizing—এই দুটি framework নির্ধারণ করে একটি spread account-এর কতটা মূলধনকে প্রভাবিত করতে পারবে। আর maximum drawdown দেখায়, mean-এর ভুল দিকে দীর্ঘ সময় অবস্থান করলে equity curve-এ কী প্রভাব পড়ে।

Rolling z score কোনো cointegration test নয়। এর জন্য আনুষ্ঠানিক test আছে। Engle-Granger procedure প্রথমে regression চালায়, তারপর অবশিষ্ট spread stationary কি না তা পরীক্ষা করে। Johansen test এই ধারণাকে দুইটির বেশি নামের ক্ষেত্রেও প্রয়োগ করে। z score ধরে নেয় যে ওই বৈশিষ্ট্যটি বিদ্যমান, কিন্তু স্থিতিশীল mean না থাকা spread-এর ক্ষেত্রেও এটি সহজেই বড় সংখ্যা দেখাতে পারে। কারণ কোনো trending series নিজের trailing average থেকে দীর্ঘ সময় অনেক দূরে অবস্থান করতে পারে।

ডেটা-সংক্রান্ত নোট এবং এই সংখ্যাগুলোতে যা অন্তর্ভুক্ত নয়

Correlation panel-এ 2024-01-01 থেকে 2025-12-31 পর্যন্ত daily close ব্যবহার করা হয়েছে। পরপর close থেকে return হিসাব করা হয়েছে এবং প্রতিটি নামের প্রথম session বাদ দেওয়া হয়েছে। z score trace-এ শুধু 2023 সালের close ব্যবহার করে hedge ratio নির্ণয় করা হয়েছে। এরপর 2024 এবং 2025 সালের জন্য trailing 63-session mean ও sample standard deviation ব্যবহার করে score হিসাব করা হয়েছে। প্রতি সপ্তাহের শেষ reading নেওয়া হয়েছে। Reversion panel-এ 2018 সাল থেকে history নেওয়া হয়েছে এবং 2019 সাল থেকে ফলাফল দেখানো হয়েছে। তাই score করা প্রতিটি দিনের পেছনে একটি পূর্ণ trailing window রয়েছে। Sample-টি 2025 সালের November-এর মাঝামাঝি থামানো হয়েছে, যাতে sample-এর ভেতরে প্রতিটি দিনের পরের 20টি session থাকে।

এই panel-গুলোর কোনোটিই একটি strategy নয়। এতে trading cost, bid-ask spread, short leg-এর borrow fee, dividend বা financing cost অন্তর্ভুক্ত নেই। শুধু closing price ব্যবহার করা হয়েছে। অর্থাৎ close-এ চিহ্নিত entry এমন একটি entry, যেখানে বাস্তবে কোনো ট্রেডার order পূরণ করাতে পারতেন না।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

correlation এবং cointegration-এর মধ্যে পার্থক্য কী?

Correlation দেখায়, দুটি শেয়ার একই দিনে একই দিকে ওঠানামা করে কি না। এর মান -1 থেকে +1-এর মধ্যে থাকে। Cointegration দেখায়, তাদের দামের ব্যবধান একটি স্থিতিশীল সীমার মধ্যে থাকে কি না। কোনো জোড়ার correlation বেশি হলেও cointegration নাও থাকতে পারে। সাধারণত এ কারণেই correlation screen এমন জোড়া বেছে নেয়, যেগুলো পরে পরস্পর থেকে দূরে সরে যায়।

pairs trading-এ hedge ratio কীভাবে হিসাব করা হয়?

একটি শেয়ারের দামকে অন্যটির দামের বিপরীতে বসিয়ে একটি সরলরেখা fit করুন। ওই রেখার slope-ই hedge ratio। এটি দেখায়, দ্বিতীয় শেয়ারের 1 unit-এর ঝুঁকি সমন্বয় করতে প্রথম শেয়ারের কত unit প্রয়োজন। এই অনুপাত পরিবর্তনশীল। তাই অধিকাংশ implementation পুরো sample-এ একবার fit না করে trailing window ব্যবহার করে পুনরায় fit করে।

pairs traders প্রবেশ ও প্রস্থানের জন্য কোন z score ব্যবহার করেন?

Tutorial-এ সাধারণত trailing mean থেকে 1.5 থেকে 2 standard deviation দূরে গেলে entry এবং প্রায় 0.5-এ exit দেখানো হয়। এগুলো পরিমাপ করে পাওয়া সর্বোত্তম মান নয়। আগের লেখাগুলো থেকে প্রচলিত হয়ে আসা convention। মান পরিবর্তন করলে trade-এর সংখ্যা এবং প্রতিটি trade কতক্ষণ ধরে রাখা হয়, দুটিই বদলে যায়।

correlation কম হলেও কি দুটি শেয়ার cointegrated হতে পারে?

হ্যাঁ। Correlation হিসাব করা হয় দৈনিক পরিবর্তনের ওপর। Cointegration হিসাব করা হয় দামের ব্যবধানের level-এর ওপর। তাই যেসব শেয়ারের দৈনিক ওঠানামা খুব কমই একই দিকে হয়, তাদের দীর্ঘমেয়াদি দামের ব্যবধান তবু স্থিতিশীল থাকতে পারে। এর বিপরীত ঘটনাও ঘটে: দৈনিক correlation বেশি, কিন্তু ব্যবধান বছর বছর বাড়তে থাকে।

cointegrated pair কেন আর কাজ করা বন্ধ করে?

দামের ব্যবধানকে স্থিতিশীল রাখা সম্পর্কটি বদলে যেতে পারে। এর কারণ হতে পারে merger, spin-off, কোনো কোম্পানির business mix-এর পরিবর্তন, অথবা index পরিবর্তনের ফলে কোন বিনিয়োগকারীরা শেয়ারটি ধারণ করছেন তাতে বদল। Break-এর আগের দিনগুলোর statistics দেখতে সাধারণ reversion-এর আগের দিনগুলোর মতোই হতে পারে। তাই এই ঝুঁকির জন্য position size নির্ধারণ করতে হয়; আগে থেকে এটি নির্ভুলভাবে অনুমান করা যায় না।


এখানে প্রতিটি panel-এর সঙ্গে সঠিক SQL দেওয়া থাকে। তাই window, fit period এবং bucket edge—সবই দেখা যায়। আপনি যে pair অনুসরণ করছেন, সেটিতে একই spread এবং z score চালাতে Strasmore terminal-এ plain English-এ প্রশ্নটি লিখুন।

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