Trang chủBlogKinh nghiệm TradingTOÁN HỌC TRONG QUANT TRADING: TẠI SAO CHỌN ĐƯỢC CỔ PHIẾU TỐT CHƯA CHẮC ĐÃ CÓ DANH MỤC ĐẦU TƯ TỐT?
TOÁN HỌC TRONG QUANT TRADING: TẠI SAO CHỌN ĐƯỢC CỔ PHIẾU TỐT CHƯA CHẮC ĐÃ CÓ DANH MỤC ĐẦU TƯ TỐT?
Kinh nghiệm Trading

TOÁN HỌC TRONG QUANT TRADING: TẠI SAO CHỌN ĐƯỢC CỔ PHIẾU TỐT CHƯA CHẮC ĐÃ CÓ DANH MỤC ĐẦU TƯ TỐT?

TOÁN HỌC TRONG QUANT TRADING

Ngọc Hải LươngNgọc Hải Lương
29/10/2026
17 phút phút đọc
32 lượt xem

Khi bắt đầu học Quant Trading, nhiều bạn thường nghĩ rằng cần giỏi toán cao cấp, biết đạo hàm, tích phân, đại số tuyến tính hay tối ưu hóa thì mới có thể xây dựng được một chiến lược giao dịch.

Nhưng thực tế, có khá nhiều bài toán tài chính sử dụng những kiến thức toán học mà chúng ta đã từng học ở trường, chỉ khác là khi đưa vào thị trường chứng khoán, cách áp dụng và ý nghĩa của chúng trở nên thú vị hơn rất nhiều.

Thử lấy một câu hỏi đơn giản: Giả sử bạn có 500 triệu đồng và muốn đầu tư vào 5 cổ phiếu FPT, HPG, MBB, MWG và VCB. Bạn đã phân tích khá kỹ và cho rằng cả 5 doanh nghiệp đều có tiềm năng. Vậy nên phân bổ vốn như thế nào?

Chia đều mỗi mã 20%? Phân bổ nhiều hơn cho cổ phiếu có lợi suất kỳ vọng cao nhất? Hay giảm tỷ trọng những cổ phiếu có biến động mạnh?

Nếu chỉ dựa vào cảm nhận, mỗi người sẽ có một cách lựa chọn khác nhau. Nhưng với Quant, chúng ta có thể chuyển vấn đề này thành một bài toán toán học với mục tiêu, biến số và các ràng buộc cụ thể.

Đây chính là một trong những ứng dụng rất thực tế của đại số tuyến tính và tối ưu hóa (Linear Algebra & Optimization) trong đầu tư.

PHẦN 1. TOÁN HỌC GIÚP CHÚNG TA HIỂU RỦI RO DANH MỤC NHƯ THẾ NÀO?

Trước khi nói đến tối ưu hóa, có một khái niệm mà mình nghĩ những người học Quant cần hiểu rõ: rủi ro của cả danh mục không đơn giản bằng trung bình cộng rủi ro của từng cổ phiếu.

Giả sử bạn có hai cổ phiếu A và B, cả hai đều có độ biến động lợi suất theo năm (annualized volatility) là 20%. Nếu đầu tư 50% vốn vào A và 50% vào B, liệu độ biến động của danh mục có bằng 20%?

Câu trả lời là chưa chắc, bởi còn phụ thuộc vào cách hai cổ phiếu biến động cùng nhau.

Nếu lợi suất của hai cổ phiếu có tương quan bằng 0, độ biến động danh mục 50/50 sẽ xấp xỉ 14,1%. Nhưng nếu hệ số tương quan lên tới 0,9, độ biến động danh mục sẽ khoảng 19,5%.

Đây là những kết quả tính toán từ dữ liệu giả định, nhưng chúng minh họa một điều khá quan trọng: dù độ biến động của từng cổ phiếu không thay đổi, rủi ro của danh mục vẫn có thể khác nhau đáng kể chỉ vì mối quan hệ giữa chúng.

Nói cách khác, việc nắm giữ nhiều cổ phiếu không tự động đồng nghĩa với đa dạng hóa rủi ro hiệu quả. Nếu những cổ phiếu đó thường xuyên tăng giảm cùng nhau, lợi ích đa dạng hóa có thể khá hạn chế.

Trong toán học, mối quan hệ này được thể hiện thông qua phương sai, hiệp phương sai và hệ số tương quan.

Với hai tài sản, phương sai danh mục được tính theo công thức:

Var(P) = wA² × σA² + wB² × σB² + 2 × wA × wB × σA × σB × ρAB

