Sharpe cao chưa chắc là alpha thật
Sharpe trong đầu tư
Sharpe Ratio gần như là một trong những con số đầu tiên được nhìn vào khi đánh giá một strategy Quant. Một equity curve tăng đều, drawdown thấp và Sharpe trên 2.0 rất dễ tạo cảm giác rằng mình vừa tìm được một alpha cực kỳ tốt. Nhưng Sharpe của backtest không giống Sharpe của một chiến lược đã chạy live nhiều năm. Backtest là kết quả được quan sát sau khi researcher đã lựa chọn dữ liệu, feature, lookback, universe, rule giao dịch và rất nhiều tham số khác. Vì vậy không có một mức Sharpe cố định mà vượt qua đó strategy tự động trở nên đáng tin. Một Sharpe 1.3 được tạo ra từ một hypothesis rõ ràng, một lần kiểm định và giữ được ngoài mẫu có thể đáng tin hơn Sharpe 2.5 được chọn từ hàng nghìn phiên bản khác nhau.
Vấn đề nằm ở quá trình selection. Nếu mình chỉ thử một strategy rồi thu được Sharpe 2.0, câu chuyện khác hoàn toàn với việc thử 2.000 strategy rồi lấy strategy có Sharpe cao nhất là 2.0. Con số cuối cùng giống nhau, nhưng lượng bằng chứng mà nó cung cấp lại rất khác. Trong trường hợp thứ hai, researcher đang chọn winner từ một cuộc thi rất lớn, và một phần đáng kể của performance có thể đến từ may mắn.
PHẦN 1. SHARPE CÀNG ĐẸP, CÀNG PHẢI BIẾT NÓ ĐƯỢC TẠO RA NHƯ THẾ NÀO
Giả sử mình xây một strategy Momentum trên VN100. Ban đầu chỉ là một ý tưởng khá đơn giản: cổ phiếu tăng tốt trong trung hạn có xu hướng tiếp tục outperform trong một khoảng thời gian. Nhưng khi research bắt đầu, không gian thử nghiệm mở rộng rất nhanh. Mình có thể thử lookback 20, 40, 60, 80, 120 hay 180 phiên; chọn Top 10, Top 20 hoặc Top 30 cổ phiếu; rebalance hàng tuần hoặc hàng tháng; thêm volatility filter, liquidity filter, market trend filter; sau đó tiếp tục thử nhiều cách weighting và stop-loss khác nhau. Chỉ cần nhân các lựa chọn này với nhau, vài trăm hay vài nghìn configuration xuất hiện rất dễ dàng.
Nếu sau đó lấy configuration có Sharpe 2.1 và chỉ trình bày equity curve của nó, người đọc không thấy được phần còn lại của quá trình research. Họ chỉ nhìn thấy strategy chiến thắng mà không biết trước đó có 999 strategy khác đã bị loại. Đây chính là một dạng selection bias. Sharpe 2.1 không còn là kết quả của một hypothesis duy nhất; nó là maximum Sharpe được chọn từ cả một distribution các thử nghiệm.
Đó là lý do số lần thử thực tế rất quan trọng. Một researcher thay Momentum 60 ngày thành 55 rồi 65 ngày có thể xem đó chỉ là “tinh chỉnh tham số”, nhưng về mặt statistical selection, researcher vẫn đang quan sát thêm kết quả và lựa chọn cấu hình tốt hơn. Thử thêm một feature, đổi target, thay universe hoặc chuyển ngày rebalance cũng tương tự. Nếu toàn bộ quá trình này không được ghi lại, cuối cùng strategy có thể trông như một discovery rất mạnh dù thực tế nó là kết quả của hàng trăm quyết định dựa trên lịch sử.
Bailey, Borwein, López de Prado và Zhu đã nghiên cứu trực tiếp vấn đề này trong công trình về Probability of Backtest Overfitting. Điểm cốt lõi của họ là khi số lượng configuration được thử tăng lên, khả năng tìm được một strategy có historical performance nổi bật chỉ nhờ selection cũng tăng lên. Một backtest tốt vì thế không thể được đánh giá tách khỏi số lượng thử nghiệm đã diễn ra trước khi nó được chọn.
Sharpe bản thân nó cũng chỉ là một estimate từ một sample lịch sử. Nếu strategy chỉ có hai năm dữ liệu, Sharpe 2.0 không có cùng độ tin cậy với Sharpe 2.0 quan sát trên một lịch sử dài và nhiều market regime. Return còn có thể autocorrelation, fat tails hoặc những giai đoạn volatility rất khác nhau. Andrew Lo từng chỉ ra rằng việc annualize Sharpe theo cách máy móc có thể sai đáng kể khi return có serial correlation; trong ví dụ về hedge funds của ông, annualized Sharpe có thể bị phóng đại mạnh nếu bỏ qua đặc điểm này.
Vì vậy, câu hỏi “Sharpe 2.0 có cao không?” chưa đủ. Mình muốn biết strategy được backtest bao lâu, có bao nhiêu trades, return có bị autocorrelation không, Sharpe có đến từ vài tháng cực tốt hay phân bố tương đối đều, và đặc biệt là researcher đã thử bao nhiêu phiên bản trước khi tìm thấy con số đó.
Một dấu hiệu mình thường thấy đáng lo là Sharpe rất cao đi cùng parameter rất chính xác. Ví dụ strategy tốt nhất dùng lookback 63 ngày, stop-loss 7%, rebalance mỗi 10 phiên và threshold 1,4; nhưng chỉ cần đổi lookback sang 55 hoặc 70 ngày là Sharpe giảm từ 2.2 xuống 0.8. Kết quả như vậy giống việc model tìm được một điểm đẹp trên dữ liệu lịch sử hơn là phát hiện một relationship ổn định. Một strategy có Sharpe thấp hơn một chút nhưng vùng parameter quanh nó đều hoạt động tương đối tốt thường đáng nghiên cứu hơn.
PHẦN 2. TẠI SAO MỘT SHARPE 2.0 CÓ THỂ GIẢM RẤT NHANH KHI BACKTEST ĐƯỢC LÀM NGHIÊM HƠN?
Một working paper khá đúng với câu hỏi này được Sergey Nefedov đăng trên SSRN ngày 27/08/2026. Tác giả kiểm toán sáu crypto factors - Momentum, short-term reversal, volatility, size/liquidity, funding-carry và beta - trên 137 Binance USDT perpetual contracts trong giai đoạn 2020-2024. Điểm đáng chú ý là nghiên cứu chạy hai cách đánh giá: một protocol naïve sử dụng full-sample optimization, không tính trading friction và không điều chỉnh multiple testing; sau đó so với một protocol nghiêm hơn sử dụng nested walk-forward, transaction costs và Deflated Sharpe Ratio trên một grid được xác định trước.
Trong đúng mẫu và thiết kế của nghiên cứu đó, tác giả báo cáo Sharpe annualized của protocol naïve cao hơn trung bình khoảng 3,6 lần so với quy trình nghiêm ngặt. Dưới baseline protocol nghiêm hơn, không factor nào trong sáu factor vượt qua bước deflation và bốn factor chuyển sang Sharpe out-of-sample âm. Một chi tiết còn đáng chú ý hơn là phần lớn chênh lệch không đến từ việc optimization quá mức mà đến từ trading friction. Nói cách khác, một strategy có thể có signal thật nhưng economics của nó không đủ mạnh để sống sót sau chi phí thực hiện.
Con số 3,6 lần không nên được lấy thành công thức kiểu “Sharpe backtest 2.0 thì chia 3,6 để ra Sharpe thật”. Đây là kết quả của crypto perpetuals, universe và protocol cụ thể trong paper. Nhưng nghiên cứu minh họa rất rõ một điểm thực tế: Sharpe cao có thể giảm cực nhanh khi từng giả định thuận lợi của backtest bị tháo ra.
Transaction cost thường là nơi đầu tiên mình muốn kiểm tra. Nếu strategy có gross Sharpe 2.0 nhưng turnover rất lớn, cần biết sau commission, bid-ask spread, slippage và market impact còn bao nhiêu. Một strategy giữ vị thế vài tháng khác hoàn toàn strategy đảo danh mục mỗi ngày. Hai strategy có cùng Sharpe trước phí nhưng khả năng triển khai thực tế có thể cách nhau rất xa.
Sau đó mới đến multiple testing. Bailey và López de Prado phát triển Deflated Sharpe Ratio để điều chỉnh việc đánh giá Sharpe khi researcher đã thử nhiều strategy, đồng thời xét tới một số đặc điểm không chuẩn của return distribution. Ý tưởng quan trọng không nằm ở việc DSR tạo thêm một metric mới để khoe trong report, mà ở việc Sharpe phải được đặt trong bối cảnh của toàn bộ quá trình search. Sharpe cao nhất trong 1.000 trials cần vượt một tiêu chuẩn khó hơn Sharpe thu được từ một hypothesis đã xác định trước.
Walk-forward cũng quan trọng vì nó ép strategy phải liên tục đối diện với dữ liệu tương lai. Ví dụ mình dùng 2015–2019 để lựa chọn parameter rồi chạy trên 2020, tiếp tục dùng dữ liệu đến 2020 để chọn parameter cho 2021, và cứ thế dịch dần về phía trước. Nếu Sharpe cao chỉ xuất hiện khi optimize trên toàn bộ 2015–2026 nhưng giảm mạnh khi chạy từng cửa sổ như vậy, performance ban đầu có khả năng phụ thuộc nhiều vào hindsight.
Nhưng walk-forward cũng không phải thuốc chữa mọi vấn đề. Nếu researcher chạy walk-forward, nhìn thấy kết quả xấu, quay lại sửa strategy rồi tiếp tục chạy trên đúng những năm đó, phần “out-of-sample” đã bị sử dụng cho research. Sau đủ nhiều vòng lặp, researcher vẫn có thể overfit cả walk-forward test. Vì vậy điều quan trọng nhất vẫn là research log: hypothesis nào đã thử, parameter nào đã thử, kết quả nào đã bị bỏ và final holdout nào chưa từng được dùng để ra quyết định.
Đây cũng là lý do mình không thích một backtest chỉ đưa ra Sharpe cuối cùng. Một report tốt nên cho thấy Sharpe trước và sau cost, in-sample và out-of-sample, performance từng giai đoạn, turnover, drawdown, parameter sensitivity và ít nhất một cách đánh giá ảnh hưởng của multiple testing. Khi những thông tin đó được đặt cạnh nhau, con số 2.0 bắt đầu có ngữ cảnh. Nếu không, 2.0 chỉ là một số rất đẹp.
PHẦN 3. NẾU MỘT STRATEGY VN100 CÓ SHARPE 2.0, MÌNH SẼ KIỂM TRA GÌ TRƯỚC KHI TIN?
Giả sử một strategy chọn cổ phiếu VN100 từ năm 2015 đến 2026 cho Sharpe 2.0. Mình sẽ không vội coi đây là một strategy tốt, nhưng cũng không mặc định nó chắc chắn overfit. Việc đầu tiên là tái tạo đúng điều kiện mà strategy có thể giao dịch. Universe năm 2016 phải là universe thực sự tồn tại năm 2016, không phải danh sách VN100 hiện tại kéo ngược về quá khứ. Giá phải điều chỉnh corporate actions đúng cách. Báo cáo tài chính chỉ được dùng sau ngày công bố. Cổ phiếu bị hạn chế giao dịch hoặc thanh khoản quá thấp phải được xử lý giống điều kiện thực tế. Chỉ riêng việc sửa survivorship bias và point-in-time data đôi khi đã làm equity curve thay đổi đáng kể.
Sau đó mình muốn xem Sharpe đó đến từ đâu. Nếu 70% P&L được tạo ra trong năm 2020–2021 còn các năm khác gần như bằng 0, Sharpe toàn kỳ không phản ánh một alpha ổn định. Nếu strategy chỉ thắng nhờ Banking trong một bull cycle, có thể mình đang nhìn sector exposure. Nếu phần lớn lợi nhuận đến từ vài cổ phiếu tăng rất mạnh, mình muốn loại từng mã đó ra để xem performance còn hay không. Một strategy tốt không nhất thiết phải kiếm tiền mọi năm, nhưng nguồn return phải đủ phân tán để tránh việc toàn bộ kết quả phụ thuộc vào một sự kiện đặc biệt.
Parameter stability là bài kiểm tra tiếp theo. Nếu Momentum 60 ngày tốt, thử 50, 70 và 90 ngày. Nếu chọn Top 15 mã tốt, thử Top 10 và Top 20. Nếu rebalance thứ Hai, thử dịch sang thứ Ba hoặc cuối tuần. Nếu performance giảm từ Sharpe 2.0 xuống 1.7 hoặc 1.5, điều đó không đáng ngại. Thực tế mình còn thích một vùng rộng Sharpe 1.4–1.8 hơn một điểm duy nhất 2.5 đứng giữa một vùng parameter gần như không có alpha. Cái mình tìm là một plateau, không phải một đỉnh nhọn.
Tiếp theo là làm assumptions khó hơn. Nếu backtest dùng 10 bps transaction cost, thử 20 hoặc 30 bps. Nếu volume constraint đang cho phép giao dịch 10% ADV, giảm xuống 5%. Nếu dùng giá Close để khớp lệnh, chuyển sang giá phiên sau để tránh giả định biết Close trước khi gửi lệnh. Nếu strategy vẫn còn economics hợp lý khi những điều kiện thuận lợi bị lấy đi, độ tin cậy tăng lên đáng kể.
Sau đó mới nhìn tới test set cuối cùng. Một phần dữ liệu cần được giữ hoàn toàn ngoài quá trình phát triển strategy. Nếu research bắt đầu từ 2015, có thể khóa một giai đoạn cuối làm final holdout. Quan trọng không phải chính xác khóa năm nào, mà là researcher không được sử dụng kết quả của giai đoạn đó để sửa model trước khi strategy hoàn tất. Nếu strategy Sharpe 2.0 trong research period và vẫn còn một Sharpe hợp lý trên final unseen period, mình có nhiều lý do hơn để tin rằng signal không chỉ là sản phẩm của optimization.
Cuối cùng là shadow trading hoặc paper trading. Đây là bước rất thực tế nhưng thường bị bỏ qua vì nó không tạo ra một equity curve lịch sử đẹp ngay lập tức. Strategy được chạy đúng giờ mỗi ngày, sử dụng đúng feed production, sinh order nhưng chưa dùng vốn hoặc dùng vốn rất nhỏ. Lúc này mới bắt đầu lộ những vấn đề mà backtest không nhìn thấy: dữ liệu tới chậm, mã bị suspended, order không fill như giả định, spread mở rộng, signal thay đổi vì corporate action hoặc model phụ thuộc vào một feature đôi khi bị missing.
Đến đây, câu hỏi “Sharpe bao nhiêu thì nên tin?” có một câu trả lời khá rõ: không có một ngưỡng Sharpe duy nhất. Sharpe 1.0, 1.5 hay 2.0 đều có thể thật hoặc ảo tùy cách nó được tạo ra. Sharpe càng cao sau một quá trình search rất lớn thì càng phải kiểm tra selection bias. Sharpe càng phụ thuộc vào transaction cost thấp, parameter chính xác hoặc một giai đoạn thị trường riêng biệt thì càng mong manh. Ngược lại, một Sharpe không quá cao nhưng giữ được qua out-of-sample, nhiều regime, parameter perturbation và chi phí giao dịch thực tế lại có giá trị hơn nhiều.
