Strasmore Research

กลยุทธ์ Pairs Trading และการใช้ Cointegration อธิบาย

อธิบายความแตกต่างระหว่าง Cointegration กับ Correlation ในการเทรดแบบ Pairs trading พร้อมขั้นตอนการสร้าง hedge ratio, spread และ z score จากราคาปิดจริงด้วยตนเองอย่างละเอียด

กลยุทธ์ Pairs trading และ Cointegration

Pairs trading และ Cointegration เป็นสิ่งที่ต้องใช้ควบคู่กัน กลยุทธ์นี้ตั้งอยู่บนสมมติฐานที่ว่าส่วนต่างระหว่างราคาหุ้นสองตัวจะกลับเข้าสู่ระดับที่มีเสถียรภาพเสมอ โดย Cointegration คือคุณสมบัติทางสถิติที่ยืนยันว่าส่วนต่างดังกล่าวมีอยู่จริง ในขณะที่ Correlation เป็นการวัดค่าในอีกรูปแบบหนึ่ง หุ้นสองตัวอาจมีค่า Correlation สูงแต่ราคาอาจแยกห่างจากกันอย่างถาวร ในทางกลับกัน หุ้นสองตัวที่การเคลื่อนไหวรายวันแทบไม่สอดคล้องกันเลยอาจรักษาระดับส่วนต่างให้คงที่ได้นานหลายปี

การสร้างแบบจำลองและการวิเคราะห์ความเสี่ยง

เนื้อหาส่วนนี้อธิบายวิธีการสร้าง hedge ratio, spread และ z score ด้วยตนเอง พร้อมทั้งวัดค่าทั้งสามจากราคาปิดจริง นอกจากนี้ยังให้ความสำคัญเท่าเทียมกันกับการวิเคราะห์กรณีที่การสร้างแบบจำลองเหล่านี้ล้มเหลว

Cointegration ในการเทรดแบบ Pairs trading คืออะไร

Correlation คือความสัมพันธ์ของการเคลื่อนไหวของราคาหุ้นสองตัวในแต่ละวันในเชิงเปอร์เซ็นต์ โดยมีค่าตั้งแต่ -1 ถึง +1 ซึ่งค่า +1 หมายความว่าหุ้นทั้งสองตัวปรับตัวขึ้นและลงพร้อมกันในทุกช่วงการซื้อขายที่นำมาวิเคราะห์ แต่ค่านี้ไม่ได้บ่งบอกถึงระยะห่างระหว่างราคาของหุ้นทั้งสองตัวแต่อย่างใด

Cointegration เป็นการระบุถึงระยะห่างดังกล่าว หากเรานำราคาหุ้น B มาลบด้วยราคาหุ้น A ที่คูณด้วยตัวคูณคงที่ค่าหนึ่ง แล้วพิจารณาส่วนต่างที่เหลือ หากอนุกรมของส่วนต่างที่เรียกว่า spread นี้ยังคงเคลื่อนไหวอยู่ในกรอบที่จำกัดแทนที่จะแยกตัวออกไปเรื่อย ๆ แสดงว่าหุ้นทั้งสองตัวนั้นมี Cointegration กัน แม้ว่าราคาของหุ้นแต่ละตัวจะสามารถเคลื่อนไหวไปในทิศทางใดก็ได้ แต่ตัวรวมของมันจะไม่เป็นเช่นนั้น

ภาพเปรียบเทียบที่ตำราส่วนใหญ่มักใช้คือสุนัขที่ถูกล่ามด้วยสายจูง ทั้งคนจูงและสุนัขต่างเดินไปตามเส้นทางที่ไม่สามารถคาดเดาได้บนถนน แต่สายจูงจะคอยรักษาระยะห่างระหว่างทั้งคู่ให้อยู่ในกรอบที่จำกัด Correlation คือการถามว่าทั้งสองก้าวเดินในจังหวะเดียวกันหรือไม่ ส่วน Cointegration คือการถามว่าสายจูงยังคงรั้งไว้ได้หรือไม่

