TRƯỜNG ĐẠI HỌC NGÂN HÀNG TP HỒ CHÍ MINH HIỆU ỨNG MOMENTUM TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM ĐỀ TÀI KHOA HỌC CẤP CƠ SỞ Người thực hiện Nguyễn Thị Yến Bùi Thị Thiện Mỹ Lê Thị Kim Anh TP HỒ CHÍ MINH – 2021 i MỤC LỤC MỤC LỤC i DANH MỤC NHỮNG CHỮ VIẾT TẮT iv DANH MỤC BẢNG BIỂU v DANH MỤC HÌNH vi PHẦN MỞ ĐẦU 1 1 Lý do chọn đề tài 1 2 Mục đích nghiên cứu 3 3 Đối tượng và phạm vi nghiên cứu 3 4 Khái quát phương pháp nghiên cứu 3 5 Những đóng góp mới của đề tài 4 6 Kết cấu của đề tài 5 CHƯƠNG 1 CƠ SỞ.
TRƯỜNG ĐẠI HỌC NGÂN HÀNG TP HỒ CHÍ MINH - HIỆU ỨNG MOMENTUM TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM ĐỀ TÀI KHOA HỌC CẤP CƠ SỞ Người thực hiện: Nguyễn Thị Yến Bùi Thị Thiện Mỹ Lê Thị Kim Anh TP HỒ CHÍ MINH – 2021 i MỤC LỤC MỤC LỤC i DANH MỤC NHỮNG CHỮ VIẾT TẮT iv DANH MỤC BẢNG BIỂU v DANH MỤC HÌNH vi PHẦN MỞ ĐẦU 1 Lý chọn đề tài Mục đích nghiên cứu 3 Đối tượng phạm vi nghiên cứu Khái quát phương pháp nghiên cứu Những đóng góp đề tài Kết cấu đề tài CHƯƠNG CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN NGHIÊN CỨU 1.1 Lý thuyết tài chuẩn tắc 1.1.1 Các mơ hình định giá 1.1.2 Lý thuyết thị trường hiệu 10 1.1.3 Ứng dụng lý thuyết tài chuẩn tắc 14 1.2 Lý thuyết tài hành vi 15 1.2.1 Tâm lý nhà đầu tư 15 1.2.2 Giới hạn giao dịch chênh lệch giá 18 1.2.3 Ứng dụng lý thuyết tài hành vi 20 1.3 Bất thường thị trường tài 20 1.3.1 Khái niệm bất thường 20 1.3.2 Các loại bất thường 21 1.4 Tổng quan hiệu ứng momentum 23 1.4.1 Bằng chứng hiệu ứng momentum thị trường nước 23 1.4.2 Nguyên nhân xảy hiệu ứng momentum 26 1.4.3 Nghiên cứu hiệu ứng momentum TTCK Việt Nam 34 1.4.4 Khoảng trống nghiên cứu 34 ii KẾT LUẬN CHƯƠNG 36 CHƯƠNG PHƯƠNG PHÁP NGHIÊN CỨU 37 2.1 Dữ liệu nghiên cứu 37 2.2 Đo lường momentum biến số rủi ro cổ phiếu 38 2.2.1 Đo lường momentum 38 2.2.2 Đo lường rủi ro thị trường beta 38 2.2.3 Đo lường quy mô 38 2.2.4 Đo lường giá trị 39 2.3 Chiến lược momentum: phân tích danh mục 40 2.3.1 Thành lập danh mục đầu tư 40 2.4 Các nhân tố tác động tới hiệu ứng momentum 41 2.5 Phương pháp hồi quy Fama – MacBeth 42 KẾT LUẬN CHƯƠNG 44 CHƯƠNG KẾT QUẢ NGHIÊN CỨU 45 3.1 Sơ lược thị trường chứng khoán Việt Nam 45 3.2 Khái quát mẫu nghiên cứu 47 3.2.1 Thống kê mô tả chung mẫu nghiên cứu 47 3.2.2 Thống kê mô tả danh mục 48 3.3 Bằng chứng hiệu ứng momentum 51 3.3.1 Lợi nhuận hiệu ứng momentum 51 3.3.2 Lợi nhuận hiệu ứng momentum sau điều chỉnh rủi ro 56 3.4 Ảnh hưởng yếu tố rủi ro tới lợi nhuận hiệu ứng momentum 61 3.5 Hồi quy Fama – MacBeth 64 KẾT LUẬN CHƯƠNG 67 CHƯƠNG KẾT LUẬN VÀ KHUYẾN NGHỊ 68 4.1 Kết luận 68 4.2 Một số khuyến nghị từ kết nghiên cứu 70 4.2.1 Đối với nhà đầu tư 70 4.2.2 Đối với nhà quản lý 71 4.3 Hạn chế đề tài hướng nghiên cứu 73 iii DANH MỤC TÀI LIỆU THAM KHẢO 74 PHỤ LỤC 82 iv DANH MỤC NHỮNG CHỮ VIẾT TẮT AMEX: Sở Giao dịch chứng khoán Mỹ APT: Lý thuyết kinh doanh chênh lệch giá (The Arbitrage Pricing Theory) Beta: Hệ số beta mơ hình định giá tài sản tài BE/ME: Hệ số giá sổ sách giá thị trường (Book-to-market ratio) CAPM: Mô hình định giá tài sản vốn EMH: Lý thuyết thị trường hiệu (The Efficient Market Hypothesis) HNX: Sở Giao dịch Chứng khoán Hà Nội HOSE: Sở Giao dịch Chứng khốn Thành phố Hồ Chí Minh NYSE: Sở Giao dịch chứng khoán New York VN-Index: Chỉ số VN-Index v DANH MỤC BẢNG BIỂU Bảng 2.1 Hồi quy Fama –MacBeth 43 Bảng 3.1 Thống kê số cổ phiếu 47 Bảng 3.2 Thống kê mô tả 49 Bảng 3.3 Ma trận hệ số tương quan 49 Bảng 3.4 Đặc điểm danh mục momentum 50 Bảng 3.5 Lợi nhuận hiệu ứng momentum với trọng số 53 Bảng 3.6 Lợi nhuận hiệu ứng momentum với trọng số theo giá trị vốn hóa thị trường 54 Bảng 3.7 Lợi nhuận danh mục giai đoạn hình thành danh mục 55 Bảng 3.8 Lợi nhuận hiệu ứng momentum điều chỉnh theo CAPM 58 Bảng 3.9 Lợi nhuận hiệu ứng momentum điều chỉnh theo mơ hình Fama – French 59 Bảng 3.10 Lợi nhuận hiệu ứng momentum điều chỉnh theo mơ hình Fama – French (tiếp theo) 60 Bảng 3.11 Phân tích danh mục hai biến 63 Bảng 3.12 Kết hồi quy Fama – MacBeth 65 Bảng 4.1 Tỷ suất sinh lời danh mục Winner 72 Bảng 4.2 Tỷ suất sinh lời danh mục Winner nhóm rủi ro 73 vi DANH MỤC HÌNH Hình 1.1 Đường thị trường chứng khốn Hình 1.2 Phản ứng thị trường với kiện thuận lợi khơng đốn trước 11 Hình 1.3 Phản ứng thị trường với kiện thuận lợi dự đốn trước 12 Hình 1.4 Các dạng hiệu thị trường 14 Hình 1.5 Đồ thị hàm thỏa dụng theo lý thuyết tài chuẩn tắc 17 Hình 1.6 Đồ thị hàm thỏa dụng theo lý thuyết triển vọng 18 Hình 1.7 Nguyên nhân gây hiệu ứng momentum 27 Hình 1.8 Tác động thơng tin lên giá cổ phiếu 30 Hình 2.1 Chiến lược momentum chồng lấn với J = 3, K = 41 Hình 2.2 Phân tích danh mục hai biến 42 Hình 3.1 Chỉ số VN-Index 47 PHẦN MỞ ĐẦU Lý chọn đề tài Một chủ đề tài tranh luận gay gắt nhiều thập kỷ qua liệu dự đốn giá cổ phiếu tương lai Lý thuyết thị trường hiệu phát biểu giá tài sản tài tích hợp hiệu tất thông tin (Fama, 1970) Bên cạnh đó, mơ hình định giá tài sản cho biết kỳ vọng mức giá phù hợp với yếu tố rủi ro (Bodie, 2017) Do đó, dựa vào lịch sử giá, chiến lược giao dịch khơng thể có lợi nhuật bất thường, mức lợi nhuận sau đền bù rủi ro Tuy nhiên, khác với tuyên bố đó, nghiên cứu Jegadeesh and Titman (1993) phát cổ phiếu với lợi tức cao trong khứ có diễn biến tốt cổ phiếu với lợi tức thấp khứ Cụ thể, chiến lược mua/bán cổ phiếu hoạt động tốt/kém từ đến 12 tháng sinh lợi nhuận bất thường đến 12 tháng Hiện tượng cổ phiếu gọi hiệu ứng momentum, tạm dịch hiệu ứng quán tính, hay hiệu ứng động lượng Trong đó, De Bondt and Thaler (1985) ghi nhận tượng cổ phiếu với tỷ suất sinh lời cao (thấp) khứ có tỷ suất sinh lời thấp (cao) thời gian sau, tượng diễn khoảng thời gian từ đến năm, gọi hiệu ứng reversal, tạm dịch hiệu ứng đảo ngược Hai hiệu ứng có liên quan chặt chẽ có phương pháp nghiên cứu nhiều tương đồng Chúng coi bất thường kỹ thuật, cho hai bất thường phổ biến thị trường chứng khoán Theo báo cáo Ủy ban Chứng khoán Nhà nước, thị trường chứng khoán Việt Nam năm 2019, tổng giá trị giao dịch nhà đầu tư cá nhân nước chiếm 74,5% sàn giao dịch chứng khốn Hồ Chí Minh Trong đó, nghiên cứu Nguyễn Đức Hiển (2012) cho thấy, nhà đầu tư Việt Nam có nhiều thiên kiến nhận thức có hành vi đầu tư khơng hợp lý tiếp nhận thông tin Hơn nữa, số cá nhân (Individualism score) người Việt Nam 20 thang số 1-100 (Hofstede Insights, 2021) Điều cho thấy nhà đầu tư Việt Nam có tính cá nhân (individualism) thấp, hay ngược lại có xu hướng theo chủ nghĩa tập thể (collectivist) Họ có xu hướng đầu tư theo đám đơng (Đồn Anh Tuấn Hồng Mai Phương, 2016; Ngơ Thanh Tuyền, 2014) Bên cạnh đó, lợi nhuận tài sản tài thời điểm phản ánh mong đợi nhà đầu tư định hình từ thơng tin có liên quan Vì vậy, khứ, lợi nhuận cổ phiếu cao thấp nhà đầu tư đánh giá tiêu cực tích cực triển vọng cổ phiếu Nếu nhà đầu tư giữ kỳ vọng tương lai tức hi vọng xu hướng tỷ suất sinh lợi tiếp tục trì, họ tương ứng đặt vị mua cổ phiếu trước có tỷ suất sinh lợi cao vị bán cổ phiếu trước có tỷ suất sinh lợi thấp Khi hành vi ảnh hưởng đến nhiều nhà đầu tư kiến, khiến họ có hành vi mua bán tương tự, tổng tác động nhà đầu tư thị trường lúc giữ xu hướng tỷ suất sinh lời cổ phiếu khoảng thời gian, thị trường xuất hiệu ứng momentum Nếu hiệu ứng momentum làm cho giá cổ phiếu vượt giá trị hợp lý; tới nhà đầu tư nhận thức được, trình hiệu chỉnh giá diễn ra, xuất hiệu ứng đảo ngược dài hạn Thị trường chứng khốn Việt Nam khơng hiệu (Vũ Thị Minh Luận, 2010) xảy tình trạng công bố thông tin bất cân xứng Dẫn đến số nhà đầu tư có thơng tin nội gián Thơng tin loan báo từ từ cộng đồng nhà đầu tư khiến tỷ suất sinh lời thay đổi dần theo xu hướng khoảng thời gian gây nên hiệu ứng momentum Dựa vào lập luận trên, thấy hiệu ứng momentum có khả lớn xảy thị trường chứng khoán Việt Nam Kể từ nghiên cứu Jegadeesh Titman năm 1993, nhiều nghiên cứu ghi nhận xuất hiệu ứng momentum nhiều thị trường, tổng hợp nhiều thị trường giới Trong đó, nghiên cứu hiệu ứng thị trường Việt Nam chưa phong phú nhiều kết chưa thống Nếu chiến lược momentum có lợi nhuận lợi nhuận có phải phần bù cho rủi ro chiến lược? Đến nghiên cứu thị trường chứng khốn Việt Nam chưa có câu trả lời chặt chẽ cho câu hỏi này, lí phần lợi nhuận điều chỉnh chưa phát thông qua mô hình định giá tài sản mơ hình khơng đề cập hết rủi ro Ngồi ra, khơng nghiên cứu cách đơn lẻ, nhiều cơng trình nghiên cứu tác động rủi ro tới hiệu ứng momentum, có yếu tố quy mô, giá trị hệ số beta Tuy nhiên, nghiên cứu thị trường Việt Nam nghiên cứu ảnh hưởng yếu tố quy mô doanh nghiệp tới hiệu ứng momentum kết cịn nhiều trái chiều Vì đề tài: “Hiệu ứng momentum thị trường chứng khoán Việt Nam” tập trung nghiên cứu hiệu ứng momentum cách toàn diện hơn, với mong muốn bổ sung thêm nhiều khía cạnh vào kho tàng nghiên cứu thực tiễn học thuật hiệu ứng Việt Nam Nghiên cứu hi vọng có đóng góp thiết thực nhà đầu tư xây dựng chiến lược giao dịch Đồng thời, nhà quản lý tham khảo để góp phần cải thiện mức độ hiệu quả, đưa thị trường chứng khoán hoạt động tốt theo chức thị trường vốn Mục đích nghiên cứu Mục tiêu chung đề tài cung cấp chứng hiệu ứng động, yếu tố tác động nguồn gốc gây hiệu ứng thị trường chứng khốn Việt Nam Mục đích cụ thể nghiên cứu sau: Thứ nhất, đề tài kiểm tra xuất hiệu ứng momentum thông qua kiểm định lợi nhuận lợi nhuận bất thường đa dạng chiến lược đầu tư Thứ hai, đề tài nghiên cứu tác động nhân tố yếu tố ảnh hưởng tới hiệu ứng momentum Từ phân tích kết luận thị trường Việt Nam có hiệu ứng momentum yếu tố rủi ro gây hay chứng tỏ thị trường không hiệu dạng yếu Đối tượng phạm vi nghiên cứu Đối tượng nghiên cứu: Đối tượng nghiên cứu đề tài lợi nhuận lợi nhuận bất thường chiến lược momentum Chiến lược đầu tư xây dựng danh mục mua bán từ việc phân chia thị trường thành ngũ phân vị Các chiến lược khảo sát với thời gian xây dựng danh mục thời gian đầu tư khác Các doanh nghiệp niêm yết Sở Giao dịch Chứng khoán Thành phố Hồ Chí Minh (HOSE) đối tượng nghiên cứu đề tài Đề tài không nghiên cứu doanh nghiệp niêm yết Sở Giao dịch Chứng Khoán Hà Nội (HNX), thị trường phi tập trung (OTC), thị trường tự do, … Phạm vi nghiên cứu: Dữ liệu thu thập từ ngày 01 tháng 01 năm 2007 đến ngày 28 tháng 02 năm 2021 Dữ liệu bao gồm số liệu cổ phiếu thời gian giao dịch sàn HOSE Số liệu cổ phiếu giao dịch sàn HNX trước sau chuyển sàn giao dịch loại khỏi mẫu nghiên cứu, quy định điều kiện niêm yết doanh nghiệp biên độ dao động khác Khái quát phương pháp nghiên cứu Phương pháp thống kê, mơ hình hóa biểu đồ, đồ thị, phương pháp tổng hợp phân tích, phương pháp so sánh đánh giá 86 pd qcut ( x , q= [ , , , ] , l a b e l s = F a l s e ) ) da [ ’ s i z e _ p o r t ’ ] = da i n d e x map( von [ ’ s i z e _ p o r t ’ ] ) da [ ’ value_port ’ ] = da i n d e x map( von [ ’ value_port ’ ] ) da = da r e s e t _ i n d e x ( ) da = da drop ( columns = [ ’ y e a r ’ ] ) dat = da p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ s i z e _ p o r t ’ , ’ value_port ’ ] ) vnindex [ ’SMB ’ ] = dat [ dat [ ’ s i z e _ p o r t ’ ] == ] [ ’ r ’ ] mean ( a x i s = ) / − \ dat [ dat [ ’ s i z e _ p o r t ’ ] == ] [ ’ r ’ ] mean ( a x i s = ) / vnindex [ ’HML’ ] = dat [ dat [ ’ value_port ’ ] == ] [ ’ r ’ ] mean ( a x i s = ) / − \ dat [ dat [ ’ value_port ’ ] == ] [ ’ r ’ ] mean ( a x i s = ) / """ − Remove t h e s i z e _ p o r t and t h e v a l u e _ p o r t column b e c a u s e t h e y a r e o n l y used t o c a l c u l a t e t h e SMB v a r i a b l e HML i n p r i c i n g models − Compute v a l u e _ s o r t , s i z e _ s o r t , b e t a _ s o r t columns """ da = da drop ( [ ’ s i z e _ p o r t ’ , ’ value_port ’ ] , a x i s = ) da [ ’ s i z e _ s o r t ’ ] = da groupby ( " d a t e " ) [ " s i z e " ] t r a n s f o r m (lambda x : pd qcut ( x , q= [ , , , ] , l a b e l s = F a l s e ) ) da [ ’ v a l u e _ s o r t ’ ] = da groupby ( " d a t e " ) [ " v a l u e " ] t r a n s f o r m (lambda x : pd qcut ( x , q= [ , , , ] , l a b e l s = False )) da [ ’ b e t a _ s o r t ’ ] = da groupby ( " d a t e " ) [ " b e t a " ] t r a n s f o r m (lambda x : pd qcut ( x , q= [ , , , ] , \ d u p l i c a t e s= ’ drop ’ , l a b e l s = F a l s e ) ) """ Find cummulative r e t u r n , and p o r t f o l i o """ f o r J in [ , , , , ] : da [ "mom" + s t r ( J ) ] = da groupby ( " s t o c k " ) [ " p r i c e " ] apply (lambda x : \ np l o g ( x s h i f t ( ) / x s h i f t ( J + ) ) ) da [ "sort_mom" + s t r ( J ) ] = \ da groupby ( " d a t e " ) [ "mom" + s t r ( J ) ] t r a n s f o r m (lambda x : np nan i f x i s n u l l ( ) a l l ( ) e l s e pd qcut ( x , , l a b e l s = F a l s e ) ) f o r J in [ , , , , , ] : vnindex [ "MKT" + s t r ( J ) ] = \ vnindex [ ’ vnindex ’ ] s h i f t ( ) / vnindex [ ’ vnindex ’ ] s h i f t ( J + ) − vnindex l o c [ vnindex [ ’MKT’+s t r ( J ) ] < , ’UP ’+s t r ( J ) ] = vnindex l o c [ vnindex [ ’MKT’+s t r ( J ) ] >= , ’UP ’+s t r ( J ) ] = #### Stop p r o c e s s i n g d a t a """ Save w e e k l y and d a i l y v n i n d e x Save w e e k l y s t o c k d a t a by main_da p i c k l e and main_vnindex p i c k l e """ vnindex to_csv ( ’ vnindex_weekly c s v ’ ) v n i n d e x _ d a i l y to_csv ( ’ v n i n d e x _ d a i l y c s v ’ ) with open ( "main_da p i c k l e " , "ab" ) a s h a n d l e : p i c k l e dump( da , h a n d l e ) handle c l o s e ( ) with open ( " main_vnindex p i c k l e " , "ab" ) a s h a n d l e : p i c k l e dump( vnindex , h a n d l e ) handle c l o s e ( ) 87 with open ( " bond_daily p i c k l e " , "ab" ) a s h a n d l e : p i c k l e dump( bond_daily , h a n d l e ) handle c l o s e ( ) """ Open f i l e p i c k l e t o f i n d D e s c r i p t i v e S t a t i s t i c """ with open ( "main_da p i c k l e " , " rb " ) a s h a n d l e : main_da = p i c k l e l o a d ( h a n d l e ) with open ( " main_vnindex p i c k l e " , " rb " ) a s h a n d l e : main_vnindex = p i c k l e l o a d ( h a n d l e ) t = da groupby ( ’ s t o c k ’ ) s i z e ( ) t to_csv ( ’ danhsachcophieu_weekly c s v ’ ) t = da_daily s o r t _ v a l u e s ( by = ’ d a t e ’ ) groupby ( ’ d a t e ’ ) [ ’ s t o c k ’ ] count ( ) t to_csv ( ’ d a n h s a c h c o p h i e u _ d a i l y c s v ’ ) """ D e s c r i p t i v e S t a t i s t i c """ t a = main_da groupby ( ’ d a t e ’ ) [ ’ r ’ , ’mom4 ’ , ’mom13 ’ , ’mom26 ’ , ’mom52 ’ , ’ b e t a ’ , \ ’ s i z e ’ , ’ v a l u e ’ ] a g g r e g a t e ( [ ’ mean ’ , ’ count ’ ] ) ta = ta d e s c r i b e ( ) t a to_csv ( ’ d e s c r i p t i v e _ s t i s t i c s c s v ’ ) t a = main_da groupby ( ’ d a t e ’ ) [ ’ r ’ , ’mom1 ’ , ’mom4 ’ , ’mom13 ’ , ’mom26 ’ , ’mom52 ’ , ’ b e t a ’ , ’ s i z e ’ , ’ value ’ ] corr ( ) unstack ( ) t a = t a mean ( ) t a to_csv ( ’ c o r r e l a t i o n c s v ’ ) f o r J in [ , , , , ] : t a = main_da groupby ( [ ’ d a t e ’ , ’ sort_mom ’+s t r ( J ) ] ) [ [ ’mom ’+s t r ( J ) , ’ b e t a ’ , ’ s i z e ’ , ’ v a l u e ’ ] ] agg ( [ ’ mean ’ ] ) t a = t a r e s e t _ i n d e x ( ) groupby ( ’ sort_mom ’+s t r ( J ) ) mean ( ) t a to_csv ( ’ table4_ ’+s t r ( J)+ ’ c s v ’ ) f o r var in [ ’ b e t a ’ , ’ s i z e ’ , ’ v a l u e ’ ] : t a = main_da groupby ( [ ’ d a t e ’ , var+ ’ _sort ’ ] ) [ [ ’ r ’ , ’mom1 ’ , ’mom4 ’ , ’mom13 ’ , ’mom26 ’ , ’mom52 ’ ] ] agg ( [ ’ mean ’ ] ) t a = t a r e s e t _ i n d e x ( ) groupby ( var+ ’ _sort ’ ) mean ( ) t a to_csv ( ’ d e s r i p t i v e _ ’+var+ ’ c s v ’ ) 88 Phần 2: Phân tích nghiên cứu thực nghiệm import pandas a s pd import math import numpy a s np import s c i p y i o import s c i p y s t a t s a s s t a t s import d a t e t i m e import s t a t s m o d e l s f o r m u l a a p i a s smf import p i c k l e import s t a t s m o d e l s a p i a s sm from s t a t s m o d e l s r e g r e s s i o n r o l l i n g import RollingOLS from i t e r t o o l s import c o m b i n a t i o n s import m a t p l o t l i b p y p l o t a s p l t import random from a r c h b o o t s t r a p import S t a t i o n a r y B o o t s t r a p from numpy random import RandomState from a r c h b o o t s t r a p import I I D B o o t s t r a p import copy with open ( "main_da p i c k l e " , " rb " ) a s h a n d l e : main_da = p i c k l e l o a d ( h a n d l e ) with open ( " main_vnindex p i c k l e " , " rb " ) a s h a n d l e : main_vnindex = p i c k l e l o a d ( h a n d l e ) with open ( " bond_daily p i c k l e " , " rb " ) a s h a n d l e : bond_daily = p i c k l e l o a d ( h a n d l e ) c l a s s momentum_week0 : def init ( s e l f , df , vnindex , bond , J ) : s e l f df = df self J = J s e l f vnindex = vnindex s e l f bond = bond def test_raw_return ( s e l f , Y, l a p ) : model = smf o l s ( ’Y␣~␣ ’ , m i s s i n g= ’ drop ’ , data=Y) r e g = model f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : lap −1}) t e s t = pd c o n c a t ( [ r e g params , r e g bse , r e g t v a l u e s , r e g p v a l u e s ] , a x i s =0) v a l u e s return t e s t def mom_week0_equal_weight ( s e l f ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , ’ v o n t t ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r p o r t in range ( , ) : d [ ’P ’+s t r ( p o r t ) ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t (−1)== p o r t ) & \ ( dat [ ’ v o l ’ ] >0) & ( dat [ ’ p r i c e ’ ] > 0 ) ] [ ’ r ’ ] mean ( a x i s =1) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p = s e l f J , r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out 89 def mom_week0_weight ( s e l f ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , ’ v o n t t ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r p in range ( , ) : mid_dat = dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t (−1)==p ) & \ ( dat [ ’ v o l ’ ] >0) & \ ( dat [ ’ p r i c e ’ ] > 0 ) ] [ [ ’ r ’ , ’ v o n t t ’ ] ] s t a c k ( ) mid_dat = mid_dat r e s e t _ i n d e x ( ) d [ ’P ’+s t r ( p ) ] = mid_dat groupby ( [ ’ d a t e ’ ] ) apply (lambda x : np a v e r a g e ( x [ ’ r ’ ] , w e i g h t s=x [ ’ v o n t t ’ ] ) ) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p = s e l f J , r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out def t r a n s i t i o n m a t r i x ( s e l f ) : d = s e l f d f [ [ " s t o c k " , "sort_mom" + s t r ( s e l f J ) , ’ d a t e ’ ] ] copy ( ) d = d p i v o t ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s= ’ sort_mom ’+s t r ( s e l f J ) ) d = d dropna ( how= ’ a l l ’ , a x i s= ’ columns ’ ) d [ ’w ’ ] = range ( , len ( d)+1) d = d s e t _ i n d e x ( ’w ’ ) d f = pd DataFrame ( , i n d e x = range ( , ) , columns = range ( , ) ) f o r s in d columns : tmin = d [ s ] dropna ( ) i n d e x ( ) tmax = d [ s ] dropna ( ) i n d e x max( ) f o r t in range ( tmin , tmax ) : d f l o c [ d l o c [ ( d i n d e x==t ) , s ] v a l u e s [ ] , \ d l o c [ ( d i n d e x==t +1) , s ] v a l u e s [ ] ] += return d f c l a s s momentum : def init ( s e l f , df , vnindex , bond , J , K) : s e l f df = df self J = J s e l f vnindex = vnindex s e l f bond = bond s e l f K = K def Rkt_no_gap_equal_weight ( s e l f , p o r t ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): d [ ’R ’+s t r ( k)+ ’ t ’ ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k−1)==p o r t ) & ( dat [ ’ v o l ’ ] s h i f t (1) >0) & ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ ’ r ’ ] mean ( a x i s =1) return d 90 def Rkt_gap_equal_weight ( s e l f , p o r t ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): d [ ’R ’+s t r ( k)+ ’ t ’ ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==p o r t ) & \ ( dat [ ’ v o l ’ ] s h i f t (1) >0) & \ ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ ’ r ’ ] mean ( a x i s =1) return d def Rkt_no_gap_weight ( s e l f , p o r t ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , ’ v o n t t ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): mid_dat = dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k−1)==p o r t ) & \ ( dat [ ’ v o l ’ ] s h i f t (1) >0) & \ ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ [ ’ r ’ , ’ v o n t t ’ ] ] mid_dat = mid_dat s t a c k ( ) r e s e t _ i n d e x ( ) d [ ’R ’+s t r ( k)+ ’ t ’ ] = mid_dat groupby ( [ ’ d a t e ’ ] ) apply (lambda x : np a v e r a g e ( x [ ’ r ’ ] , w e i g h t s=x [ ’ v o n t t ’ ] ) ) return d def Rkt_gap_weight ( s e l f , p o r t ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , \ v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , ’ v o n t t ’ ] ) d = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): mid_dat = dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==p o r t ) & \ ( dat [ ’ v o l ’ ] s h i f t (1) >0) & \ ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ [ ’ r ’ , ’ v o n t t ’ ] ] mid_dat = mid_dat s t a c k ( ) r e s e t _ i n d e x ( ) d [ ’R ’+s t r ( k)+ ’ t ’ ] = mid_dat groupby ( [ ’ d a t e ’ ] ) apply (lambda x : np a v e r a g e ( x [ ’ r ’ ] , w e i g h t s=x [ ’ v o n t t ’ ] ) ) return d def test_raw_return ( s e l f , Y, l a p ) : model = smf o l s ( ’Y␣~␣ ’ , m i s s i n g= ’ drop ’ , data=Y) r e g = model f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : lap −1}) t e s t = pd c o n c a t ( [ r e g params , r e g bse , r e g t v a l u e s , r e g p v a l u e s ] , a x i s =0) v a l u e s return t e s t def raw_no_gap_equal_weight ( s e l f ) : d = pd DataFrame ( ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_no_gap_equal_weight ( p o r t=p ) mean ( a x i s =1) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out 91 def raw_gap_equal_weight ( s e l f ) : d = pd DataFrame ( ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_gap_equal_weight ( p o r t=p ) mean ( a x i s =1) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out def raw_no_gap_weight ( s e l f ) : d = pd DataFrame ( ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_no_gap_weight ( p o r t=p ) mean ( a x i s =1) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out def raw_gap_weight ( s e l f ) : d = pd DataFrame ( ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_gap_weight ( p o r t=p ) mean ( a x i s =1) d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] d_out = d apply ( s e l f test_raw_return , l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out def test_abnormal_return ( s e l f , Y, X, l a p ) : model = sm OLS(Y, X, m i s s i n g= ’ drop ’ ) r e g = model f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : lap −1}) return pd c o n c a t ( [ r e g params , r e g t v a l u e s , r e g p v a l u e s ] , a x i s =0) v a l u e s def abnormal_gap_equal_weight ( s e l f ) : d = pd DataFrame ( i n d e x = s e l f vnindex i n d e x ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_gap_equal_weight ( p o r t=p ) mean ( a x i s =1) − \ d i n d e x map( bond_daily [ ’ r f ’ ] ) / / 0 d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] X = sm add_constant ( s e l f vnindex [ ’ rm_rf ’ ] ) d1 = d apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d1 i n d e x = [ ’ a l p h a ’ , ’ b e t a ’ , ’ t_alpha ’ , ’ t_beta ’ , ’ p_alpha ’ , ’ p_beta ’ ] d1 = d1 s t a c k ( ) X = sm add_constant ( s e l f vnindex [ [ ’ rm_rf ’ , ’SMB ’ , ’HML’ ] ] ) d2 = d apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d2 i n d e x = [ " a l p h a " , " b e t a " , "SMB" , "HML" , " t_alpha " , " t_beta " , "t_SMB" , "t_HML" , " p_alpha " , " p_beta " , "p_SMB" , "p_HML" ] d2 = d2 s t a c k ( ) return d1 , d2 92 def abnormal_gap_weight ( s e l f ) : d = pd DataFrame ( i n d e x = s e l f vnindex i n d e x ) f o r p in range ( , ) : d [ ’P ’+s t r ( p ) ] = s e l f Rkt_gap_weight ( p o r t=p ) mean ( a x i s =1) − \ d i n d e x map( s e l f bond [ ’ r f ’ ] ) / / 0 d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] X = sm add_constant ( s e l f vnindex [ ’ rm_rf ’ ] ) d1 = d apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d1 i n d e x = [ ’ a l p h a ’ , ’ b e t a ’ , ’ t_alpha ’ , ’ t_beta ’ , ’ p_alpha ’ , ’ p_beta ’ ] d1 = d1 s t a c k ( ) X = sm add_constant ( s e l f vnindex [ [ ’ rm_rf ’ , ’SMB ’ , ’HML’ ] ] ) d2 = d apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) d2 i n d e x = [ " a l p h a " , " b e t a " , "SMB" , "HML" , " t_alpha " , " t_beta " , "t_SMB" , "t_HML" , " p_alpha " , " p_beta " , "p_SMB" , "p_HML" ] d2 = d2 s t a c k ( ) return d1 , d2 def Rkt_gap_equal_weight_control ( s e l f , port , c o n t r o l ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’ + s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , c o n t r o l+ ’ _sort ’ ] ) d_out = pd DataFrame ( ) f o r group in [ , , ] : d = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): d [ ’ group ’ ] = group d [ ’R ’+s t r ( k)+ ’ t ’ ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==p o r t ) & ( dat [ ’ v o l ’ ] s h i f t (1) >0) & ( dat [ c o n t r o l+ ’ _sort ’ ] s h i f t (1)== group ) & ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ ’ r ’ ] mean ( a x i s =1) d_out = pd c o n c a t ( [ d_out , d ] ) return d_out def Rkt_gap_weight_control ( s e l f , port , c o n t r o l ) : dat = s e l f d f copy ( ) dat = dat p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’ + s t r ( s e l f J ) , ’ v o l ’ , ’ p r i c e ’ , ’ v o n t t ’ , c o n t r o l+ ’ _sort ’ ] ) d_out = pd DataFrame ( ) f o r group in [ , , ] : d1 = pd DataFrame ( i n d e x = dat i n d e x ) f o r k in range ( , s e l f K+1): d1 [ ’ group ’ ] = group d2 = dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==p o r t ) & ( dat [ ’ v o l ’ ] s h i f t (1) >0) & ( dat [ c o n t r o l+ ’ _sort ’ ] s h i f t (1)== group ) & ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ [ ’ r ’ , ’ v o n t t ’ ] ] d2 = d2 s t a c k ( ) r e s e t _ i n d e x ( ) d1 [ ’R ’+s t r ( k)+ ’ t ’ ] = d2 groupby ( [ ’ d a t e ’ ] ) apply (lambda x : np a v e r a g e ( x [ ’ r ’ ] , w e i g h t s=x [ ’ v o n t t ’ ] ) ) 93 d_out = pd c o n c a t ( [ d_out , d1 ] ) return d_out def raw_gap_equal_weight_control ( s e l f , c o n t r o l ) : d1 = [ ] f o r p in range ( , ) : d2 = s e l f Rkt_gap_equal_weight_control ( p o r t=p , c o n t r o l=c o n t r o l ) s e t _ i n d e x ( ’ group ’ , append=True ) d2 = d2 mean ( a x i s = ) to_frame ( ) d2 = d2 rename ( columns ={0: "P"+s t r ( p ) } ) d1 append ( d2 ) d1 = pd c o n c a t ( d1 , a x i s =1) d1 [ "P4−P0" ] = d1 [ "P4" ] − d1 [ "P0" ] d1 = d1 r e s e t _ i n d e x ( ’ group ’ ) out = [ ] f o r group in [ , , ] : t = d1 [ d1 group==group ] [ [ ’ P0 ’ , ’ P1 ’ , ’ P2 ’ , ’ P3 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] t = t apply ( s e l f test_raw_return , l a p= s e l f K , r e s u l t _ t y p e= ’ expand ’ ) t index = [ ’ p r o f i t ’ , ’ std ’ , ’ t_stat ’ , ’ pvalue ’ ] t = t s t a c k ( ) rename ( group ) out append ( t ) out = pd c o n c a t ( out , a x i s =1) return out def raw_gap_weight_control ( s e l f , c o n t r o l ) : d1 = [ ] f o r p in range ( , ) : d2 = s e l f Rkt_gap_weight_control ( p o r t=p , c o n t r o l = c o n t r o l ) s e t _ i n d e x ( ’ group ’ , append = True ) d2 = d2 mean ( a x i s = ) to_frame ( ) d2 = d2 rename ( columns ={0: "P"+s t r ( p ) } ) d1 append ( d2 ) d1 = pd c o n c a t ( d1 , a x i s =1) d1 [ "P4−P0" ] = d1 [ "P4" ] − d1 [ "P0" ] d1 = d1 r e s e t _ i n d e x ( ’ group ’ ) out = [ ] f o r group in [ , , ] : t = d1 [ d1 group==group ] [ [ ’ P0 ’ , ’ P1 ’ , ’ P2 ’ , ’ P3 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] t = t apply ( s e l f test_raw_return , l a p= s e l f K, r e s u l t _ t y p e= ’ expand ’ ) t index = [ ’ p r o f i t ’ , ’ std ’ , ’ t_stat ’ , ’ pvalue ’ ] t = t s t a c k ( ) rename ( group ) out append ( t ) out = pd c o n c a t ( out , a x i s =1) return out def abnormal_gap_equal_weight_control ( s e l f , c o n t r o l ) : t = s e l f Rkt_gap_equal_weight_control ( p o r t =0, c o n t r o l = c o n t r o l ) t = t s e t _ i n d e x ( ’ group ’ , append = True ) d = pd DataFrame ( i n d e x = t i n d e x ) d [ ’ P0 ’ ] = t mean ( a x i s = ) d [ ’ P4 ’ ] = s e l f Rkt_gap_equal_weight_control ( p o r t =4, 94 c o n t r o l=c o n t r o l ) s e t _ i n d e x ( ’ group ’ , append=True ) mean ( a x i s =1) d = d r e s e t _ i n d e x ( l e v e l = ’ group ’ ) d [ ’ P4 ’ ] = d [ ’ P4 ’ ]− d i n d e x map( s e l f bond [ ’ r f ’ ] ) / / 0 d [ ’ P0 ’ ] = d [ ’ P0 ’ ]− d i n d e x map( s e l f bond [ ’ r f ’ ] ) / / 0 d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] X = sm add_constant ( s e l f vnindex [ ’ rm_rf ’ ] ) d1 = pd DataFrame ( ) f o r g in [ , , ] : d0 = d l o c [ d [ ’ group ’ ] == g , [ ’ P0 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K) d0 i n d e x = [ ’ a l p h a ’ , ’ b e t a ’ , ’ t_alpha ’ , ’ t_beta ’ , ’ p_alpha ’ , ’ p_beta ’ ] d0 = d0 s t a c k ( ) to_frame ( ) d0 [ ’ group ’ ] = g d1 = pd c o n c a t ( [ d1 , d0 ] , a x i s = ) X = sm add_constant ( s e l f vnindex [ [ ’ rm_rf ’ , ’SMB ’ , ’HML’ ] ] ) d2 = pd DataFrame ( ) f o r g in [ , , ] : d0 = d l o c [ d [ ’ group ’ ] == g , [ ’ P0 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K) d0 i n d e x = [ " a l p h a " , " b e t a " , "SMB" , "HML" , " t_alpha " , " t_beta " , "t_SMB" , "t_HML" , " p_alpha " , " p_beta " , "p_SMB" , "p_HML" ] d0 = d0 s t a c k ( ) to_frame ( ) d0 [ ’ group ’ ] = g d2 = pd c o n c a t ( [ d2 , d0 ] , a x i s = ) return d1 , d2 def abnormal_gap_weight_control ( s e l f , c o n t r o l ) : t = s e l f Rkt_gap_weight_control ( p o r t =0, c o n t r o l = c o n t r o l ) t = t s e t _ i n d e x ( ’ group ’ , append = True ) d = pd DataFrame ( i n d e x = t i n d e x ) d [ ’ P0 ’ ] = t mean ( a x i s = ) d [ ’ P4 ’ ] = s e l f Rkt_gap_weight_control ( p o r t =4, c o n t r o l=c o n t r o l ) s e t _ i n d e x ( ’ group ’ , append=True ) mean ( a x i s =1) d = d r e s e t _ i n d e x ( l e v e l = ’ group ’ ) d [ ’ P4 ’ ] = d [ ’ P4 ’ ]− d i n d e x map( s e l f bond [ ’ r f ’ ] ) / / 0 d [ ’ P0 ’ ] = d [ ’ P0 ’ ]− d i n d e x map( s e l f bond [ ’ r f ’ ] ) / / 0 d [ "P4−P0" ] = d [ "P4" ] − d [ "P0" ] X = sm add_constant ( s e l f vnindex [ ’ rm_rf ’ ] ) d1 = pd DataFrame ( ) f o r g in [ , , ] : d0 = d l o c [ d [ ’ group ’ ] == g , [ ’ P0 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K) d0 i n d e x = [ ’ a l p h a ’ , ’ b e t a ’ , ’ t_alpha ’ , ’ t_beta ’ , ’ p_alpha ’ , ’ p_beta ’ ] d0 = d0 s t a c k ( ) to_frame ( ) d0 [ ’ group ’ ] = g d1 = pd c o n c a t ( [ d1 , d0 ] , a x i s = ) X = sm add_constant ( s e l f vnindex [ [ ’ rm_rf ’ , ’SMB ’ , ’HML’ ] ] ) d2 = pd DataFrame ( ) f o r g in [ , , ] : d0 = d l o c [ d [ ’ group ’ ] == g , [ ’ P0 ’ , ’ P4 ’ , ’ P4−P0 ’ ] ] apply ( s e l f test_abnormal_return , X=X, l a p= s e l f K) 95 d0 i n d e x = [ " a l p h a " , " b e t a " , "SMB" , "HML" , " t_alpha " , " t_beta " , "t_SMB" , "t_HML" , " p_alpha " , " p_beta " , "p_SMB" , "p_HML" ] d0 = d0 s t a c k ( ) to_frame ( ) d0 [ ’ group ’ ] = g d2 = pd c o n c a t ( [ d2 , d0 ] , a x i s = ) return d1 , d2 def c o e f ( s e l f , x , f o r m u l a ) : r e g = smf o l s ( formula , data=x , m i s s i n g = ’ drop ’ ) f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : } ) r = r e g params append ( pd S e r i e s ( [ r e g f v a l u e , r e g f_pvalue , reg rsquared_adj ] , i n d e x = [ ’ F s t a t ’ , ’ Pvalue ’ , ’ Adj R2 ’ ] ) ) return r def t t e s t ( s e l f , x ) : r e g = smf o l s ( ’ x␣~␣1 ’ , data=x ) f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : } ) return pd c o n c a t ( [ r e g params , r e g t v a l u e s , r e g p v a l u e s ] , a x i s =0) v a l u e s def f o r m u l a r ( s e l f , v a r i a b l e _ l i s t ) : s = s t r ( ) + ’ ␣+␣mom ’ + s t r ( s e l f J ) f o r e l e in range ( , len ( v a r i a b l e _ l i s t ) ) : s = s + ’ ␣+␣ ’ + v a r i a b l e _ l i s t [ e l e ] return "R1_4␣~␣ " + s def FM_reg( s e l f ) : dat = s e l f d f [ [ ’ s t o c k ’ , ’ d a t e ’ , ’mom ’+s t r ( s e l f J ) ] ] dat [ [ ’ s i z e ’ , ’ v a l u e ’ , ’ b e t a ’ ] ] = \ s e l f df [ [ ’ s i z e ’ , ’ value ’ , ’ beta ’ ] ] s h i f t (1) dat [ ’R1_4 ’ ] = np where ( ( dat groupby ( ’ s t o c k ’ ) [ ’ v o l ’ ] s h i f t (1) >0) & ( dat groupby ( ’ s t o c k ’ ) [ ’ p r i c e ’ ] s h i f t (1) >2000) , dat groupby ( " s t o c k " ) [ " p r i c e " ] apply (lambda x : np l o g ( x s h i f t ( −4)/x s h i f t ( − ) ) ) , np nan ) dat [ ’R1_4 ’ ] = dat [ ’R1_4 ’ ] − dat [ ’ d a t e ’ ] map( s e l f bond [ ’ r f ’ ] ) / / 0 dat = dat dropna ( a x i s =0) c o l = [ ’ I n t e r c e p t ’ , ’mom ’+s t r ( s e l f J ) , ’ F s t a t ’ , ’ Pvalue ’ , ’ Adj R2 ’ , ’ beta ’ , ’ s i z e ’ , ’ value ’ ] FM_dat = pd DataFrame ( columns = c o l ) f o r n in range ( , ) : var = c o m b i n a t i o n s ( [ ’ s i z e ’ , ’ v a l u e ’ , ’ b e t a ’ ] , n ) f o r combi in var : model = s e l f f o r m u l a r ( l i s t ( combi ) ) r e s u l t = dat groupby ( ’ d a t e ’ ) apply ( s e l f c o e f , model ) t = r e s u l t i l o c [ : , : − ] apply ( s e l f t t e s t ) t i n d e x = [ ’ mean ’ , ’ t _ s t a t i s t i c ’ , ’ p_value ’ ] t l o c [ t i n d e x==’ mean ’ , [ ’ F s t a t ’ , ’ Pvalue ’ , ’ Adj R2 ’ ] ] \ = r e s u l t i l o c [ : , − : ] mean ( a x i s = ) v a l u e s FM_dat = pd c o n c a t ( [ t , FM_dat ] ) return FM_dat 96 def a r ( s e l f , Y, X ) : r e g = sm OLS(Y, X, m i s s i n g= ’ drop ’ ) f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : } ) return Y − (X∗ r e g params v a l u e s ) sum( a x i s = ) + r e g params v a l u e s [ ] def excess_Rkt_gap ( s e l f ) : """ e x c e s s Rkt o f momentum s t r a t e t y w i t h gap and e q u a l w e i g h t and w e i g h t return : d f and d f : capm− and f f − e x e s s Rkt on gap e q u a l −w e i g h t s t r d f and d f : capm and f f − e x e s s Rkt on gap w e i g h t s t r """ d1 = s e l f Rkt_gap_equal_weight ( p o r t =4) − \ s e l f Rkt_gap_equal_weight ( p o r t =0) d2 = s e l f Rkt_gap_weight ( p o r t =4) − \ s e l f Rkt_gap_weight ( p o r t =0) X = sm add_constant ( s e l f vnindex [ " rm_rf " ] ) # excess_Rkt_gap a t k and t ( e q u a l − or no−e q u a l − w e i g h t ) by capm d f 1= d1 apply ( s e l f ar , X = X) d f 2= d2 apply ( s e l f ar , X = X) X = sm add_constant ( s e l f vnindex [ [ " rm_rf " , ’SMB ’ , ’HML’ ] ] ) # excess_Rkt_gap a t k and t ( e q u a l − or no−e q u a l − w e i g h t ) by f f model d f = d1 apply ( s e l f ar , X = X) d f = d2 apply ( s e l f ar , X = X) return df1 , df2 , df3 , d f def carlendar_time_mom1 ( s e l f ) : """ show raw , e x e c s s r e t u r n o f p o r t f o l i o each week t i n h o l d i n g p e r i o d ( t h r e e c o l s : raw , capm , f f ) i n two c a s e : e q u a l − and non−e q u a l − w e i g h t dont show t t e s t """ # raw momentum ( r e t u r n on wml p o r t f o l i o a t k and t ) d1 = s e l f Rkt_gap_equal_weight ( p o r t =4) − \ s e l f Rkt_gap_equal_weight ( p o r t =0) d2 = s e l f Rkt_gap_weight ( p o r t =4) − \ s e l f Rkt_gap_weight ( p o r t =0) # raw c a l e n d a r time mom a t t d f = d1 mean ( a x i s = ) to_frame ( name = ’ raw ’ ) d f = d2 mean ( a x i s = ) to_frame ( name = ’ raw ’ ) tup = s e l f excess_Rkt_gap ( ) d f [ ’ capm ’ ] = tup [ ] mean ( a x i s = ) d f [ ’ f f ’ ] = tup [ ] mean ( a x i s = ) d f [ ’ capm ’ ] = tup [ ] mean ( a x i s = ) d f [ ’ f f ’ ] = tup [ ] mean ( a x i s = ) return df1 , d f # d f gap , e q u a l −w e i g h t ; d f : gap , w e i g h t def carlendar_time_mom2 ( s e l f , k1 , k2 ) : """ Ouput : Momentum r e t u r n from t h e week k1 t o t h e week k2 i n the holding period """ 97 d1 = s e l f Rkt_gap_equal_weight ( p o r t =4) − \ s e l f Rkt_gap_equal_weight ( p o r t =0) d2 = s e l f Rkt_gap_weight ( p o r t =4) − \ s e l f Rkt_gap_weight ( p o r t =0) d f = d1 i l o c [ : d f = d2 i l o c [ : , k1 −1: k2 ] mean ( a x i s = ) to_frame ( name = ’ raw ’ ) , k1 −1: k2 ] mean ( a x i s = ) to_frame ( name = ’ raw ’ ) X = sm add_constant ( s e l f vnindex [ " rm_rf " ] ) d f [ ’ capm ’ ]= d1 i l o c [ : , k1 −1: k2 ] apply ( s e l f ar , X = X, r e s u l t _ t y p e= ’ expand ’ ) mean ( a x i s =1) d f [ ’ capm ’ ]= d2 i l o c [ : , k1 −1: k2 ] apply ( s e l f ar , X = X, r e s u l t _ t y p e= ’ expand ’ ) mean ( a x i s =1) X = sm add_constant ( s e l f vnindex [ [ " rm_rf " , "SMB" , "HML" ] ] ) d f [ ’ f f ’ ]= d1 i l o c [ : , k1 −1: k2 ] apply ( s e l f ar , X = X, r e s u l t _ t y p e= ’ expand ’ ) mean ( a x i s =1) d f [ ’ f f ’ ]= d2 i l o c [ : , k1 −1: k2 ] apply ( s e l f ar , X = X, r e s u l t _ t y p e= ’ expand ’ ) mean ( a x i s =1) d1_out = d f apply ( s e l f t t e s t ) d1_out i n d e x = [ ’ mean ’ , ’ t _ s t a t i s t i c ’ , ’ p_value ’ ] d2_out = d f apply ( s e l f t t e s t ) d2_out i n d e x = [ ’ mean ’ , ’ t _ s t a t i s t i c ’ , ’ p_value ’ ] return d1_out , d2_out f o r p in range ( , ) : mid_dat = dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t (−1)==p ) & \ ( dat [ ’ v o l ’ ] >0) & \ ( dat [ ’ p r i c e ’ ] > 0 ) ] [ [ ’ r ’ , ’ v o n t t ’ ] ] s t a c k ( ) mid_dat = mid_dat r e s e t _ i n d e x ( ) d [ ’P ’+s t r ( p ) ] = mid_dat groupby ( [ ’ d a t e ’ ] ) apply (lambda x : np a v e r a g e ( x [ ’ r ’ ] , w e i g h t s=x [ ’ v o n t t ’ ] ) ) d_out = d apply ( s e l f test_raw_return , K = s e l f J , r e s u l t _ t y p e= ’ expand ’ ) d_out i n d e x = [ ’ p r o f i t ’ , ’ s t d ’ , ’ t _ s t a t ’ , ’ p v a l u e ’ ] d_out = d_out s t a c k ( ) return d_out c l a s s momentum_state_market : def init ( s e l f , df , vnindex , bond , week_def_state , J , K) : s e l f df = df s e l f vnindex = vnindex s e l f bond = bond s e l f week_def_state = week_def_state self J = J s e l f K = K def raw_capmAlpha_ffAlpha_gap ( s e l f ) : # gap dat = s e l f d f p i v o t _ t a b l e ( i n d e x= ’ d a t e ’ , columns= ’ s t o c k ’ , v a l u e s =[ ’ r ’ , ’ sort_mom ’+s t r ( s e l f J ) , ’ vol ’ , ’ price ’ ] ) dat [ ’ rm_rf ’ ] = dat i n d e x map( s e l f vnindex [ " rm_rf " ] ) out = s e l f vnindex [ [ ’ rm_rf ’ , ’SMB ’ , ’HML’ ] ] copy ( ) 98 f o r k in range ( , s e l f K + ) : out [ ’ winner_raw ’+s t r ( k ) ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==4) & ( dat [ ’ v o l ’ ] s h i f t ( ) > ) & ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ ’ r ’ ] mean ( a x i s = ) out [ ’ l o s e r _ r a w ’+s t r ( k ) ] = \ dat [ ( dat [ ’ sort_mom ’+s t r ( s e l f J ) ] s h i f t ( k)==0) & ( dat [ ’ v o l ’ ] > ) & ( dat [ ’ p r i c e ’ ] s h i f t ( ) > 0 ) ] [ ’ r ’ ] mean ( a x i s = ) out [ ’ wml_raw ’+s t r ( k ) ] = out [ ’ winner_raw ’+s t r ( k ) ] − \ out [ ’ l o s e r _ r a w ’+s t r ( k ) ] f o r k in range ( , s e l f K + ) : f o r p o r t in [ ’ winner ’ , ’ l o s e r ’ , ’wml ’ ] : model = smf o l s ( ’ out [ p o r t+"_raw"+ s t r ( k ) ] ␣~␣ rm_rf ’ , data=out ) r e g = model f i t ( cov_type="HAC" , cov_kwds = { ’ maxlags ’ : s e l f K−1}) out [ p o r t + ’ _capm_alpha ’+ s t r ( k ) ] = out [ p o r t+ ’ _raw ’+s t r ( k ) ] − \ r e g params v a l u e s [ ] ∗ out [ ’ rm_rf ’ ] model = smf o l s ( ’ out [ p o r t+"_raw"+ s t r ( k ) ] ␣~␣ rm_rf ␣+␣SMB␣+␣HML’ , data=out ) r e g = model f i t ( cov_type="HAC" , cov_kwds={ ’ maxlags ’ : s e l f K−1}) out [ p o r t + ’ _ff_alpha ’+ s t r ( k ) ] = out [ p o r t + ’ _raw ’+s t r ( k ) ] − \ r e g params v a l u e s [ ] ∗ out [ ’ rm_rf ’ ] − \ r e g params v a l u e s [ ] ∗ out [ ’SMB ’ ] − \ r e g params v a l u e s [ ] ∗ out [ ’HML’ ] return out def w e e k l y _ p r o f i t _ p e r i o d ( s e l f , k1 , k2 ) : """ T a bl e , Panel A, t r a n g 1351 Market """ dat = s e l f raw_capmAlpha_ffAlpha_gap ( ) out = pd DataFrame ( { " r " : [ ’ no obs ’ ] + [ "raw" ] ∗ + [ "capm_alpha" ] ∗ + [ " f f _ a l p h a " ] ∗ , " p o r t " : [ np nan ] + ( [ " winner " ] ∗ + [ " l o s e r " ]∗4+ [ "wml" ] ∗ ) ∗ , " i n f o r " : [ np nan ] + [ "mean" , " s t d " , " t _ s t a t " , " p v a l u e " ] ∗ } ) f o r r in [ ’ raw ’ , ’ capm_alpha ’ , ’ f f _ a l p h a ’ ] : f o r p o r t in [ ’ winner ’ , ’ l o s e r ’ , ’wml ’ ] : new_col = p o r t + ’_ ’ + r dat [ new_col ] = f o r k in range ( k1 , k2 +1): dat [ new_col ] = dat [ new_col ] + dat [ new_col+s t r ( k ) ] model = smf o l s ( ’ dat [ new_col ] ␣~␣ ’ , data=dat ) r e g = model f i t ( cov_type="HAC" , cov_kwds={ ’ maxlags ’ : k2−k1 } ) out l o c [ ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ mean ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g params v a l u e s [ ] out l o c [ ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ s t d ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g b s e v a l u e s [ ] out l o c [ ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ t _ s t a t ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g t v a l u e s v a l u e s [ ] out l o c [ ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ p v a l u e ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g p v a l u e s v a l u e s [ ] out l o c [ ( out r==’ no obs ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g nobs return out 99 def weekly_profit_period_up_down_state ( s e l f , k1 , k2 ) : d = s e l f raw_capmAlpha_ffAlpha_gap ( ) dat = d copy ( ) s e l f vnindex [ "MKT" + s t r ( s e l f week_def_state ) ] = \ np l o g ( s e l f vnindex [ ’ vnindex ’ ] s h i f t ( ) / \ s e l f vnindex [ ’ vnindex ’ ] s h i f t ( s e l f week_def_state +1)) s e l f vnindex [ "UP" + s t r ( s e l f week_def_state ) ] = \ s e l f vnindex [ "MKT"+s t r ( s e l f week_def_state ) ] t r a n s f o r m (lambda x : i f x > else 0) dat [ ’UP ’+s t r ( s e l f week_def_state ) ] = \ dat i n d e x map( s e l f vnindex [ ’UP ’ + s t r ( s e l f week_def_state ) ] ) dat [ ’DOWN’+s t r ( s e l f week_def_state ) ] = \ − dat [ ’UP ’+s t r ( s e l f week_def_state ) ] out = pd DataFrame ( { ’ market ’ : [ ’UP ’ ] ∗ + [ ’DOWN’ ] ∗ + [ ’UP−DOWN’ ] ∗ , " r " : np t i l e ( [ np nan ] + [ "raw" ] ∗ + [ "capm_alpha" ]∗12+ [ " ff_alpha " ]∗12 , 3) , " p o r t " : ( [ np nan ] + ( [ " winner " ] ∗ + [ " l o s e r " ]∗4+ [ "wml" ] ∗ ) ∗ ) ∗ , " i n f o r " : np t i l e ( [ "no obs "]+ [ "mean" , " s t d " , " t _ s t a t " , " p v a l u e " ] ∗ , ) } ) f o r r in [ ’ raw ’ , ’ capm_alpha ’ , ’ f f _ a l p h a ’ ] : f o r p o r t in [ ’ winner ’ , ’ l o s e r ’ , ’wml ’ ] : new_col = p o r t + ’_ ’ + r dat [ new_col ] = f o r k in range ( k1 , k2 +1): dat [ new_col ] = dat [ new_col ] + dat [ new_col+s t r ( k ) ] dat [ new_col ] = dat [ new_col ] / ( k2−k1+1) f o r s t a t e in [ ’UP ’ , ’DOWN’ ] : d = dat [ dat [ s t a t e + s t r ( s e l f week_def_state ) ] == ] model = smf o l s ( ’ d [ new_col ] ␣~␣ ’ , data=d ) r e g = model f i t ( cov_type="HAC" , cov_kwds={ ’ maxlags ’ : k2−k1 } ) out l o c [ ( out market==s t a t e ) & ( out i n f o r==’ no obs ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g nobs out l o c [ ( out market==s t a t e ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ mean ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g params v a l u e s [ ] out l o c [ ( out market==s t a t e ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ s t d ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g b s e v a l u e s [ ] out l o c [ ( out market==s t a t e ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ t _ s t a t ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g t v a l u e s v a l u e s [ ] out l o c [ ( out market==s t a t e ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ p v a l u e ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g p v a l u e s v a l u e s [ ] out l o c [ ( out market==s t a t e ) & ( out i n f o r==’ no obs ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g nobs model = smf o l s ( ’ dat [ new_col ] ␣~␣ ␣+␣ dat [ "UP"+ s t r ( s e l f week_def_state ) ] ’ , data=dat ) r e g = model f i t ( cov_type="HAC" , cov_kwds={ ’ maxlags ’ : k2−k1 } ) 100 out l o c [ ( out market=="UP−DOWN" ) & ( out i n f o r==’ no obs ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g nobs out l o c [ ( out market=="UP−DOWN" ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ mean ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g params v a l u e s [ ] out l o c [ ( out market=="UP−DOWN" ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r==’ s t d ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g b s e v a l u e s [ ] out l o c [ ( out market=="UP−DOWN" ) & ( out r==r ) & ( out p o r t == p o r t ) & ( out i n f o r == ’ t _ s t a t ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g t v a l u e s v a l u e s [ ] out l o c [ ( out market=="UP−DOWN" ) & ( out r==r ) & ( out p o r t==p o r t ) & ( out i n f o r == ’ p v a l u e ’ ) , "week_"+s t r ( k1)+"_"+s t r ( k2 ) ] = r e g p v a l u e s v a l u e s [ ] return out def p r o f i t _ s t a t e ( s e l f ) : out = pd DataFrame ( columns = [ ’UP ’ , ’DOWN’ ] , i n d e x = range ( , s e l f K+1)) d = s e l f raw_capmAlpha_ffAlpha_gap ( ) d [ ’UP ’ + s t r ( s e l f week_def_state ) ] = \ d i n d e x map( s e l f vnindex [ ’UP ’+s t r ( s e l f week_def_state ) ] ) d [ ’DOWN’ + s t r ( week_def_state ) ] = \ − d i n d e x map( s e l f vnindex [ ’UP ’+s t r ( s e l f week_def_state ) ] ) f o r k in range ( , s e l f K+1): out l o c [ out i n d e x==k , ’UP ’ ] = d l o c [ d [ ’UP ’+s t r ( s e l f week_def_state )]==1 , ’ wml_raw ’+s t r ( k ) ] mean ( a x i s = ) out l o c [ out i n d e x==k , ’DOWN’ ] = d l o c [ d [ ’DOWN’+s t r ( week_def_state )]==1 , ’ wml_raw ’+s t r ( k ) ] mean ( a x i s =0) out [ ’cumUP ’ ] = out [ ’UP ’ ] cumsum ( ) out [ ’cumDOWN’ ] = out [ ’DOWN’ ] cumsum ( ) return out ... thị trường chứng khoán hoạt động tốt theo chức thị trường vốn Mục đích nghiên cứu Mục tiêu chung đề tài cung cấp chứng hiệu ứng động, yếu tố tác động nguồn gốc gây hiệu ứng thị trường chứng khốn... 1.4.1 Bằng chứng hiệu ứng momentum thị trường nước Trong suốt nhiều thập kỷ qua, có nhiều nghiên cứu hiệu ứng momentum thị trường khác thị trường tổng hợp nước giới Bằng chứng hiệu ứng momentum. .. nghiên cứu hiệu ứng momentum thị trường chứng khoán Việt Nam Chương 4: Kết luận khuyến nghị CHƯƠNG CƠ SỞ LÝ THUYẾT VÀ TỔNG QUAN NGHIÊN CỨU Thị trường tài chính, đặc biệt thị trường chứng khoán thu