Trong đó, wA và wB là tỷ trọng đầu tư, σA và σB là độ lệch chuẩn lợi suất của từng tài sản, còn ρAB là hệ số tương quan giữa chúng.

Nhìn công thức có thể hơi nhiều ký hiệu, nhưng ý nghĩa rất đơn giản: rủi ro danh mục phụ thuộc vào tỷ trọng, độ biến động riêng của từng tài sản và mức độ chúng biến động cùng nhau.

Khi mở rộng từ 2 cổ phiếu lên 20 hoặc 100 cổ phiếu, việc tính toán thủ công trở nên rất phức tạp. Đây là lúc đại số tuyến tính phát huy vai trò. Thay vì viết riêng công thức cho từng cặp cổ phiếu, chúng ta sử dụng vector tỷ trọng và ma trận hiệp phương sai để biểu diễn toàn bộ bài toán.

Chẳng hạn, nếu có 5 cổ phiếu, ta sẽ có một vector gồm 5 tỷ trọng đầu tư và một ma trận hiệp phương sai kích thước 5×5. Các phần tử trên đường chéo chính thể hiện phương sai lợi suất của từng cổ phiếu, còn những phần tử khác thể hiện hiệp phương sai giữa các cặp cổ phiếu.

Từ đó, phương sai danh mục được tính gọn bằng biểu thức wᵀΣw, với w là vector tỷ trọng và Σ là ma trận hiệp phương sai.

Một điều mình thấy khá thú vị là toán học ở đây không chỉ giúp tính nhanh hơn. Nó còn giúp chúng ta nhìn nhận vấn đề đầu tư theo một cách khác.

Thay vì chỉ hỏi cổ phiếu nào có khả năng tăng mạnh nhất, chúng ta bắt đầu hỏi: Nếu thêm cổ phiếu này vào danh mục hiện tại, nó sẽ làm thay đổi rủi ro tổng thể như thế nào? Một cổ phiếu có độ biến động cao nhưng ít tương quan với các tài sản đang nắm giữ có thể tạo ra tác động khác với một cổ phiếu có độ biến động thấp nhưng gần như luôn đi cùng chiều với cả danh mục.

Tất nhiên, tương quan trong quá khứ không phải một hằng số. Khi thị trường xuất hiện cú sốc lớn, những cổ phiếu trước đây ít tương quan vẫn có thể cùng giảm mạnh. Vì vậy, ma trận hiệp phương sai là một công cụ đo lường rủi ro theo những giả định nhất định, không phải một bản đồ chính xác về mọi biến động sẽ xảy ra trong tương lai.

Hiểu được điều này cũng là nền tảng để bước sang bài toán tiếp theo: làm thế nào tìm ra tỷ trọng phân bổ vốn phù hợp?

PHẦN 2. TỐI ƯU HÓA DANH MỤC: TỪ MỘT Ý TƯỞNG ĐẦU TƯ ĐẾN BÀI TOÁN CÓ THỂ GIẢI BẰNG PYTHON

Khi đã biết cách tính rủi ro danh mục, chúng ta có thể bắt đầu xây dựng một bài toán tối ưu hóa.

Giả sử bạn có dữ liệu lịch sử của 5 cổ phiếu FPT, HPG, MBB, MWG và VCB. Bạn muốn tìm một cách phân bổ vốn sao cho rủi ro danh mục thấp nhất, đồng thời vẫn tuân thủ các giới hạn đầu tư.

Để làm điều đó, chúng ta cần xác định ba thành phần: biến quyết định, hàm mục tiêu và điều kiện ràng buộc.

Biến quyết định chính là tỷ trọng vốn đầu tư vào từng cổ phiếu. Ví dụ, nếu w1 đại diện cho tỷ trọng FPT, w2 cho HPG và tương tự với các mã còn lại, thì tổng các tỷ trọng phải bằng 100% nếu toàn bộ vốn đều được đầu tư vào 5 cổ phiếu.

Hàm mục tiêu có thể là tối thiểu hóa phương sai danh mục. Còn các điều kiện ràng buộc có thể gồm không sử dụng bán khống, không đầu tư quá 30% vào một mã và không phân bổ quá 40% tổng vốn vào một nhóm ngành.

Những giới hạn này không chỉ là chi tiết phụ. Chúng phản ánh cách chúng ta muốn quản lý rủi ro trong thực tế.