ตารางด้านล่างนี้วัดแนวคิดแรกโดยใช้หุ้นห้าคู่ที่คุ้นเคยในช่วงปี 2024 ถึง มิถุนายน 2026 คอลัมน์ return_corr คือ Correlation ของการเคลื่อนไหวของราคาเป็นเปอร์เซ็นต์รายวัน ซึ่งเป็นสิ่งที่คนทั่วไปมักหมายถึงเมื่อพูดถึงคำนี้ ส่วนคอลัมน์ price_corr คือ 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 มีค่า Correlation ของผลตอบแทนอยู่ที่ 0.479 เทียบกับ Correlation ของราคาที่ 0.508 ทั้งสองคอลัมน์ไม่ได้ตอบคำถามที่นักเทรดแบบ Pairs trading ต้องการทราบ เนื่องจากทั้งคู่เป็นการวัดการเคลื่อนไหวร่วมกัน แต่การเทรดประเภทนี้ต้องการการวัดระยะห่างระหว่างกัน

วิธีการคำนวณ Hedge ratio และ Spread เป็นอย่างไร

มีห้าขั้นตอนตามลำดับ โดยใช้ข้อมูลราคาปิดสองชุด ภาษา Python พื้นฐานสามารถจัดการได้ทั้งหมดโดยใช้เพียง math เป็นตัวนำเข้าข้อมูลเพียงอย่างเดียว ไม่ต้องใช้แพ็กเกจอื่น ไม่ต้องพึ่งพาผู้ให้บริการข้อมูล และไม่ต้องเชื่อมต่อเครือข่าย

  1. ปรับค่าเฉลี่ยของแต่ละชุดข้อมูลให้เป็นศูนย์ (Center): mean_a = sum(a) / len(a) และทำเช่นเดียวกันสำหรับรายการ b
  2. คำนวณ Hedge ratio: คือค่าความชันของเส้นตรงที่แสดงความสัมพันธ์ของ 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: spread = [b[i] - beta * a[i] for i in range(len(a))] สำหรับคู่สินทรัพย์ที่มีความสัมพันธ์เชิงปริมาณร่วมกัน (cointegrated pair) ค่านี้จะแกว่งตัวอยู่รอบระดับหนึ่งแทนที่จะเป็นแนวโน้มขาขึ้นหรือขาลง
  4. กำหนดช่วงเวลาแบบย้อนหลัง (Trailing window): ด้วย 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 เท่ากับสอง หมายความว่า Spread อยู่สูงกว่าค่าเฉลี่ยย้อนหลังของตัวมันเองสองเท่าของส่วนเบี่ยงเบนมาตรฐาน

รายการราคาที่กำหนดไว้ล่วงหน้าสองชุดก็เพียงพอสำหรับการทดสอบการทำงาน และการใช้ win เท่ากับห้าจะช่วยให้ตัวอย่างจำลองนี้อ่านเข้าใจง่าย สำหรับการทำงานจริงจะใช้ค่าที่ใกล้เคียงกับหกสิบสามช่วงการซื้อขาย ซึ่งคิดเป็นประมาณหนึ่งไตรมาส ส่วนเกณฑ์ที่ระดับหนึ่งจุดห้าสำหรับการเข้าซื้อและศูนย์จุดห้าสำหรับการขายออกนั้น เป็นข้อตกลงที่ส่งต่อกันมาจากบทเรียนหนึ่งสู่อีกบทเรียนหนึ่ง ไม่ใช่ผลลัพธ์จากการวิจัย และไม่มีสิ่งใดในแผงข้อมูลด้านล่างที่กำหนดค่าเหล่านี้ขึ้นมา

Z-score ของการเทรดแบบ Pairs trading บนราคาจริงมีลักษณะอย่างไร

