Strasmore Research

Pairs trading na cointegration: mwongozo wa kina

Elewa tofauti kati ya cointegration na correlation katika biashara ya jozi. Jifunze kuunda hedge ratio, spread, na z score kwa kutumia bei halisi za kufunga soko.

Biashara ya jozi na cointegration

Biashara ya jozi (pairs trading) na cointegration huenda pamoja: biashara hii hutegemea pengo kati ya bei mbili za hisa ambalo hurudi mara kwa mara kwenye kiwango thabiti, na cointegration ndiyo sifa ya kitakwimu inayothibitisha kuwa pengo hilo lipo. Correlation hupima kitu kingine tofauti. Hisa mbili zinaweza kuwa na correlation ya juu na bado zikaachana milele, na hisa mbili ambazo mienendo yao ya kila siku haioani vizuri zinaweza kudumisha pengo thabiti kwa miaka mingi.

0.479 Ujenzi wa mkakati

Ukurasa huu unajenga hedge ratio, spread, na z score kwa mikono, unapima vyote vitatu kwa kutumia bei halisi za kufunga soko (closing prices), na kisha unatumia nafasi sawa kuelezea jinsi ujenzi huu unavyoshindwa kufanya kazi.

Cointegration ni nini katika biashara ya pairs?

Correlation ni kipimo cha ukaribu wa mabadiliko ya asilimia ya kila siku ya hisa mbili. Hupimwa kuanzia -1 hadi +1, ambapo +1 inamaanisha kuwa hisa hizo zilipanda na kushuka pamoja katika kila kikao cha soko kwenye sampuli husika. Haisemi chochote kuhusu umbali uliopo kati ya bei hizo mbili.

Cointegration ni taarifa kuhusu umbali huo. Chukua hisa B, toa kiasi fulani cha hisa A kilichozidishwa kwa namba maalum, na uangalie kilichobaki. Ikiwa mfululizo huo uliobakia, yaani spread, utabaki ndani ya kiwango maalum badala ya kwenda mbali, basi hisa hizo mbili ziko cointegrated. Bei zenyewe zina uhuru wa kwenda popote, lakini mchanganyiko wake hauna uhuru huo.

Mfano unaotumiwa kwenye vitabu ni mbwa aliye kwenye kamba. Mtembezaji na mbwa wote huchukua njia zisizotabirika barabarani, lakini kamba huweka umbali kati yao ndani ya mipaka. Correlation huuliza kama wawili hao wanapiga hatua kwa wakati mmoja. Cointegration huuliza kama kamba inashikilia.

Jedwali hapa chini linapima wazo la kwanza kwa pairs tano zinazojulikana kuanzia mwaka 2024 hadi 2025. Safu ya return_corr ni correlation ya mabadiliko ya asilimia ya kila siku, ambayo ndiyo watu wengi wanamaanisha wanapotumia neno hilo. Safu ya price_corr ni correlation ya bei ghafi za kufungia soko, namba ambayo huonyesha matokeo mazuri kwa karibu hisa zozote mbili zilizopanda bei.

UlizaUwiano wa mapato ya kila siku dhidi ya uwiano wa viwango vya bei, jozi tano maarufu (2024-2025)
SQL halisi nyuma ya kila namba
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

Zikipangwa kwa kufuata correlation ya mabadiliko ya kila siku, HD / LOW inashika nafasi ya kwanza kwenye jedwali kwa 0.868, wakati correlation ya viwango vya bei mbili katika kipindi hicho hicho ilipima 0.849. Kwenye safu ya chini, AAPL / MSFT ina correlation ya mapato ya 0.479 ikifuatiwa na correlation ya bei ya 0.508. Hakuna safu inayojibu swali ambalo mfanyabiashara wa pairs anajiuliza. Zote mbili hupima mienendo ya pamoja, na biashara hii inahitaji kipimo cha umbali.

Jinsi ya kukokotoa hedge ratio na spread?

