Bài này mình sẽ tập trung phân tích các yếu tố cơ bản đến VNINDEX nhưng không giới hạn loại model sử dụng để đánh giá. Bên cạnh models, mình cũng sẽ test hiệu quả của việc labeling để tìm strategies.
Mục tiêu bài viết:
-
- Sử dụng các thông tin cơ bản (P/E, P/B, …) để đánh giá ảnh hưởng tới VNINDEX và dự báo.
-
- Tìm chiến lược trading phù hợp dựa trên các dữ liệu này.
Kết luận:
-
- Mặc dù đã rất cố gắng, nhưng model không thể outperform được benchmark!
-
- Phương pháp quan sát bằng mắt có vẻ vẫn đang ghi điểm tốt hơn khi có alpha tốt, cùng 1 khoảng thời gian!
-
- Mặc dù vậy mình không đánh giá cái nào tốt hơn cái nào, vì có thể rằng mình mining ML model chưa đúng cách. Có rất nhiều ưu điểm khi sử dụng ML khi mình có thể tối thiểu hóa thời gian quan sát và thay bằng các kiểm định để có được số lượng biến nhiều nhất. Tuy nhiên, tài nguyên tính toán và trực giác để tìm models vẫn là yếu tố then chốt.
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 dựa trên kiến thực hạn hẹp mà mình có, nên sẽ hơi chủ quan. Rất mong nhận được sự góp ý từ mọi người!
-
- 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 vnstocks (http://vnstocks.com).
-
- Phần này mình sẽ sử dụng TimeseriesCV để đánh giá và lựa chọn features và models.
-
- Phạm vi dữ liệu từ 2017 – nay cho VNINDEX. Thời gian phân tách giữa train và test sẽ khác phạm vi của bài trước để mình có 1 tệp validation (xác nhận) trong khoản thời train, cụ thể mình chọn ngày phân đoạn là ngày 01-06-2024.
Labeling
Labeling có nghĩa là gắn nhãn, tuy nhiên thì mình hiểu món này là đánh giá signal từ dữ liệu quá khứ cho nó đơn giản. Sau 1 thời gian nghiên cứu và tìm tòi mấy cái món model này thì mình thấy phần này rất quan trọng vì model nó sẽ được train từ các tín hiệu này. Trong bài này mình sẽ gắn nhãn thử với 2 cách:
-
- Cách 1: đơn thuần là theo return của ngày giao dịch, nếu lãi thì giá trị là 1, nếu lỗ thì giá trị là 0.
-
- Cách 2: Mình sẽ phân loại theo regime dựa trên việc hồi quy theo 1 thuật toán xin trích nguyên văn là “trend-scanning method” theo Lopez (2020), Machine Learning for Asset Managers. Thuật toán này sẽ theo công thức này:
-
-
- Trong đó: l là thời gian quan sát rộng ra (quan sát về tương lai từ thời điểm hiện tại); giá trị x là giá của tài sản quan sát —> x tại [t+l] là giá trị x tại thời điểm t với trong l ngày tiếp.
-
- Thuật toán sẽ hồi quy giá trị x để tìm giá trị l trong khoảng từ 0 đến L-1 với L là mối quan sát về tương lai, từ đó tính ra Beta 1 hay là hệ số góc hồi quy giữa giá và thời gian dự báo. Beta này cho thấy mối quan hệ tuyến tính giữa giá và thời gian quan sát. Tuy nhiên, Beta 1 cũng sẽ biến động theo các giá trị quan sát, trong khi đó mình cần tín hiệu sẽ là dạng như tăng, giảm, đứng yên (tương ứng với tín hiệu là 1,-1,0). Vậy thì lại cần scaling Beta theo độ lệch chuẩn của nó (keke) và giá trị scaling này là t-value:
- Từ đó tìm được t-value có ý nghĩa thống kê lớn nhất cho trong phạm vi quan sát [0,…,L-1] để đánh giá tín hiệu. Nôm na là tìm ra trend nhưng có ý nghĩa thống kê cao nhất, từ đó đánh nhãn tín hiệu. Vậy là tìm ra được trend nhưng tín hiệu lúc này xác định bằng gì (trend lên hay xuống). Lúc này chỉ cần… nhìn vào dấu của t-value là ra được trend (=]]), vậy là xong (keke).
-
- Ở đây mình sẽ scan với L = 20 để tìm ra tín hiệu trend phù hợp nhất trong khoảng thời gian này.
-
- Tuy nhiên thì tương tự như bài trước, mình không thể Short được cơ sở, do đó là tất cả những signal có giá trị bằng -1 (trend giảm) thì mình sẽ thay thế nó bằng 0 để dễ phân loại.
-
Ok! Giờ mình sẽ vẽ thử các tín hiệu này lên:
Đây là tín hiệu theo cách 1:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 29 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!wBVc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d5f7e76-9cb3-4985-a1f2-b95a9595c64d_1491x591.png)
Đây là tín hiệu theo cách 2:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 30 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!sfqW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52662811-fb03-46d8-b015-b1b7df62ae86_1491x591.png)
Có thể thấy, so với cách 1, cách 2 ít giá trị nhiều hơn rất nhiều và phản ánh khá đúng các đoạn sụt giảm của thị trường (màu vàng là sụt giảm hoặc neutral).
—> Mình sẽ lựa chọn cách 2 để gắn nhãn dữ liệu.
Feature Engineering
Feature engineering theo mình đang hiểu là chế ra các biến để đưa vào model. Không giống như cách tiếp cận ở bài trước đó là mình đã mặc định sẵn 1 số chỉ số quan sát để trade, ở đây mình sẽ tạo ra các giá trị quan sát và đưa hết các giá trị quan sát vào trong model để cho nó học. Model có thể hiểu là 1 công thức nào đó để tìm ra được tín hiệu, ở cách tiếp cận 1 công thức đó là từ quan sát và tìm ra tín hiệu, cách tiếp cận này thì sẽ để máy tìm ra tín hiệu có giá trị giao dịch tốt.
Ở phần 1, để có thể lựa chọn được giá trị quan sát được, mình đã tính thủ công các trường hợp về threshold của z-score của PE và PB với từng giá trị quan sát cụ thể, sau đó lựa chọn giá trị cho ra kết quả có khả năng có lợi nhuận ổn định nhất theo ba yếu tố Sharpe, Sortino và Calmar ratio. Phần này mình sẽ tính tất cả các giá trị này và gộp chung vào 1 bảng dữ liệu để tìm ra biến có khả năng giải thích cao nhất.
Các features sẽ dùng để tính toán gồm:
-
- PE và các biến thể của PE theo giá trị động của trung bình, độ lệch chuẩn, z-score theo từng nhóm và % tăng hoặc giảm của PE của theo từng khung thời gian động theo các khung thời gian của phần 1 (tương tự cho PB).
-
- Các tín hiệu của PE và PB theo các ngưỡng threshold quan sát trong phần 1.
-
- Các features về ngày, tháng, năm.
-
- Và một số feature mới về Breadth và volatility như sau:
-
- Market volatility: Cái này mình tính toán từ biến động của tất cả các cổ phiếu trong rổ VNALLSHARES nhằm tìm 1 chỉ số giống như VIX của USA, tất nhiên nó chỉ là biến động trong quá khứ (historical volatility), nên không đo lường được thêm yếu tố thời gian như VIX (VIX là options, và options có cấu phần giá trị thời gian). Cụ thể như về chỉ số này như hình dưới đây
-
- Market new high MA: cái này là chỉ số mình dùng trong bài breadth để tìm alpha.
-
- Market High Low Breadth: cái này mình đo lường số lượng cổ phiếu tăng trong tổng số cổ phiếu của rổ VNALLSHARES. Nó sẽ có hình dạng như này:
-
- Và một số feature mới về Breadth và volatility như sau:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 31 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!Op53!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f148d6f-8dd0-4f2a-a43d-add0ea792b05_1292x125.png)
Theo đó thì mình có 1 bảng dữ liệu với số lượng features khoảng 168 cái để dùng tiên lượng. Lúc này có 1 vấn đề mới, các biến này đều là biến tính toán từ các khoảng thời gian khác nhau, vậy rất có khả năng cao chúng bị đa cộng tuyến (lại là 1 khuyết tật của thống kê). Việc đa cộng tuyến này sẽ phóng đại kết quả của mô hình khi train nó và do đó sẽ làm chúng ta chọn sai mô hình thực sự tốt. Để hạn chế việc này thì có 1 số cách, chẳng hạn:
-
- Dùng correlation để loại đa cộng tuyến, thường correlation > 0.8 sẽ bị đánh giá là đa cộng tuyến.
-
- Dùng VIF để đánh giá đa cộng tuyến, nếu VIF > 10 thì có vấn đề đa cộng tuyến rất cao. VIF là gì?
-
- VIF (Variance Inflation Factor) được tính như này:
-
- Trong đó R2 là R-square của hồi quy tuyến tính giữa các features lẫn nhau. Nôm na là hồi quy lặp lại hết tất cả các features, nếu R2 cao hơn 90% => VIF > 1/0.1 = 10. R2 càng cao thì VIF càng lớn, càng có vấn đề, nên VIF dưới 90% thì mới coi là tạm được.
-
- Dùng VIF để đánh giá đa cộng tuyến, nếu VIF > 10 thì có vấn đề đa cộng tuyến rất cao. VIF là gì?
-
- Dùng Factor Analysis hoặc PCA (Principal Component Analysis) để chuyển hóa thành các factor có ý nghĩa.
-
- Dùng 1 số phương pháp hồi quy khác như Rigde, Lasso, PLS… để đánh giá xem biến nào quan trọng
Khá nhức đầu, ở đây mình chỉ dùng phương pháp cổ điển nhất là correlation nhưng sử dụng Spearman correlation để đánh giá (tương tự như việc đo Information Coefficient ở bài đánh giá Breadth).
Chạy thử correlation cho các features thì mình có kết quả như sau:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 32 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!6pvy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9df40e5d-66f5-4ccf-a2f6-096e9e9623da_694x578.png)
Có vẻ như các features này cũng có sự tương quan ‘da beo’ với nhau khá nhiều. Mình cần tìm các features có vấn đề đa cộng tuyến mạnh mà mình quan sát sơ bộ thấy nhưng vẫn cần giữ lại các đặc tính cần thiết. Làm sao để giữ lại các đặc tính cần thiết, mình cần đưa nó vào model thì mới biết được, vậy là mình vừa phải lọc được features, vừa phải train model thì mới giải quyết được, nhưng model gì?
Ok! Các câu hỏi dẫn dắt đến các vấn đề chính như sau:
-
- Model cần tìm là model gì?
-
- Có cách nào để vẫn dùng correlation và model để kết hợp để tìm được features phù hợp?
-
- Các thông số nào để đánh giá sự phù hợp và lựa chọn models?
Giờ mình move đến đoạn tiếp theo để trả lời các câu hỏi này.
Train model
Ở đây, sự chủ quan lại tiếp tục xuất hiện (=]]), mình sẽ đưa ra 1 số giả định hoặc phạm vi quan sát chủ quan để trả lời các câu hỏi này:
-
- Model sử dụng là model phân loại, ở đây mình sẽ dùng các model: Logistic Regression, Random Forest Classifier, Super Vector Machines, Decision Tree Classifier để train (có rất nhiều tài liệu giải thích các model này, ở đây mình chỉ đưa nó để chạy tìm ra model tốt nhất).
-
- Cách phù hợp thì mình sẽ dùng 1 phương pháp có sẵn trong thư viện scikit-learn trên python là TimeseriesCV (time series cross validation). Tại sao?
-
- Dữ liệu chuỗi thời gian cho tài chính nó có 1 vấn đề lớn là serial correlation (tương quan chuỗi hoặc tự tương quan), nôm na là giá quá khứ có thể ảnh hưởng đến giá hiện tại (để mình còn có momentum mà trade chứ =]]).
-
- TimeseriesCV sẽ có dạng như hình này:Trong đó màu in đậm là vùng giá trị để tính toán các tham số model, vùng sáng có ô trống ở giữa là vùng để tính toán giá trị kiểm tra và cứ cuốn chiếu dần đến khi dùng hết dữ liệu train model.
-
- Tại sao lại phải chia nhỏ thành các thành các stage này? để mình train và test model theo các features mình đã lựa chọn để tìm ra được số features phù hợp theo 1 số model phù hợp với các metrics phù hợp (=]]) và hạn chế việc rò rỉ dữ liệu. Tại sao lại có rò rỉ dữ liệu? Vì nó là time series, chúng ta không rõ được dữ liệu nó sẽ có momentum đến bao lâu, do đó nếu lấy ngẫu nhiêu các tệp test trong dữ liệu, rất có thể nó đang mang giá trị có chứa momentum của 1 số khoảng thời gian, điều này dẫn đến rò rỉ dữ liệu.
-
- Cách phù hợp thì mình sẽ dùng 1 phương pháp có sẵn trong thư viện scikit-learn trên python là TimeseriesCV (time series cross validation). Tại sao?
-
- Các thông số để lựa chọn phù hợp, đây là 1 phạm trù còn cảm tính hơn và thực sự mình đang cảm thấy cũng hơi giốt phần này, tuy nhiên mình sẽ cố gắng đánh giá theo cách này:
-
- Có 1 số thông số khi đánh giá model: Accuracy, Precision, Recall, F1 Score và ROC-AUC. Thông thường, accuracy sẽ có vẻ được chú ý đầu tiên khi đánh giá, nó đo độ chính xác của model 1 cách thuần túy, tuy nhiên nếu label bị lệch hoặc bị bias, accuracy sẽ không có ý nghĩa vì sẽ không phân loại được label có nhãn nhỏ hơn hoặc ngược lại.
-
- Trong quan sát của chúng ta với ‘trend-scanning-method’, mức độ cân bằng của nhãn cụ thể như sau:Số lượng nhãn có giá trị 1 đang chiếm đến 63%, có nghĩa là bị bất cân xứng, lúc này nếu đem train model, rất có khả năng model sẽ gắn trọng số tiên lượng cho các nhãn có giá trị 1 cao hơn. Mình có thể tăng trọng số để giảm vấn đề bias này hoặc dùng các metrics như AUC, F1-Score, Precision-Recall Curve.
-
- Một cách chủ quan mình sẽ chọn Precision-Recall Curve để có thể lựa chọn được model và features tốt nhất.
-
- Các thông số để lựa chọn phù hợp, đây là 1 phạm trù còn cảm tính hơn và thực sự mình đang cảm thấy cũng hơi giốt phần này, tuy nhiên mình sẽ cố gắng đánh giá theo cách này:
Sau đó mình sẽ đem hết cái đống này gộp vào 1 cái gọi là Pipeline, trong scikit-learn có 1 cái pipeline như thế này, nó sẽ tuần tự từng tác vụ và làm khi mình lặp lại trong quá trình Cross validation (quá khỏe =]]), sau đó lưu lại hết các thông tin đã chạy và xuất ra giá trị tốt ưu nhất.
Giờ train ra model với kết quả như sau:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 33 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!Z5vU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5725f68d-8fc8-44ff-ade1-4782d41583c4_1650x584.png)
Vậy là model là hoa hậu phân loại là Logistic Regression! Số lượng features được lựa chọn chiếm 50% (khoảng 81 cái) trong tổng số.
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 34 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!CO0d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffecd218b-fda3-46a6-b969-c59e4732652c_849x540.png)
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 35 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!BLrz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51dba9d3-e2de-4d67-9daf-8fc7e1fc1203_681x82.png)
Tại mẫu quan sát, prevalence (% giá trị là 1 của y-test) đạt mức 67%, hoa hậu của chúng ta predict ra cao hơn cái này, thế được coi là cũng tạm thôi vì giá trị 0.73/0.63 = 1.09, có nghĩa mô hình chỉ cải thiện được 9% so với random signal thôi. Ngoài ra, ở recall cao (→ gần 1), precision tụt về ~0.66–0.68 ≈ rất gần baseline ⇒ phần đuôi của mô hình không phân biệt được.
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 36 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!kJVu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aa3401-180e-48fa-b4da-5df05840ddf0_843x540.png)
Ở đây AUC khá thấp, chỉ khoảng 55.9% tức là trên cái đường 50% 1 xíu như hình vẽ, nó sẽ dẫn đến kết quả phân loại vẫn có lệch lạc đáng kể. Vấn đề này rất nan giải, nó có thể đến từ nhiều yếu tố:
-
- Thiếu features: có thể features bị bỏ sót rất nhiều do phương pháp dùng correlation hoặc có thể số lượng features cơ bản là yếu (168 cái là không đủ mà phải tìm thêm). Tuy nhiên nếu có quá nhiều features thì nó sẽ bị 1 cái tình trạng gọi là lời nguyền chiều không gian (=]], curse of dimensions), tức là sẽ có trường hợp trường dữ liệu còn ngắn hơn số lượng biến quan sát, điều này sẽ dẫn đến dự báo sai hoặc lệch lạc.
-
- Labeling có vấn đề, nhãn gắn tương đối noise và trường dữ liệu không đủ để train cái đống này. Hoặc cũng có thể là weight các nhãn này không đúng! Thực ra, Lopez có đưa ra 1 số giải pháp của ông trong các cuốn sách, chẳng hạn là Time Decay weighted và Weighted theo khoảng thời gian bị trùng lặp khi gắn nhãn.
-
- Model không đủ mạnh để tiên lượng!
Kiểm tra dữ liệu 1 lần nữa trên tệp y-test mình có kết quả như này:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 37 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!Smo0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd0cb76f-48d5-4132-8985-eb3d5832f048_644x540.png)
Có thể thấy dữ liệu bị lệch khá nhiều, và kết quả prediction của mình chỉ đạt mức phân loại tạm ổn cho tín hiệu mua (1). Nhìn kỹ hơn vào kết quả này bằng bảng này có thể thấy model perform khá yếu khi tìm các điểm out (giá trị 0).
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 38 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!SCL-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb61619a-0f2a-4447-ad95-671e523d2373_796x292.png)
Ok! Các vấn đề nhìn chung có thể cần phải mining rất nhiều, về models về các xử lý dữ liệu! Mình cũng đã có test rất nhiều đối với việc weighted theo Lopez, hiệu quả không khác biệt lắm, theo quan điểm của mình:
-
- Features thực sự có ý nghĩa;
-
- Model thực sự có khả năng phân loại: mỗi model sẽ có khả năng đánh giá tốt cho từng kiểu patents hoặc cho từng mã CP hoặc từng tệp dữ liệu khác nhau, nếu mình bị quá cứng nhắc trong việc train 1 models cho 1 mã sẽ không thể giải quyết được trên 1 tệp dữ liệu khác.
-
- Dùng meta model để cải thiện: là 1 loại model chỉ lấy kết quả từ các model khác để làm dữ liệu train và dự báo (kiểu như model dự báo regime thị trường từ 1 số phát ngôn dự báo của KOL chứng khoán =]], đôi lúc làm ngược lại lời KOL sẽ ok và đôi lúc ngược lại =]]).
Việc test, mining các features có lẽ sẽ phải làm vào lúc khác vì nó sẽ tốn tài nguyên và quá phạm vi của bài này (hiện chỉ tập trung vào yếu tố PE và PB). Ok! Sau khi train model trên các kết quả mình tìm được. Mình sẽ đưa vào backtest!
Backtesting
Kết quả backtest trên tệp dữ liệu từ 2018 – nay cho kết quả như sau:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 39 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!xtq0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67223082-beb9-44fb-a694-b27ea3e22324_816x1059.png)
Lưu ý rằng giai đoạn từ 2018 – 06/2024 là giai đoạn train model, do đó các kết quả chỉ là tham khảo để so sánh kết quả của tệp train và test. Tuy nhiên có thể thấy tệp test có kết quả tạm ổn với Sharpe, Sortino và Calmar lần lượt với 0.70, 1.0 và 0.62. Tuy nhiên thì alpha âm và Beta thì tới 0.97.
Vẽ lên chart để rõ hơn:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 40 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!_ZnV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdce83970-96db-4770-8f6a-fb3fee7ebdc3_1235x4964.png)
Lợi nhuận các năm live test từ giữa 2024 – 2025 cũng tàm tạm với 06 tháng âm trong số 18 tháng quan sát. So sánh với BnH từ 2024 trở đi thì kết quả như sau:
![[TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2) 41 [TECHNICAL INSIGHTS] ẢNH HƯỞNG CỦA CÁC YẾU TỐ CƠ BẢN TỚI VNINDEX (PHẦN 2)](https://substackcdn.com/image/fetch/$s_!MX46!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e509b78-6c35-4de9-8b6a-defada504d75_574x755.png)
Chậc! Kết quả không outperform nổi BnH từ năm 2024 – nay. Tất cả thông số đều thua hoặc xấp xỉ!
Rolling Sharpe cũng khá phập phù, có lúc âm rất cao!
Kết luận:
-
- Mặc dù đã rất cố gắng, nhưng model không thể outperform được benchmark!
-
- Phương pháp quan sát bằng mắt có vẻ vẫn đang ghi điểm tốt hơn khi có alpha tốt, cùng 1 khoảng thời gian!
-
- Mặc dù vậy mình không đánh giá cái nào tốt hơn cái nào, vì có thể rằng mình mining ML model chưa đúng cách. Có rất nhiều ưu điểm khi sử dụng ML khi mình có thể tối thiểu hóa thời gian quan sát và thay bằng các kiểm định để có được số lượng biến nhiều nhất. Tuy nhiên, tài nguyên tính toán và trực giác để tìm models vẫn là yếu tố then chốt.
Bài viết đến đây cũng khá dài! Hi vọng hữu ích cho các bạn, mong nhận được sự góp ý và giao lưu từ mọi người.
Trân trọng cám ơn!
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.