นี่คือการคำนวณแบบเดียวกันกับหุ้นกลุ่มเครื่องดื่มที่เป็นที่รู้จักอย่างดีสองตัว ได้แก่ KO และ PEP โดยค่า Hedge ratio มาจากราคาปิดของปี 2023 เท่านั้น จากนั้นจึงคงค่านี้ไว้ตลอดปี 2024 และ 2025 ซึ่งเป็นช่วงเวลาที่กราฟครอบคลุม การปรับค่าความชัน (Slope) บนกลุ่มตัวอย่างเดียวกับที่คุณนำไปคำนวณคะแนนนั้นถือเป็น Look-ahead bias ในการทำ Backtesting และการแยกช่วงเวลาที่ใช้ปรับค่า (Fitting window) ออกจากช่วงเวลาที่ใช้คำนวณคะแนน (Scoring window) คือวิธีป้องกันที่ง่ายที่สุด

คำสั่งดึงข้อมูลZ-score รายสัปดาห์ของส่วนต่างราคา KO/PEP โดยคำนวณ Hedge ratio จากข้อมูลปี 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-score ระดับ -1.53 และสิ้นสุดที่ -0.68 ขอให้พิจารณาจากรูปทรงของกราฟมากกว่าจุดใดจุดหนึ่งเพียงจุดเดียว คู่สินทรัพย์ที่มีพฤติกรรมเป็นไปตามสมมติฐานของกลยุทธ์จะตัดผ่านเส้นเกณฑ์ ใช้เวลาสองสามสัปดาห์ในการปรับตัวกลับเข้าหาค่าศูนย์ แล้วจึงตัดผ่านเส้นเกณฑ์อีกครั้ง ส่วนคู่สินทรัพย์ที่หยุดการกลับเข้าสู่ค่าเฉลี่ย (Mean reverting) จะค้างอยู่นอกเส้นเกณฑ์และอยู่ที่นั่น ซึ่งบนกราฟจะมีลักษณะเป็นเส้นราบยาวที่อยู่ห่างจากจุดกึ่งกลาง

Spread ที่มีความสัมพันธ์เชิงร่วม (cointegrated) จะกลับเข้าสู่ค่าเฉลี่ยเสมอไปหรือไม่

คำตอบคือไม่ และวิธีที่ตรงไปตรงมาที่สุดในการพิจารณาเรื่องนี้คือการวัดผลลัพธ์ที่เกิดขึ้นจริงจากทุกจุดเริ่มต้น ตารางด้านล่างนี้แบ่งกลุ่มข้อมูลแต่ละเซสชันตั้งแต่ปี 2019 จนถึงช่วงปลายเดือนมิถุนายน 2026 ตามค่า z score ของวันนั้นๆ จากนั้นจึงรายงานค่าเฉลี่ย z score ของ spread เดียวกันในอีกยี่สิบเซสชันถัดมา โดยใช้ค่า log ของอัตราส่วนราคาแทนการใช้ spread ที่ผ่านการปรับแต่ง ดังนั้นจึงไม่มีการประมาณการด้วยสมการถดถอย (regression) ใดๆ ที่ทำขึ้นภายหลังมาเกี่ยวข้องกับแผนภูมินี้