Hatua tano, kwa mpangilio, kwa kutumia orodha mbili za bei za kufunga soko. Python ya kawaida inatosha kwa yote haya kwa kutumia math kama import pekee: hakuna vifurushi vya ziada, hakuna muuzaji wa data, na hakuna mtandao.

  1. Kuweka kila mfululizo katika wastani wake. mean_a = sum(a) / len(a), na vivyo hivyo kwa orodha b.
  2. Kupata hedge ratio. Hii ni mteremko (slope) wa mstari ulionyooka wa B dhidi ya 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). Isome kama idadi ya vitengo vya A vinavyosawazisha kitengo kimoja cha B.
  3. Kujenga spread. spread = [b[i] - beta * a[i] for i in range(len(a))]. Katika jozi iliyounganishwa (cointegrated pair), mfululizo huu hubaki karibu na kiwango fulani badala ya kufuata mwelekeo wa kupanda au kushuka.
  4. Kutumia dirisha linalosonga (trailing window). Kwa kutumia w = spread[i - win + 1 : i + 1], wastani wa dirisha ni mu = sum(w) / len(w) na mkengeuko wa kawaida (standard deviation) wa sampuli ni sd = math.sqrt(sum((x - mu) ** 2 for x in w) / (len(w) - 1)). "Trailing" inamaanisha dirisha huishia kwenye siku inayopimwa na halitumii data yoyote baada ya hapo.
  5. Kupima na kuchapisha. z = (spread[i] - mu) / sd, kisha chapisha mstari wa kuingia wakati abs(z) > 1.5 na mstari wa kutoka pindi abs(z) < 0.5. Z-score ya mbili huweka spread katika mkengeuko wa kawaida mbili juu ya wastani wake wa hivi karibuni.

Orodha mbili za bei zilizowekwa kwa mikono zinatosha kuona mchakato huu ukiendelea, na win ya tano hufanya mfano huu rahisi usomeke vizuri. Kazi nzito hutumia takriban vipindi sitini na tatu, sawa na robo mwaka. Vizingiti hivyo, moja nukta tano kwa kuingia na sifuri nukta tano kwa kutoka, ni makubaliano yanayopitishwa kutoka mafunzo moja hadi mengine. Sio matokeo ya utafiti, na hakuna chochote katika paneli zilizo hapa chini kilichoviteua.

Z score ya pairs trading inaonekanaje kwenye bei halisi?

Hapa kuna hesabu hiyo hiyo kwa majina mawili makubwa ya vinywaji, KO na PEP. Hedge ratio inatokana na bei za kufunga za mwaka 2023 pekee, kisha inabaki bila kubadilika katika kipindi cha mwaka 2024 na 2025, ambacho ndicho chati inachokionyesha. Kupanga mteremko (slope) kwenye sampuli ileile unayotumia kupata score ni look-ahead bias katika backtesting, na kutenganisha kipindi cha kupanga na kipindi cha kupata score ndiyo njia rahisi zaidi ya kujilinda dhidi ya tatizo hilo.

UlizaZ score ya kila wiki ya spread ya KO/PEP, hedge ratio iliyokokotolewa kwa mwaka wa 2023 pekee
SQL halisi nyuma ya kila namba
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

Mchoro huu una 105 vipimo vya kila wiki. Unafungua dirisha kwenye z score ya -1.53 na kuliacha kwenye -0.68. Soma umbo la mchoro badala ya kuzingatia sehemu moja tu. Jozi inayotenda kama mkakati unavyodhani huvuka kizingiti chake, hutumia wiki chache kurejea kuelekea sifuri, na kuvuka tena. Jozi ambayo imeacha kurejea kwenye wastani (mean reverting) hukwama nje ya kizingiti na kubaki hapo, jambo ambalo kwenye chati huonekana kama mstari mrefu uliolala mbali na katikati.

Je, spread iliyounganishwa (cointegrated) hurudi katika hali yake ya kawaida kila wakati?

Hapana, na njia ya kweli ya kuona hili ni kupima kile kilichotokea baada ya kila hatua ya kuanzia. Paneli iliyo hapa chini huweka kila kikao kuanzia mwaka 2019 hadi mwishoni mwa 2025 katika makundi kulingana na z score ya siku hiyo, kisha inaripoti wastani wa z score ya spread hiyo hiyo baada ya vikao ishirini. Inatumia log ya uwiano wa bei badala ya spread iliyokokotolewa, hivyo hakuna regression iliyofanywa baada ya tukio inayohusika kwenye chati hii.

UlizaHali ya spread ya KO/PEP baada ya vipindi ishirini, kulingana na z score ya kuanzia (2019-2025)
SQL halisi nyuma ya kila namba
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