Nếu không giới hạn tỷ trọng, một mô hình tối ưu có thể đề xuất tập trung phần lớn vốn vào một vài mã dựa trên dữ liệu lịch sử. Điều đó có thể hợp lý theo hàm mục tiêu đã đặt ra, nhưng lại không phù hợp với khẩu vị rủi ro hoặc chính sách đầu tư của người sử dụng.

Đây là dạng bài toán được nghiên cứu rộng rãi trong lý thuyết danh mục đầu tư hiện đại, đặc biệt là mô hình Mean-Variance của Harry Markowitz.

Ý tưởng cơ bản của Mean-Variance Optimization là xem xét đồng thời lợi suất kỳ vọng và rủi ro danh mục. Với một mức lợi suất kỳ vọng mục tiêu, chúng ta tìm danh mục có phương sai thấp nhất. Hoặc ngược lại, với một mức rủi ro chấp nhận được, tìm danh mục có lợi suất kỳ vọng cao nhất trong những giả định và ràng buộc của mô hình.

Tập hợp các danh mục hiệu quả như vậy tạo thành đường biên hiệu quả, thường được gọi là Efficient Frontier.

Điều này giúp chúng ta hiểu tại sao không tồn tại một danh mục tối ưu duy nhất cho tất cả mọi người. Một nhà đầu tư ưu tiên hạn chế biến động có thể lựa chọn một điểm trên đường biên hiệu quả khác với người chấp nhận rủi ro cao hơn để tìm kiếm lợi suất kỳ vọng lớn hơn.

Để thực hành bằng Python, chúng ta có thể sử dụng pandas, NumPy và SciPy. Với những bài toán tối ưu hóa lồi có nhiều ràng buộc, CVXPY cũng là một công cụ đáng tìm hiểu.

Một quy trình thực hành có thể bắt đầu như sau.

Đầu tiên, lấy dữ liệu giá đã điều chỉnh phù hợp của các cổ phiếu trong một giai đoạn lịch sử. Sau đó, sử dụng pandas tính chuỗi lợi suất, kiểm tra dữ liệu thiếu và xây dựng ma trận hiệp phương sai.

Tiếp theo, sử dụng NumPy để tính lợi suất kỳ vọng và phương sai danh mục tại những tỷ trọng khác nhau.

Cuối cùng, dùng scipy.optimize.minimize() với phương pháp SLSQP hoặc xây dựng bài toán bằng CVXPY để tìm vector tỷ trọng đáp ứng các điều kiện đã đặt ra.

Ví dụ, ta có thể yêu cầu chương trình: “Tìm tỷ trọng phân bổ cho 5 cổ phiếu sao cho độ biến động danh mục là nhỏ nhất, tổng tỷ trọng bằng 100%, không bán khống và mỗi mã không vượt 30% vốn.”

Chương trình sẽ trả về một bộ tỷ trọng thỏa mãn các điều kiện nếu bài toán có nghiệm khả thi và thuật toán giải thành công. Chẳng hạn, kết quả có thể gợi ý phân bổ nhiều hơn vào cổ phiếu có biến động thấp, nhưng cũng có thể phân bổ đáng kể vào một mã biến động cao hơn nếu mã đó giúp giảm hiệp phương sai tổng thể của danh mục.

Một điểm quan trọng là tối ưu phương sai không đồng nghĩa với tối đa hóa lợi nhuận. Một danh mục có độ biến động thấp nhất chưa chắc mang lại lợi suất cao nhất, cũng chưa chắc có mức sụt giảm tối đa thấp nhất trong tương lai.

Nếu muốn xem xét lợi suất, chúng ta cần bổ sung một ước lượng lợi suất kỳ vọng cho từng tài sản và lựa chọn cách đánh đổi giữa lợi nhuận với rủi ro. Đây cũng là phần khó trong thực tế, bởi lợi suất kỳ vọng không thể quan sát trực tiếp mà thường phải được ước lượng từ dữ liệu hoặc mô hình dự báo.

Một cổ phiếu tăng rất tốt trong ba năm qua chưa chắc sẽ tiếp tục có lợi suất kỳ vọng cao trong ba năm tới. Nếu lấy trung bình lợi suất lịch sử rồi mặc định đó là mức sinh lời tương lai, kết quả tối ưu có thể phụ thuộc quá nhiều vào những giai đoạn đặc biệt của thị trường.

Do đó, khi mới học, mình nghĩ nên bắt đầu bằng bài toán Minimum Variance Portfolio, tức danh mục có phương sai thấp nhất, để hiểu vector, ma trận và tối ưu hóa có ràng buộc hoạt động như thế nào. Sau đó mới mở rộng sang Mean-Variance Optimization, Risk Parity hoặc các phương pháp phân bổ vốn khác.