คำสั่งดึงข้อมูลตำแหน่งของส่วนต่างราคา KO/PEP ในอีก 20 วันทำการถัดไป จำแนกตามค่า Z-score เริ่มต้น (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 ในอีกยี่สิบเซสชันต่อมา เส้นโค้งที่ดึงเข้าหาศูนย์จากทั้งสองฝั่งคือลักษณะของการกลับเข้าสู่ค่าเฉลี่ย (mean reversion)

โปรดอ่านข้อมูลโดยพิจารณาคอลัมน์จำนวนนับประกอบ กลุ่มข้อมูลที่อยู่ด้านนอกสุดจะมีจำนวนเซสชันน้อยที่สุด และเซสชันภายในกลุ่มเดียวกันมีความซ้อนทับกันสูง ดังนั้นช่วงเวลาที่ยาวนานเพียงไม่กี่ช่วงจึงเป็นที่มาของข้อมูลส่วนใหญ่ในตาราง ค่าเฉลี่ยไม่ใช่คำมั่นสัญญาสำหรับรายการใดรายการหนึ่งโดยเฉพาะ

เหตุใดกลยุทธ์ Pairs trading จึงหยุดทำงาน

Hedge ratio ไม่ใช่ค่าคงที่ หากปรับค่าใหม่ในแต่ละปีปฏิทิน ค่าดังกล่าวจะเปลี่ยนแปลงไป

คำสั่งดึงข้อมูลHedge ratio ที่ปรับปรุงใหม่ในแต่ละปีปฏิทินสำหรับ 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

ความชันของ PEP เทียบกับ KO ที่วัดได้ 2.338 ในช่วง 2019 และ -0.543 ในช่วง 2025 โดยมีคู่สินทรัพย์ในกลุ่มอุตสาหกรรมที่สองเปรียบเทียบไว้ข้างกัน การทำ Backtest ที่ใช้ความชันค่าเดียวตลอดประวัติข้อมูลแล้วนำมาเทรดตั้งแต่วันแรก จะทำให้การเทรดในช่วงต้นได้รับตัวเลขที่ไม่มีใครสามารถถือครองได้จริงในขณะนั้น วิธีแก้ไขนั้นเรียบง่ายและได้ผล คือการปรับค่าใหม่บนหน้าต่างเวลาแบบเลื่อน (trailing window) และให้คะแนนแต่ละวันด้วยพารามิเตอร์ที่มีอยู่จริงในวันนั้น การทำ Backtest ที่ทำซ้ำได้ จะช่วยให้ผู้อื่นสามารถตรวจสอบวินัยในการเทรดดังกล่าวได้

การดำเนินการของบริษัท (Corporate actions) เปลี่ยนแปลงสถานะของสินทรัพย์หนึ่งขาข้ามคืน การแตกหุ้น (split) ในอัตราสี่ต่อหนึ่งทำให้หุ้นหนึ่งหุ้นกลายเป็นสี่หุ้นและราคาตลาดลดลงเหลือหนึ่งในสี่ ส่งผลให้ Spread ที่คำนวณข้ามวันดังกล่าวโดยใช้ราคาที่ไม่ได้ปรับปรุงกระโดดไปยังระดับที่ไม่เคยมีการซื้อขายจริงมาก่อน การควบรวมกิจการ การแยกบริษัท (spin-off) และการเปลี่ยนแปลงดัชนีก็ส่งผลในลักษณะเดียวกันแต่รุนแรงน้อยกว่า ควรเริ่มต้นด้วย ประวัติราคาที่ปรับปรุงผลจากการแตกหุ้นแล้ว และพึงระลึกว่า Ticker symbol อาจถูกนำไปใช้กับบริษัทอื่นโดยสิ้นเชิง ซึ่งเป็น เหตุผลที่ Ticker symbol ทำให้ชุดข้อมูลเสียหาย

จุดที่กลยุทธ์ล้มเหลวและโอกาสในการทำกำไรดูเหมือนกันในขณะที่เกิดขึ้น ค่า Z-score ที่กว้างที่สุดที่คู่สินทรัพย์เคยทำได้ อาจเป็นจุดเข้าซื้อที่ดีที่สุดเท่าที่เคยมีมา หรืออาจเป็นสัปดาห์แรกของความสัมพันธ์ที่สิ้นสุดลงแล้ว ทั้งสองกรณีดูเหมือน Spread ที่ยืดออกในวันนั้น การกำหนดขนาดสถานะ (Sizing) จึงรับหน้าที่ในส่วนที่สถิติทำไม่ได้: การกำหนดขนาดสถานะตามเกณฑ์ Kelly และ การกำหนดขนาดสถานะตามเป้าหมายความผันผวน เป็นสองกรอบแนวคิดในการจำกัดว่า Spread หนึ่งรายการสามารถส่งผลต่อพอร์ตได้มากเพียงใด และ Maximum drawdown จะเป็นตัววัดว่าการที่ราคาค้างอยู่นอกค่าเฉลี่ยเป็นเวลานานส่งผลกระทบอย่างไรต่อเส้นกราฟมูลค่าพอร์ต (equity curve)

Rolling Z-score ไม่ใช่การทดสอบภาวะร่วมกัน (Cointegration test) การทดสอบอย่างเป็นทางการนั้นมีอยู่จริง กระบวนการ Engle-Granger จะทำการถดถอย (regression) จากนั้นจึงทดสอบ Spread ที่เหลือว่ามีภาวะนิ่ง (stationarity) หรือไม่ ส่วนการทดสอบ Johansen จะขยายแนวคิดนี้ไปมากกว่าสองสินทรัพย์ ค่า Z-score เป็นเพียงการตั้งสมมติฐานถึงคุณสมบัติที่การทดสอบเหล่านั้นตรวจสอบ และมันสามารถแสดงค่าตัวเลขที่สูงบน Spread ที่ไม่มีค่าเฉลี่ยที่เสถียรได้ เนื่องจากอนุกรมเวลาที่มีแนวโน้ม (trending series) จะอยู่ห่างจากค่าเฉลี่ยเคลื่อนที่ของตัวเองเสมอ

หมายเหตุข้อมูลและสิ่งที่ตัวเลขเหล่านี้ไม่ได้รวมไว้

แผงข้อมูลความสัมพันธ์ใช้ราคาปิดรายวันตั้งแต่วันที่ 1 มกราคม 2024 ถึง 31 ธันวาคม 2025 และคำนวณผลตอบแทนจากราคาปิดต่อเนื่อง โดยตัดเซสชันแรกของแต่ละชื่อออก เส้นกราฟ Z-score ปรับค่า Hedge ratio โดยใช้ราคาปิดของปี 2023 เท่านั้น จากนั้นจึงให้คะแนนปี 2024 และ 2025 ด้วยค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานกลุ่มตัวอย่างแบบย้อนหลัง 63 เซสชัน โดยสุ่มตัวอย่างถึงค่าอ่านล่าสุดของแต่ละสัปดาห์ แผงข้อมูลการกลับตัว (reversion panel) โหลดประวัติข้อมูลตั้งแต่ปี 2018 และรายงานผลตั้งแต่ปี 2019 เป็นต้นไป ดังนั้นทุกวันที่ให้คะแนนจะมีหน้าต่างข้อมูลย้อนหลังรองรับ และสิ้นสุดในกลางเดือนพฤศจิกายน 2025 เพื่อให้ทุกวันมีข้อมูลล่วงหน้าอีกยี่สิบเซสชันภายในกลุ่มตัวอย่าง

แผงข้อมูลเหล่านี้ไม่ใช่กลยุทธ์การเทรด ไม่มีการรวมต้นทุนการเทรด, Bid-ask spread, ค่าธรรมเนียมการยืมหุ้นในขา Short, เงินปันผล และต้นทุนทางการเงิน ข้อมูลเป็นเพียงราคาปิดเท่านั้น ซึ่งหมายความว่าจุดเข้าซื้อที่ระบุ ณ ราคาปิด คือจุดที่ไม่มีใครสามารถส่งคำสั่งซื้อขายได้จริงในราคานั้น

คำถามที่พบบ่อย

ความแตกต่างระหว่าง Correlation และ Cointegration คืออะไร

Correlation วัดว่าหุ้นสองตัวเคลื่อนไหวในวันเดียวกันและในทิศทางเดียวกันหรือไม่ โดยมีค่าตั้งแต่ลบหนึ่งถึงบวกหนึ่ง ส่วน Cointegration วัดว่าระยะห่างระหว่างราคาของหุ้นทั้งสองตัวยังคงอยู่ในกรอบที่เสถียรหรือไม่ หุ้นคู่หนึ่งอาจมีค่า Correlation สูงแต่ไม่ผ่านเกณฑ์ Cointegration ซึ่งเป็นสาเหตุปกติที่ทำให้การคัดกรองด้วย Correlation ได้หุ้นคู่ที่ราคาแยกห่างจากกันในภายหลัง

วิธีคำนวณ Hedge ratio ในการเทรดแบบ Pairs trading ทำอย่างไร

ให้สร้างเส้นตรงจากราคาหุ้นตัวหนึ่งเทียบกับอีกตัวหนึ่งแล้วหาค่าความชัน (slope) ค่าความชันนั้นคือจำนวนหน่วยของหุ้นตัวแรกที่ใช้ชดเชยหุ้นตัวที่สองหนึ่งหน่วย เนื่องจากค่านี้มีการเปลี่ยนแปลงตลอดเวลา การใช้งานส่วนใหญ่จึงใช้วิธีคำนวณใหม่ในช่วงเวลาที่เลื่อนไปเรื่อย ๆ (trailing window) แทนที่จะคำนวณเพียงครั้งเดียวจากข้อมูลทั้งหมด

นักเทรด Pairs trading ใช้ Z score เท่าใดในการเข้าและออกสถานะ

ตัวอย่างในบทเรียนมักใช้จุดเข้าที่ระดับหนึ่งจุดห้าถึงสองส่วนเบี่ยงเบนมาตรฐานจากค่าเฉลี่ยย้อนหลัง และออกสถานะใกล้ระดับศูนย์จุดห้า ตัวเลขเหล่านี้เป็นธรรมเนียมที่สืบทอดมาจากบทความในอดีตมากกว่าจะเป็นค่าที่เหมาะสมที่สุดจากการวัดจริง การปรับเปลี่ยนตัวเลขเหล่านี้จะส่งผลต่อทั้งจำนวนการเทรดและระยะเวลาในการถือครองสถานะ

หุ้นสองตัวสามารถมี Cointegration โดยที่ Correlation ต่ำได้หรือไม่

ได้ Correlation คำนวณจากการเปลี่ยนแปลงรายวัน ส่วน Cointegration คำนวณจากระดับของส่วนต่าง ดังนั้นหุ้นสองตัวที่การเคลื่อนไหวรายวันไม่ค่อยสอดคล้องกันก็ยังสามารถรักษาระยะห่างในระยะยาวให้เสถียรได้ ในทางกลับกันก็เกิดขึ้นได้เช่นกัน คือมี Correlation รายวันสูงแต่ส่วนต่างกลับกว้างขึ้นเรื่อย ๆ ในทุกปี

ทำไมหุ้นคู่ที่มี Cointegration ถึงหยุดทำงาน

ความสัมพันธ์ที่ยึดส่วนต่างไว้ด้วยกันอาจเปลี่ยนแปลงได้ เช่น การควบรวมกิจการ การแยกบริษัท การปรับเปลี่ยนโครงสร้างธุรกิจของบริษัทใดบริษัทหนึ่ง หรือการปรับดัชนีที่ส่งผลต่อผู้ถือหุ้น สถิติในช่วงวันก่อนที่ความสัมพันธ์จะขาดสะบั้นดูไม่ต่างจากช่วงวันก่อนที่ราคาจะกลับเข้าสู่ค่าเฉลี่ยปกติ ซึ่งเป็นส่วนที่ต้องบริหารจัดการขนาดสถานะ (sizing) แทนที่จะพยายามคาดการณ์


ทุกแผงข้อมูลที่นี่มาพร้อมกับคำสั่ง SQL ที่ใช้จริง ดังนั้นช่วงเวลา หน้าต่างการคำนวณ และขอบเขตของข้อมูลจึงสามารถตรวจสอบได้ทั้งหมด หากต้องการใช้ Spread และ Z score เดียวกันกับหุ้นคู่ที่คุณติดตาม สามารถสอบถามผ่านภาษาอังกฤษทั่วไปบน Strasmore terminal ได้ทันที

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