Bài viết sử dụng 1 số chỉ báo phân tích kỹ thuật (breadth) để tìm alpha factors cho VNINDEX với Information Coefficient.
Mục tiêu bài viết:
- Đánh giá và lọc các extreme events của VNINDEX.
- Mining các strategies phù hợp để có alpha theo breadth với IC.
- Backtesting lại trading rules để có kết quả cuối cùng.
Kết luận:
- New High MA sẽ phù hợp ở mức threshold là 60% và cho kết quả giao dịch tốt nhất khi nắm giữ trong 20 ngày nếu có tín hiệu.
- Tín hiệu giao dịch outperform so với benchmark trong khoảng thời gian từ 2020 – nay cho kết quả vượt trội benchmark với mức drawdown tối đa là 31%, sharpe ratio và sortino ở mức trung bình 0.65 và 0.85.
Ghi chú:
- Bài viết thuần túy về nhận định và phân tích cá nhân của mình.
- Ngôn ngữ viết bài giống văn nói thông thường, ít học thuật đôi lúc lõm bõm tiếng anh, hi vọng mọi người thông cảm cái này.
- Dữ liệu sử dụng là được truy cập và tính toán từ thư viện vnstock, trong đó dữ liệu được tính toán theo rổ VNALLSHARES hiện tại.
- Tạm bỏ qua các phương pháp TimeseriesCV hoặc walkforward testing, do đó các kết quả có thể sẽ có sự khác biệt nếu sử các phương pháp này (tuy nhiên theo kinh nghiệm của mình thì sẽ không nhiều đâu).
- Phạm vi dữ liệu từ 2013 – tháng 08/2025.
I) TĂNG TRƯỞNG CỦA VNINDEX QUA THỜI GIAN
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 1 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!TNqF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc16b2a68-7884-47e0-aef4-c359d509d2e1_1176x624.png)
Filter lại VNINDEX qua hơn 10 năm với 3 lần độ lệch chuẩn thì có hơn 61 events (1.96%) có biến động vượt quá biên này (3.46%), lần lượt với 2 mức khác là 2.5 (biên: 2.88%) và 2.0 (biên: 2.31%) thì mình sẽ có số lượng events là 102 (chiếm 3.27%) và 170 (chiếm 5.45%). Bằng quan sát thì có thể thấy filter với biến động 3 lần độ lệch chuẩn sẽ hạn chế số lượng noises nhiều hơn, nên mình tạm giả định rằng mức filter tính toán sẽ là 3 lần độ lệch chuẩn.
II) QUAN SÁT MARKET BREADTH
Breadth thường được biết có đặc tính là sentiments của thị trường, đo lường và warning cho sự thay đổi trong sentiments. Tuy nhiên thì mình nghĩ cần test thêm để chắc cái yếu tố này. Do đó, mình sẽ test thử cái market breadth phổ biến nhất:
- New High MA: tỷ lệ % cổ phiếu tăng giá trên đường trung bình 200 ngày (200MA).
New High MA:
1 cách lý thuyết thì breadth này thường là tín hiệu cho sự tích cực momentum của thị trường (giá trên MA200), từ đó đoán xem mức độ tin cậy của VNINDEX xem nó sẽ còn momentum không.
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 2 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!iass!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7504824b-29ae-428e-a635-00eb195fca99_1211x606.png)
Chart ở trên cho thấy là so với VNINDEX, new_high_MA có mức độ biến động khá tương đồng và tương đối ổn định hơn. Đặc biệt có vẻ như trong dài hạn thì divergence của VNINDEX và New_high_MA sẽ là tín hiệu tốt cho 1 cú bullish mạnh và ngược lại.
Ngoài ra thì có vẻ như new_high_MA cũng có tính mean reversion khá tốt, khi cứ chạm mốc 2std sẽ quay đầu.
Ok! Đó tất cả chỉ là phỏng đoán, giờ mình sẽ vẽ thử xem so với return 1 ngày thì biến động của breadth này và sẽ như thế nào.
Để tránh bị lookahead bias, mình sẽ chia dữ liệu thành 2 tệp train và test. Mình sẽ mining signals trên tập train và test trên tệp test. Thời gian phân chia sẽ lấy mốc năm 01-01-2020, có thể “thanh trừng” khoảng thời gian giao thoa giữa 2 tệp để tránh hiện tượng look-ahead bias (tại sao thì mình sẽ giải thích thêm ở dưới).
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 3 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!HIT3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbfeb3ed-f957-42c9-a490-a6dee66c29df_601x584.png)
Chart trên cho thấy đường hồi quy có hệ số góc dương và hơi check nhẹ 1 tí, giá trị outliers cũng có vẻ hội tụ khá tốt quanh chart nhiều với outliers cũng phân bổ khá xa đều (:)))). Tuy nhiên hệ số góc dương nhẹ như này (gần như bằng 0) cũng có nghĩa là nếu trading rules với 1 ngày (không khả thi vì trading cơ sở cần T+2.5) thì sẽ chỉ có mức kỳ vọng returns dương nhẹ hơn 0 một tí. Vậy mình cần tìm 1 cái khoảng thời gian trading phù hợp hơn, đủ dài để trade có lãi và phải có ý nghĩa thống kê. Để kiếm chứng cái này mình sẽ thử dùng 1 cái kiểm định về Information Coefficient để test thử xem returns ở mức nào là hợp lý.
Information Coefficient (IC) cơ bản chỉ là dùng 1 số phép đo tương quan để xem mức độ tương quan giữa chỉ báo và lợi nhuận theo các khung thời gian khác nhau. Tuy nhiên khác biệt chính ở chỗ là phép đo tương quan thông thường sử dụng là Pearson, vốn chỉ đo tương quan tuyến tính, đó nếu biến động của 1 biến quá bé so với biến còn lại (nếu vẽ lên scatter chart thì nó co cụm) thì Pearson sẽ giải thích rất tệ. Phép đo trong IC thường sử dụng là Spearman hoặc Kendall, sẽ có thể đo được các tương quan không tuyến tính. Nôm na là các phép đo này sẽ rank trước và đo sau, do đó giải quyết được vấn đề co cụm hoặc không tuyến tính của Pearson, chi tiết thì các bạn có thể google để rõ hơn. Trong phạm vi bài này thì mình sẽ dùng Spearman để đo, kết quả đo IC của new_high_MA so với return các khung thời gian nắm giữ khác nhau như bảng sau:
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 4 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!q5La!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd594596-f8c3-4645-8689-e6302a1749ec_1339x375.png)
(fw_ret: là forward return với số ngày nắm giữ sau đó)
Theo đó thì có vẻ như thời gian nắm giữ trên 20 ngày sẽ có IC cao nhất và có p-value cũng đáng tin cậy nhất. Lúc này thì vấn đề overlap giữa 2 khoảng thời gian train và test có thể xuất hiện vì thời gian nắm giữ là 20 ngày, điều này có nghĩa nếu có tín hiệu xuất hiện vào ngày cuối cùng của tệp train thì nó sẽ lấy lợi nhuận của tệp test và tệp test sẽ bị lookahead bias tại điểm bắt đầu. Lúc này mình cần “thanh trừng” để đảm bảo tệp test sẽ không bị ảnh hưởng vấn đề này.
Vậy là mình tìm được trading rules có vẻ phù hợp ở mức 20 ngày, giờ mình sẽ vẽ lại chart của fw_ret_20 ngày và new_high_MA.
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 5 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!orvi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0329860d-e1b9-4629-a1fb-daaee70ceedd_601x584.png)
Kết quả đã tốt hơn rất nhiều, so với fw_ret_1 ngày, rõ ràng rule này có hệ số góc cao hơn khá nhiều với dường dốc khá cao, trong đó returns kỳ vọng cũng có mức cao hơn nhiều —> Cơ bản mình đã có 1 cái rules để trade cho cái chỉ số này với thời gian nắm giữ là khoảng 20 ngày.
Ngoài việc nắm giữ 20 ngày này, thực ra còn rất nhiều yếu tố để tiếp tục phải tìm kiếm trading rules. Chẳng hạn:
- Ngưỡng take profit, stop loss, phương pháp tính các ngưỡng này.
- Liệu rules có phù hợp để stop trailing hay không hay sẽ chỉ đạt đến mức độ kỳ vọng thì mình “té” (=)))
- Bet sizing: giá trị vào lệnh hoặc tỷ lệ vào là bao nhiêu?
Tất cả những yếu tố này đều có thể dùng IC để test để tìm ra rules phù hợp và 1 cách nào đó có ý nghĩa thống kê. Theo mình, cái này sẽ phải đi trước khi đưa vào backtest, 1 phần tiết kiệm thời gian, 1 phần tránh hiện tượng meta-lookahead bias (tránh bị lệch lạc nhận thức mà không nhận ra rằng mình đã biết trước sự kiện đó để backtest).
Bây giờ mình đã có rules về thời gian nắm giữ, bằng các kiểm định IC tương tự cho các vấn đề trên mình đã có được cái rules cụ thể như sau cho VNINDEX:
- Số ngày nắm giữ: 20 ngày
- Take Profit: 1.0 ATR(14)
- Stop Loss: 0.5 ATR(14)
- Trailing stop: không phù hợp (đủ là té luôn)
- Bet sizing: tạm thời giả định là cứ có signal là 100%.
- Style trading: Long only.
Sau đây mình sẽ backtest lại theo các rules này.
III) BACKTESTING
Để có thể trade được mình cần tìm được 1 cơ sở xác định cho tín hiệu nào đáng tin cậy hơn. Đường hồi quy ở chart trên cũng hình hóa mối quan hệ tuyến tính giữa chỉ báo và lợi nhuận, tuy nhiên phần đuôi của đường hồi quy bị “toe” khá to, đặc biệt là giá trị toe nằm ở miền dưới đường hồi quy nhiều hơn, outliers phân bổ ở mức này cũng khá nhiều. Có thể thấy là các giá trị ở vùng này không đáng tin cậy để trade, bằng mắt thì mình sẽ tạm giả định cái ngưỡng trading là new_high_MA từ 45% trở lên là đáng tin cậy. Tuy nhiên thì mình cần phải tìm ra được 1 cái threshold phù hợp để có được signal, để làm được cái này thì mình sẽ backtest lại các threshold để xem cái nào tối ưu nhất, mình sẽ test với threshold từ 45% – 65% để tìm cái kết quả phù hợp nhất, lưu ý là chỉ test trên tệp train để tìm threshold phù hợp:
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 6 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!xM3w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3722b53e-1fd4-4787-a93d-35f2668f1332_1659x824.png)
Có thể thấy là kết quả của threshold = 60% cho sharpe ratio, sortino ratio cao nhất. Mặc dù vậy, calmar ratio chỉ đứng thứ 2 sau threshold 65%. Calmar ratio sẽ đánh giá về mức độ hồi phục từ drawdown về lại đỉnh cũ nên nếu lớn hơn 1.0 thì sẽ chấp nhận được. Tần suất giao dịch của threshold này cũng ở mức 60 trades, tương đương khoảng trung bình 0.5 lần trong 1 tháng. Đây là mức khá ổn định theo khẩu vị của mình.
Vậy mình sẽ dựa vào đây để chọn threshold là 60%, trong đó có mức sharpe và sortino tốt, calmar hợp lý để test chiến lược.
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 7 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!ZpXp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c068ab4-ab08-4d5d-9d9c-b4bcfec37fc2_832x1082.png)
Kết quả test cho thấy mức tăng trưởng khá ấn tượng giữa IS (in sample) vs. OOS (out-of-sample), tuy nhiên, Sharpe ratio của tệp test giảm chỉ còn 0.65 và sortino chỉ còn 0.85 so với 1.12 và 1.58 của tệp train. Tuy nhiên thì alpha trung bình cũng khá ổn định với mức 0.05 so với 0.07.
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 8 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!1lWm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e5af6d-d79e-405d-8889-2a65ab380fb5_1302x330.png)
Drawndown khi test trên toàn bộ dữ liệu cũng cho thấy mức sụt lớn nhất là 31% so với mức 23% trên tệp train. Tuy nhiên, để có thể đánh giá tốt hơn mình sẽ so sánh với index trong cùng thời điểm.
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 9 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!EuxX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dd5c7ba-7510-404e-8ba1-e364a193f721_539x739.png)
Kết quả backtest trên tệp test cụ thể theo bảng trên, chart dưới đây sẽ cụ thể hơn KQ này:
![[TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH 10 [TECHNICAL INSIGHTS] - ĐI TÌM "ALPHA" CHO VNINDEX TỪ MARKET BREADTH](https://substackcdn.com/image/fetch/$s_!QPiv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F979c8167-118e-44b4-88b7-2c5bb7c8b3e9_1247x4967.png)
Có thể thấy, kết quả cho thấy strategy outperform hoàn toàn so với BnH benchmarkt của index. Trong đó, kết quả live test từ ngày 01-01-2020 khá tốt, phần lớn sự sụt giảm đến từ năm 2022, các năm còn lại bình quân đều perform từ 18% trở lên.
Theo quan điểm của mình, chỉ báo này có thể chấp nhận ở mức “tạm được” với performance tốt so với benchmark và có thể đưa vào để sử dụng là feature cho 1 model trading lớn hơn.
Bài viết đến đây cũng tương đối dài, mình xin dừng ở đây.
Trân trọng cảm ơn!
Nguyễn Lê Khánh
Khóa học Phân tích kỹ thuật – CMT Level 1
Khóa học được Green Chart thiết kế dành riêng cho các bạn thí sinh muốn học và ôn thi CMT cấp độ 1 tại Việt Nam. Nội dung chương trình học bao gồm 25 buổi học lý thuyết, luyện đề và thi thử. Học viên cũng được cung cấp miễn phí giáo trình, bộ câu hỏi và đề thi thử phục vụ cho quá trình ôn thi. Học lại miễn phí trọn đời khóa học.
Tham khảo thêm chi tiết về khóa học Tại đây.