Một bài tập khá thực tế là so sánh ba danh mục trên cùng một nhóm cổ phiếu: danh mục chia đều tỷ trọng, danh mục tối thiểu hóa phương sai và danh mục tối ưu Mean-Variance với các giới hạn rủi ro cụ thể.

Sau đó, kiểm tra xem ba cách phân bổ này có sự khác biệt như thế nào về lợi nhuận, volatility, Maximum Drawdown và tỷ lệ thay đổi danh mục.

Nếu làm được bài tập đó, bạn đã bắt đầu ứng dụng đại số tuyến tính và tối ưu hóa vào một vấn đề Quant thực sự, chứ không còn chỉ học các phép toán ma trận một cách rời rạc.

PHẦN 3. KHI TOÁN HỌC GẶP THỊ TRƯỜNG THỰC TẾ: VÌ SAO DANH MỤC TỐI ƯU TRÊN MÁY TÍNH CÓ THỂ KHÔNG TỐI ƯU NGOÀI ĐỜI?

Sau khi xây dựng được một chương trình tối ưu hóa danh mục, chúng ta có thể sẽ thấy kết quả khá thuyết phục. Python trả về những tỷ trọng cụ thể, volatility của danh mục giảm và đường biên hiệu quả cho thấy rõ sự đánh đổi giữa lợi nhuận với rủi ro.

Tuy nhiên, điều cần chú ý là kết quả tối ưu luôn phụ thuộc vào dữ liệu đầu vào và những giả định của mô hình.

Một ví dụ rất phổ biến là sai số ước lượng. Khi sử dụng lợi suất lịch sử để tính ma trận hiệp phương sai, chúng ta đang giả định rằng cấu trúc rủi ro quan sát được có đủ giá trị tham khảo cho giai đoạn tiếp theo. Nhưng thị trường chứng khoán luôn thay đổi. Một cổ phiếu từng có biến động thấp có thể đột ngột biến động mạnh, trong khi tương quan giữa các nhóm ngành cũng có thể thay đổi theo chu kỳ kinh tế, chính sách tiền tệ hoặc tâm lý nhà đầu tư.

Đặc biệt, lợi suất kỳ vọng thường khó ước lượng chính xác. Chỉ cần thay đổi tương đối nhỏ trong các ước lượng lợi suất hoặc hiệp phương sai, tỷ trọng tối ưu có thể thay đổi rất mạnh.

Chẳng hạn, với cùng năm cổ phiếu, mô hình có thể đề xuất phân bổ 30% vào một mã khi sử dụng dữ liệu 252 phiên gần nhất, nhưng lại giảm xuống 5% khi cập nhật thêm một số phiên mới. Nếu danh mục liên tục thay đổi như vậy, chi phí tái cân bằng có thể tăng lên đáng kể.

Đây là lý do các bài toán tối ưu thực tế thường bổ sung những ràng buộc như giới hạn tỷ trọng, giới hạn thay đổi danh mục và giới hạn mức độ tập trung theo ngành. Với những bài toán nâng cao hơn, chúng ta có thể sử dụng các kỹ thuật ước lượng ma trận hiệp phương sai ổn định hơn, chẳng hạn covariance shrinkage, hoặc đưa thêm yếu tố độ bất định của ước lượng vào quá trình tối ưu.

Đối với thị trường chứng khoán Việt Nam, còn có một số vấn đề cần đưa vào nghiên cứu.

Thứ nhất là thanh khoản. Một danh mục có thể tối ưu về mặt toán học nhưng lại yêu cầu mua khối lượng quá lớn so với thanh khoản thực tế của một cổ phiếu. Khi đó, giá thực hiện có thể khác đáng kể so với giá dùng trong mô hình.

Thứ hai là chi phí giao dịch. Nếu danh mục được tái cân bằng mỗi tuần hoặc mỗi tháng, chúng ta cần tính toán lượng cổ phiếu phải mua bán, phí, thuế và chi phí trượt giá. Một mô hình tạo ra tỷ trọng tốt nhưng yêu cầu giao dịch quá thường xuyên chưa chắc mang lại hiệu quả sau chi phí.

