Skip to content
markowitz

Tại Sao Bạn Không Thể "Tự Xử" Các Thuật Toán Này Tại Nhà? (Dù Bạn Có Biết Code Chút Đỉnh)

Chào các bạn, Quang quay trở lại với bài viết cuối cùng trong series "Bếp núc kỹ thuật" này đây.

Hai bài trước Quang đã chém gió rất hăng về HERC và Markowitz. Chắc hẳn nhiều bạn, đặc biệt là các bạn dân kỹ thuật hoặc dân tài chính biết chút ít về Python/Amibroker sẽ nghĩ trong đầu: "Ông Quang này cứ quan trọng hóa vấn đề. Công thức đầy trên mạng, tôi tải data về Excel hay viết vài dòng code Python là chạy ra ngay chứ gì đâu mà phải dùng app?".

Thú thật, ngày xưa lúc mới chân ướt chân ráo vào nghề, Quang cũng nghĩ y hệt như vậy. Quang nghĩ mình có laptop Core i7, có dữ liệu CafeF, có Amibroker, thì việc gì phải cần đến hệ thống server phức tạp?

Nhưng đời không như là mơ. Khi thực sự bắt tay vào xây dựng một hệ thống tối ưu danh mục chuẩn chỉnh (Production Grade), Quang mới vấp phải những "tảng đá" khổng lồ mà một nhà đầu tư cá nhân với chiếc máy tính cá nhân gần như không thể vượt qua. Hôm nay, Quang sẽ bóc trần những khó khăn đó để các bạn hiểu tại sao chúng ta cần một hệ thống chuyên biệt.

Thách thức 1: Dữ liệu "Bẩn" - Kẻ giết chết mọi thuật toán, bạn xử lý nó kiểu gì?

Đây là cửa ải đầu tiên và cũng là nơi 99% các bạn tự làm (DIY) sẽ bỏ cuộc.

Các thuật toán như Markowitz hay HERC cực kỳ nhạy cảm. Chúng cần một ma trận đầu vào sạch bong kin kít. Nhưng dữ liệu chứng khoán Việt Nam thì sao? Nó là một mớ hỗn độn.

  • Chia tách cổ tức, phát hành thêm: Hôm nay giá HPG là 50, mai chia cổ tức giá điều chỉnh về 30. Nếu bạn không có cơ chế tự động điều chỉnh giá quá khứ (Adjusted Price) cực kỳ chính xác, thuật toán sẽ hiểu nhầm là HPG vừa sập 40% và ngay lập tức loại nó khỏi danh mục.
  • Cổ phiếu hủy niêm yết/chuyển sàn: Bạn làm sao để code của bạn không bị crash khi một mã trong danh mục bỗng dưng biến mất khỏi bảng điện tử?
  • Đồng bộ thời gian: Dữ liệu của 100 mã phải khớp nhau từng giây. Mã A có dữ liệu ngày hôm nay nhưng mã B lại mất dữ liệu. Nếu nhắm mắt đưa vào tính toán, ma trận sẽ bị lệch pha và kết quả là vứt đi.

Để giải quyết bài toán này, Quang đã phải xây dựng một hệ thống ETL (Extract - Transform - Load) chạy ngầm 24/7, chuyên đi "dọn rác" và chuẩn hóa dữ liệu từ nhiều nguồn trước khi nó kịp chạm vào các thuật toán.

Thách thức 2: Amibroker rất tuyệt, nhưng nó không sinh ra để làm việc này. Tại sao?

Quang biết rất nhiều bạn trong cộng đồng mình là fan cứng của Amibroker. Quang cũng vậy, dùng nó để soi chart, lọc điểm mua (RSI, MACD) thì tuyệt vời.

Nhưng Tối ưu danh mục (Portfolio Optimization) lại là một bài toán hoàn toàn khác về mặt toán học.

  • Amibroker hoạt động theo tư duy Vector (Vector-based) trên từng mã riêng lẻ. Nó rất giỏi trả lời câu hỏi: "Mã này có nên mua không?".
  • Tối ưu danh mục là bài toán Ma trận (Matrix-based) đa chiều. Nó trả lời câu hỏi: "Tổ hợp 10 mã này tương tác với nhau thế nào?".