Vikao vilivyoanza katika kundi la z below -2 vilikuwa na wastani wa -2.42 siku hiyo, na spread hiyo hiyo ilikuwa na wastani wa -0.84 baada ya vikao ishirini, katika jumla ya vikao 138. Kwa upande mwingine, kundi la z above 2 lilianza katika 2.64 na kupima 0.92 baada ya vikao ishirini. Mviringo unaovutika kuelekea sifuri kutoka pande zote mbili ndiyo umbo linalotokana na mean reversion.

Isome huku ukizingatia safu ya idadi. Makundi ya nje yana vikao vichache zaidi, na vikao vilivyo ndani ya kundi huingiliana sana, kwa hivyo vipindi vichache virefu hutoa safu nyingi zaidi. Wastani si ahadi kuhusu ingizo lolote moja.

Kwa nini biashara ya pairs huacha kufanya kazi?

Hedge ratio si ya kudumu. Ikiwa utaifanyia marekebisho kila mwaka wa kalenda, hubadilika.

UlizaHedge ratio iliyorekebishwa kila mwaka wa kalenda, jozi mbili za sekta
SQL halisi nyuma ya kila namba
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

Mteremko wa PEP dhidi ya KO uliopimwa 2.338 katika 2019 na -0.543 katika 2025, pamoja na pair ya pili ya sekta kwa ajili ya kulinganisha. Backtest inayotumia mteremko mmoja kwa historia nzima na kuifanyia biashara tangu siku ya kwanza huipa kila biashara ya awali namba ambayo hakuna mtu angeweza kuwa nayo wakati huo. Suluhisho ni rahisi na lenye ufanisi: fanya marekebisho kwa kutumia trailing window, na upime kila siku kwa kutumia vigezo vilivyopatikana siku hiyo. Backtest inayoweza kurudiwa huifanya nidhamu hiyo kuweza kukaguliwa na mtu mwingine.

Hatua za kampuni hubadilisha upande mmoja wa biashara usiku mmoja. Mgawanyo wa hisa wa 4-for-1 hubadilisha hisa moja kuwa nne na kupunguza bei iliyonukuliwa kuwa robo, na spread iliyohesabiwa katika tarehe hiyo kwa bei zisizorekebishwa huruka hadi kiwango ambacho hakijawahi kufanyiwa biashara. Muunganiko wa kampuni, spin-offs, na mabadiliko ya fahirisi hufanya matoleo ya utulivu zaidi ya kitu kilekile. Anza na historia ya bei iliyorekebishwa kwa split, na uzingatie kuwa ticker inaweza kupewa kampuni nyingine kabisa, jambo ambalo ndilo kwa nini ticker symbols huvunja seti za data.

Kuvunjika kwa uhusiano na fursa huonekana sawa wakati vinapotokea. Z score pana zaidi ambayo pair imewahi kutoa ni ama fursa bora zaidi ya kuingia sokoni au ni wiki ya kwanza ya uhusiano ambao umekwisha. Yote mawili huonekana kama spread iliyopanuka siku hiyo. Ukubwa wa nafasi (sizing) hubeba uzito ambao takwimu haziwezi: Kelly criterion position sizing na volatility targeting position sizing ni mifumo miwili ya jinsi kiasi gani cha akaunti spread moja inaruhusiwa kuathiri, na maximum drawdown hupima kile ambacho muda mrefu wa kuwa upande usio sahihi wa wastani hufanya kwa equity curve.

Rolling z score si kipimo cha cointegration. Vipimo rasmi vipo. Utaratibu wa Engle-Granger hufanya regression, kisha hupima spread iliyobaki kwa ajili ya stationarity, na kipimo cha Johansen huongeza wazo hilo zaidi ya majina mawili. Z score huchukulia kuwa sifa ambazo vipimo hivyo huziangalia zipo, na itatoa namba kubwa kwa furaha kwenye spread isiyo na wastani thabiti hata kidogo, kwa sababu mfululizo unaoelekea upande mmoja (trending series) daima huwa mbali na wastani wake wa nyuma.

Data notes and what these numbers leave out