Thứ ba là các giới hạn thực hiện giao dịch, bao gồm biên độ giá, tình trạng thiếu thanh khoản và những trường hợp không thể mua hoặc bán theo đúng tỷ trọng dự kiến. Khi triển khai với số vốn cụ thể, số lượng cổ phiếu mua được cũng phải tuân thủ các quy định giao dịch và giới hạn vốn, thay vì giả định luôn có thể phân bổ chính xác đến từng phần nhỏ của một phần trăm.

Cuối cùng là sự khác biệt giữa kết quả trong mẫu và ngoài mẫu. Nếu chúng ta sử dụng dữ liệu từ năm 2020 đến 2025 để tìm ra bộ tỷ trọng tối ưu rồi đánh giá hiệu quả ngay trên cùng khoảng thời gian đó, kết quả có thể được hưởng lợi từ việc đã biết toàn bộ diễn biến quá khứ.

Cách kiểm tra phù hợp hơn là sử dụng dữ liệu có sẵn đến một thời điểm để ước lượng và tối ưu danh mục, sau đó áp dụng tỷ trọng vào giai đoạn tiếp theo chưa được sử dụng trong tính toán. Đến kỳ tái cân bằng, mô hình sẽ cập nhật các ước lượng từ dữ liệu đã biết và tiếp tục tối ưu.

Quy trình này có thể được triển khai theo phương pháp walk-forward, tương tự cách chúng ta kiểm định các chiến lược Machine Learning.

Ví dụ, vào cuối mỗi tháng, sử dụng dữ liệu 252 phiên trước đó để ước lượng ma trận hiệp phương sai, tìm tỷ trọng tối ưu rồi áp dụng cho tháng tiếp theo. Sau đó ghi nhận lợi nhuận thực tế, chi phí giao dịch và sự thay đổi của danh mục. Lặp lại qua nhiều tháng sẽ tạo ra một chuỗi kết quả ngoài mẫu, phản ánh cách mô hình hoạt động khi phải ra quyết định mà không biết trước tương lai.

Khi đánh giá, nên so sánh danh mục tối ưu với một phương pháp tham chiếu đơn giản, chẳng hạn phân bổ vốn bằng nhau giữa các cổ phiếu. Nếu mô hình phức tạp không tạo ra cải thiện ổn định về rủi ro hoặc hiệu quả sau chi phí so với cách chia đều, chúng ta cần cân nhắc xem sự phức tạp bổ sung có thực sự cần thiết hay không.

Mình nghĩ đây cũng là một bài học quan trọng khi nghiên cứu Quant: mô hình toán học không cần phức tạp để trở nên hữu ích, nhưng các giả định và cách kiểm định phải đủ chặt chẽ.

Nếu đang học Python, bạn hoàn toàn có thể tự xây dựng một dự án nhỏ về tối ưu hóa danh mục mà chưa cần sử dụng Machine Learning hay Deep Learning.

Bắt đầu bằng việc chọn khoảng 5–10 cổ phiếu, chuẩn bị dữ liệu giá lịch sử, tính lợi suất và ma trận hiệp phương sai. Tiếp theo, xây dựng danh mục chia đều và danh mục Minimum Variance bằng SciPy. Sau đó, thử thay đổi giới hạn tỷ trọng và so sánh kết quả. Khi đã quen, hãy chuyển sang kiểm định walk-forward và đưa chi phí giao dịch vào mô phỏng.

Qua một dự án như vậy, chúng ta sẽ sử dụng được khá nhiều kiến thức toán trong cùng một bài toán: xác suất và thống kê để mô tả lợi suất, đại số tuyến tính để xử lý ma trận hiệp phương sai, tối ưu hóa để xác định tỷ trọng, và các phương pháp kiểm định để đánh giá kết quả ngoài mẫu.

Đây cũng là lý do mình nghĩ học toán trong Quant nên gắn với những bài toán cụ thể. Bạn không nhất thiết phải học thuộc tất cả các phương pháp tối ưu hóa trước khi bắt đầu, nhưng cần hiểu mình đang tối ưu đại lượng nào, vì sao phải đặt ràng buộc và kết quả nhạy cảm với những giả định gì.

Tương tự, không cần phải giỏi toàn bộ đại số tuyến tính mới sử dụng được NumPy. Tuy nhiên, hiểu vector, ma trận, phép nhân ma trận và ý nghĩa của ma trận hiệp phương sai sẽ giúp bạn dễ dàng đọc và kiểm tra các mô hình định lượng hơn.

Nếu học theo hướng này, toán học sẽ không còn chỉ là những công thức xuất hiện trong giáo trình mà trở thành công cụ để giải quyết những câu hỏi rất thực tế trong đầu tư.