Ngôn ngữ AFL của Amibroker hay kể cả việc bạn dùng Excel Solver đều rất yếu khi xử lý các phép tính Đại số tuyến tính (Linear Algebra) phức tạp như Nghịch đảo ma trận hay Phân rã Eigenvalue trên một tập dữ liệu lớn. Cố ép Amibroker làm việc này giống như bắt một chiếc xe đua F1 đi cày ruộng vậy - nó có thể làm được, nhưng rất chật vật và dễ hỏng. Đó là lý do Quang phải dùng Python với các thư viện chuyên dụng như NumPy, SciPy ở backend để xử lý.

Thách thức 3: Ma trận Hiệp phương sai khổng lồ và "Lời nguyền của số chiều"

Giả sử bạn muốn chọn ra danh mục tối ưu từ VN100 (100 mã lớn nhất). Để làm được điều đó, bạn phải xây dựng một Ma trận Hiệp phương sai kích thước 100x100. Tức là có 10.000 mối tương quan cần tính toán.

Vấn đề là gì? Nếu số lượng mã (N) lớn hơn số lượng ngày dữ liệu quan sát (T), ma trận này sẽ bị "Singular" (suy biến), tức là không thể nghịch đảo được. Mà không nghịch đảo được thì không giải được phương trình tối ưu. Đây là kiến thức toán cao cấp mà Quang đã phải mất rất nhiều thời gian nghiên cứu các phương pháp như Ledoit-Wolf shrinkage hay Denoising để khắc phục. Một nhà đầu tư cá nhân tay ngang rất khó để tự xử lý những vấn đề toán học trừu tượng này trên file Excel của mình.

Thách thức 4: Chiếc Laptop của bạn có chịu nổi nhiệt không?

Cuối cùng là vấn đề phần cứng. Để tìm ra biên hiệu quả (Efficient Frontier) chuẩn xác, hệ thống của Quang không chỉ tính 1 lần. Nó phải thực hiện Mô phỏng Monte Carlo: Sinh ra ngẫu nhiên 10.000 đến 50.000 danh mục giả định với các tỷ trọng khác nhau, test thử trên dữ liệu quá khứ, rồi mới vẽ ra được cái đường cong đẹp đẽ mà các bạn thấy.

Nếu chạy 50.000 phép tính phức tạp này trên một chiếc laptop văn phòng:

  1. Quạt tản nhiệt sẽ rú lên như máy cày.
  2. Ram sẽ bị nuốt chửng.
  3. Và bạn sẽ phải ngồi chờ 15-20 phút (hoặc lâu hơn) để có kết quả.

Nhưng trong thời đại 4.0, ai lại muốn chờ lâu thế? Khách hàng của Quang muốn bấm một cái là có kết quả ngay. Đó là lý do Quang phải đẩy toàn bộ khối lượng tính toán này lên Cloud Workers. Các worker này như những "lực điền" kỹ thuật số, có thể chia nhỏ bài toán ra và xử lý song song trên nhiều CPU cùng lúc. Nhờ vậy, cái việc mà laptop bạn làm mất 15 phút, hệ thống của Quang chỉ xử lý trong 1-2 giây.

Lời kết: Đừng phát minh lại cái bánh xe

Bài viết này khá dài và nhiều thuật ngữ kỹ thuật, nhưng Quang chỉ muốn gửi gắm một thông điệp: Đầu tư đã đủ khó rồi, hãy để phần việc kỹ thuật đau đầu này cho Quang.

Quang xây dựng ứng dụng này không phải để thay thế tư duy đầu tư của các bạn, mà để trang bị cho các bạn một "cỗ máy tính toán" mạnh mẽ như của các quỹ đầu tư phố Wall, ngay trong túi quần. Các bạn chỉ việc tập trung vào việc chọn mã, nhận định vĩ mô, còn việc xử lý số liệu, làm sạch data, chạy thuật toán tối ưu... hãy để hệ thống của Quang lo.

Cảm ơn các bạn đã kiên nhẫn đọc hết series khô khan này. Hy vọng nó giúp các bạn tin tưởng hơn vào những con số mà ứng dụng đưa ra. Chúc các bạn đầu tư thật hiệu quả và nhàn hạ!