Pairs Trading 2 · Cointegration
กราฟราคาสองเส้นอาจดูคล้ายกัน แต่ส่วนต่างของมันอาจเคลื่อนห่างออกไปเรื่อย ๆ
ตอนแรก แยกกำไรขาดทุนของ Long–Short แล้ว ตอนนี้เราจะตรวจสมมติฐานที่ทำให้กลยุทธ์ซื้อด้านอ่อนและขายด้านแข็งมีเหตุผล หากส่วนต่างกำลังเปลี่ยนไปอย่างถาวร การรอให้มันกลับอาจทำให้ถือขาดทุนนานขึ้น
Correlation บอกการเคลื่อนไหวร่วมกัน
Correlation ของผลตอบแทนบอกความสัมพันธ์เชิงเส้นในช่วงข้อมูลที่วัด ค่าใกล้ 1 หมายถึงวันที่ A ให้ผลตอบแทนสูงกว่าค่าเฉลี่ย B ก็มักให้ผลตอบแทนสูงกว่าค่าเฉลี่ยด้วย มันไม่ได้กำหนดว่าราคาสองเส้นต้องกลับมามีส่วนต่างเท่าเดิม
ลองสร้างอนุกรมจากช็อกอิสระสองชุด โดย และ เป็น random walk
หากช็อกแต่ละชุดมี variance เท่ากัน correlation ของผลต่างหนึ่งช่วงเท่ากับ แต่ ยังเป็น random walk และ variance โตตามเวลา ตัวอย่างนี้เป็นระดับอนุกรมสมมติ ผลต่างของระดับยังไม่ใช่เปอร์เซ็นต์ผลตอบแทนของหุ้น
เลื่อนกราฟแนวนอนบนจอเล็ก หรือแตะกราฟเพื่อเปิดขนาดเต็ม
Cointegration ตรวจส่วนผสมของอนุกรม
สำหรับกรณีสองตัวแปรที่เราจะใช้ ถ้า และ เป็น I(1) คือไม่ stationary ในระดับ แต่ผลต่างลำดับหนึ่งเป็น I(0) และมีค่าคงที่ ที่ทำให้
เป็น I(0) เราเรียกว่าคู่นี้มี cointegration โดย คือ residual หรือ spread ที่นิยามด้วยสมการนี้ ทบทวน stationarity ได้ก่อนอ่านต่อ การเรียก I(0) ต้องอาศัยสมมติฐานเรื่องกระบวนการและความสัมพันธ์ตามเวลา มากกว่าดูว่าเส้นหนึ่งดูราบ
ตัวอย่างที่เรากำหนดโครงสร้างเองคือ
มี stochastic trend ส่วน เป็น AR(1) ที่ และเริ่มจากการแจกแจง stationary การลบ ออกจาก A จะเหลือ การลบราคา A−B ตรง ๆ กลับเหลือ ซึ่งยังมี trend ร่วมติดอยู่ ค่า h จึงเปลี่ยนสิ่งที่เรากำลังทดสอบ
แบบจำลองเชิงบวกสำหรับราคาหุ้นจริงอาจใช้ log price แต่ห้ามสลับหน่วยกลางทาง ถ้าสัญญาณเป็น สัมประสิทธิ์ h เป็นความสัมพันธ์ใน log scale; ส่วน P&L ต้องคำนวณจากจำนวนหุ้นและราคาซื้อขายจริง
สองภาพ: Correlation กับ Cointegration แยกกันได้
ในสองรูปนี้ correlation วัดจากผลต่างหนึ่งช่วง และ ไม่ใช่ correlation ของระดับราคา และไม่ใช่เปอร์เซ็นต์ผลตอบแทน ทั้งคู่ใช้ข้อมูลจำลอง 500 จุด พร้อมแสดงระดับอนุกรมด้านบน กราฟกระจายของผลต่างด้านล่างซ้าย และ spread ด้านล่างขวา
Cointegration without correlation
ให้ เป็น random walk ที่ช็อกแต่ละช่วงมี variance 1 และ เป็น white noise อิสระจาก X มี mean 0 และ variance 0.5 แล้วกำหนด
ทั้ง A และ B มีแนวโน้มสุ่มร่วมกัน แต่ เป็น stationary จึงมี cointegration ขณะที่ และ มี covariance เท่ากับ ดังนั้น correlation ของผลต่างหนึ่งช่วงตามแบบจำลองจึงเป็นศูนย์ ค่าที่วัดจากตัวอย่างจำนวนจำกัดอาจไม่เท่ากับศูนย์พอดี
เลื่อนกราฟแนวนอนบนจอเล็ก หรือแตะกราฟเพื่อเปิดขนาดเต็ม
Correlation without cointegration
กลับมาที่ และ โดย X กับ Y เป็น random walk อิสระ ช็อกของทั้งสองมี variance 1 ผลต่างหนึ่งช่วงมี correlation แต่ spread ไม่ stationary เมื่อเริ่ม จะมี variance เท่ากับ
แม้เปลี่ยน hedge ratio เป็น h ก็ยังเหลือ ไม่มีค่าคงที่ h ที่หักแนวโน้มสุ่มอิสระทั้งสองออกได้พร้อมกัน จึงไม่มี cointegration ในแบบจำลองนี้
เลื่อนกราฟแนวนอนบนจอเล็ก หรือแตะกราฟเพื่อเปิดขนาดเต็ม
สถานะ cointegration ของสองตัวอย่างนี้ทราบจากสมการที่ใช้สร้างข้อมูล ไม่ได้ตัดสินจากหน้าตากราฟหรือการผ่านเกณฑ์ correlation ดู seed สมมติฐาน และค่าที่คำนวณได้
ประมาณความสัมพันธ์โดยใช้เฉพาะข้อมูลฝึก
ในช่วง formation หรือ train เราหา ด้วย OLS ของ A บน B แล้วตรวจ residual ด้วยวิธี Engle–Granger การทดสอบนี้ใช้สมมติฐานว่าอนุกรมอินพุตเป็น I(1) และใช้ critical values ที่เหมาะกับ residual ซึ่งได้จากการประมาณ regression มาแล้ว
from statsmodels.tsa.stattools import coint
# a_train and b_train contain synchronized training observations only.
statistic, p_value, critical_values = coint(
a_train, b_train, trend="c", maxlag=5, autolag="aic"
)
H₀ ของคำสั่งนี้คือไม่มี cointegration ถ้า p-value ต่ำกว่าเกณฑ์ที่กำหนดไว้ เช่น 0.05 เราปฏิเสธ H₀ ภายใต้ข้อสมมติของการทดสอบ p=0.01 ไม่ได้แปลว่า spread จะกลับด้วยโอกาส 99% และการปฏิเสธ H₀ ไม่ได้บอกว่าจะกลับเมื่อไรหรือทำกำไรหลังต้นทุนได้เท่าไร ดูนิยามพารามิเตอร์และผลลัพธ์ที่ statsmodels: coint
Notebook ประกอบแสดงผลทดสอบจากชุดจำลองจริงและระบุค่าที่ส่งให้ฟังก์ชัน ค่าทดสอบอาจต่างกันเมื่อเปลี่ยน trend term, lag, หน้าต่างข้อมูล หรือสลับตัวแปรตามกับตัวแปรอิสระ ควรบันทึกการตัดสินใจเหล่านี้ก่อนเห็นผลช่วงทดสอบ
หากมีหุ้น 100 ตัว จะมี 4,950 คู่ให้ลอง ภายใต้กรณีสมมติที่ทุก H₀ เป็นจริงและแต่ละการทดสอบมีขนาด 5% จำนวนการปฏิเสธผิดที่คาดหมายคือ 247.5 คู่ แม้การทดสอบจะไม่อิสระจากกัน ตัวเลขนี้ใช้สอน multiple testing ไม่ใช่จำนวนคู่ผิดที่ทราบล่วงหน้าในข้อมูลจริง การจำกัด universe ด้วยเหตุผลทางเศรษฐศาสตร์และการควบคุม false discovery ช่วยลดการคัดจากผลที่ดูดีโดยบังเอิญได้
เปลี่ยน h แล้วดูว่าเหลืออะไรใน Spread
ข้อมูลในตัวทดลองมี 500 วันสมมติ ใช้ 250 วันแรกประมาณความสัมพันธ์ จากนั้นตรึงค่าประมาณไว้ ส่วนตัวเลือกความสัมพันธ์เปลี่ยน ให้ residual หลัง train เดินแบบ random walk การทำเช่นนี้สร้างเหตุการณ์ที่สมมติฐาน mean reversion ใช้ต่อไม่ได้โดยตั้งใจ
ปรับ h ให้ห่างจากค่าที่ประมาณได้ แล้วดูกราฟ residual อีกครั้ง เส้นที่เคยแกว่งรอบระดับเดิมจะมีส่วนของ trend เหลือมากขึ้น ตัวทดลองแสดงกลไกจากข้อมูลที่สร้างเอง จึงไม่แสดง p-value ที่แต่งขึ้นเพื่อให้หน้าตาดูเหมือนผลทดสอบตลาด
Half-life เป็นความเร็วภายใต้แบบจำลอง
ถ้าใช้ AR(1) แบบง่ายกับ spread ที่หัก mean แล้ว
เมื่อ จะได้ half-life ประมาณ 3.11 ช่วงสังเกต ถ้าข้อมูลเป็นรายวัน หน่วยก็คือวันซื้อขาย นี่คือเวลาที่ค่าคาดหมายของส่วนเบี่ยงเบนลดลงครึ่งหนึ่ง ไม่ใช่วันนัดที่ทุกเส้นทางจะกลับถึงเป้าหมาย
เมื่อประมาณ สูตรนี้ไม่ให้ half-life ของการลู่กลับตามแบบจำลอง ถ้า การตอบสนองจะสลับเครื่องหมายและต้องอธิบายอีกแบบ แม้ ช่วงความไม่แน่นอนของค่าประมาณและการเปลี่ยนโครงสร้างก็ยังมีผลต่อการกำหนดเวลาถือ
ก่อนแปลง spread เป็นสัญญาณ เราต้องกำหนดด้วยว่า “ห่างมาก” เทียบกับระดับความผันผวนใด → ตอน 3 · Signals & Backtest
แหล่งอ่านต่อ
เส้นเรื่องได้รับแรงบันดาลใจจาก AlgoAddict: Idea of Cointegration และ ตอนประยุกต์ใช้ เราอธิบาย p-value ใหม่และแยกข้อมูล train เพื่อหลีกเลี่ยงการเห็นข้อมูลอนาคต ดู บันทึกแหล่งข้อมูล และ Notebook