Jopo la correlation hutumia bei za kufunga za kila siku kuanzia 2024-01-01 hadi 2025-12-31 na huhesabu mapato kutoka kwa bei za kufunga zinazofuatana, ikiondoa kikao cha kwanza cha kila jina. Mchoro wa z score hufanya marekebisho ya hedge ratio kwa bei za kufunga za 2023 pekee, kisha hupima 2024 na 2025 kwa kutumia wastani wa vipindi 63 na sample standard deviation, ikichukuliwa hadi usomaji wa mwisho wa kila wiki. Jopo la reversion hupakia historia kuanzia 2018 na kutoa ripoti kuanzia 2019 na kuendelea, hivyo kila siku iliyopimwa ina trailing window kamili nyuma yake, na huishia katikati ya Novemba 2025 ili kila siku iwe na vipindi ishirini mbele yake ndani ya sampuli.

Hakuna hata moja ya majopo haya ambayo ni mkakati. Hayabebi gharama za biashara, hakuna bid-ask spread, hakuna ada ya kukopa kwa upande wa short, hakuna dividends na hakuna ufadhili. Bei za kufunga pekee, ambayo ina maana kuwa kuingia sokoni kuliowekwa alama kwenye bei ya kufunga ni kuingia ambako hakuna mtu angeweza kupata hapo.

Maswali Yanayoulizwa Mara kwa Mara

Kuna tofauti gani kati ya correlation na cointegration?

Correlation hupima kama hisa mbili husogea katika siku zilezile na kuelekea upande mmoja, kwa kipimo cha kuanzia hasi moja hadi chanya moja. Cointegration hupima kama umbali kati ya bei zao unabaki ndani ya kiwango thabiti. Jozi inaweza kuwa na alama ya juu kwenye kipimo cha kwanza na ikashindwa kwenye cha pili, jambo ambalo ndilo sababu ya kawaida ya skrini ya correlation kuonyesha jozi ambazo baadaye hutengana.

Je, unahesabuje hedge ratio katika biashara ya jozi (pairs trading)?

Chora mstari ulionyooka wa bei ya hisa moja dhidi ya nyingine na uchukue mteremko (slope) wake. Mteremko huo ndio idadi ya vitengo vya hisa ya kwanza vinavyosawazisha kitengo kimoja cha hisa ya pili, na ni kiasi kinachobadilika, kwa hivyo utekelezaji mwingi huufanyia marekebisho kwenye dirisha linalosonga badala ya kuufanya mara moja kwa sampuli nzima.

Je, ni z score gani ambayo wafanyabiashara wa jozi hutumia kuingia na kutoka sokoni?

Mifano ya mafunzo kwa kawaida huonyesha kuingia sokoni kukiwa na mkengeuko wa kawaida (standard deviations) kati ya moja nukta tano hadi mbili kutoka kwa wastani unaosonga, na kutoka sokoni kukiwa karibu na sifuri nukta tano. Namba hizo ni makubaliano yaliyorithiwa kutoka kwa maandiko ya awali badala ya kuwa viwango bora vilivyopimwa, na kuzibadilisha hubadilisha idadi ya biashara na muda ambao kila moja inashikiliwa.

Je, hisa mbili zinaweza kuwa cointegrated huku zikiwa na correlation ya chini?

Ndiyo. Correlation huhesabiwa kwa mabadiliko ya kila siku na cointegration kwa kiwango cha pengo, kwa hivyo majina mawili ambayo mienendo yao ya kila siku mara chache hulingana bado yanaweza kudumisha umbali thabiti wa muda mrefu. Kinyume chake pia hutokea: correlation ya juu ya kila siku pamoja na pengo linalozidi kupanuka mwaka baada ya mwaka.

Kwa nini jozi iliyo-cointegrated huacha kufanya kazi?

Kiungo kinachoshikilia pengo hilo kinaweza kubadilika: muunganiko wa kampuni, utengano wa biashara (spin-off), mabadiliko katika mchanganyiko wa biashara ya kampuni moja, au mabadiliko ya fahirisi yanayobadilisha nani anayemiliki hisa hiyo. Takwimu katika siku za kabla ya kuvunjika kwa uhusiano huo huonekana sawa na siku za kabla ya kurudi kwa hali ya kawaida, na hili ndilo sehemu ambayo lazima iwekewe ukubwa wa hatari badala ya kutabiriwa.


Kila paneli hapa inakuja na SQL kamili iliyo chini yake, kwa hivyo madirisha, kipindi cha fit, na mipaka ya vikundi vyote vinaonekana. Ili kuendesha spread na z score ileile kwenye jozi unayoifuatilia, uliza swali hilo kwa Kiingereza rahisi kwenye terminal ya Strasmore.

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