Đêm Mà Backtest Đã Nói Dối Tôi
Một đêm nọ, một backtest báo với tôi rằng tôi đã biến một số dư khởi điểm khiêm tốn thành 2.792 nghìn tỷ won — nhiều hơn sản lượng hàng năm của hầu hết các nền kinh tế trên hành tinh này. Tôi nhìn chằm chằm vào nó. Trong vài phút, một phần lặng lẽ và tham lam nào đó trong tôi đã đi tìm những lý do để nó có thể là thật.
Nó không có thật. Đó là một lỗi (bug). Và hóa ra lỗi đó lại mang tính khai sáng hơn bất kỳ chiến lược thắng cuộc nào, bởi vì nó là một lỗi về cái điều duy nhất mà một backtest tồn tại để tôn trọng: thực tại.
Con số lẽ ra phải làm tôi sợ
Tôi đang chạy một cuộc tìm kiếm tham số — hàng nghìn cấu hình, mỗi cấu hình được phát lại trên dữ liệu lịch sử và xếp hạng theo kết quả cuối cùng. Hầu hết quay về với kết quả bình thường. Một cái quay về điên rồ.
Điên-rồ-theo-hướng-có-lợi-cho-bạn là đầu ra nguy hiểm nhất mà một hệ thống có thể tạo ra, bởi vì nó xuất hiện trong dáng vẻ của thành công. Một lần chạy thua khiến bạn đi gỡ lỗi. Một lần chạy “hoạt động được” khiến bạn ăn mừng. Sự soi xét là bất đối xứng, và nó chạy theo đúng hướng sai lầm: chúng ta tra hỏi những kết quả mình không thích và cho qua những kết quả mình yêu thích. Tôi suýt nữa đã cho cái này qua.
Bản năng mà tôi phải học được — theo cách đau đớn — thì ngược lại. Kết quả càng ngoạn mục, càng chắc chắn rằng có thứ gì đó đang hỏng. Thị trường không trao cho một người mới xây dựng lần đầu cả GDP của một quốc gia nhỏ. Nếu mô phỏng của bạn nói rằng nó làm vậy, thì mô phỏng đang nói dối, và việc duy nhất của bạn là tìm ra nó nói dối bằng cách nào.
Sai lầm thứ nhất: đặt cược cả tài khoản, mỗi lần
Khiếm khuyết đầu tiên nằm ở position sizing. Mỗi giao dịch được định cỡ về cơ bản bằng toàn bộ tài khoản, và lợi nhuận được cộng dồn thẳng vào lần đặt cược tiếp theo. Khoảnh khắc bạn làm điều đó, bạn ngừng mô hình hóa việc giao dịch và bắt đầu mô hình hóa một cấp số nhân. Một chuỗi đủ dài những kết quả dù chỉ hơi thuận lợi — hoặc nhiễu thuần túy tình cờ rơi đúng hướng đủ thường xuyên — không tăng trưởng, mà phát nổ. Toán học chạy trốn khỏi thực tại và không bao giờ ngoái lại.
Đây là điều quyến rũ ở một backtest cộng dồn toàn phần: nó không cần một chiến lược tốt để tạo ra một con số tuyệt vời. Nó chỉ cần đủ số giao dịch và một bộ mô phỏng đủ hào phóng để cho phép lần đặt cược cứ tiếp tục lăn. Việc cộng dồn biến một xu hướng thống kê mờ nhạt, vô nghĩa thành một đường cong hàm mũ, và một đường cong hàm mũ qua hàng nghìn giao dịch tạo ra một con số trông như định mệnh và chẳng có nghĩa lý gì. Số dư khổng lồ ấy không phải là bằng chứng của một lợi thế. Nó là bằng chứng của việc phơi nhiễm toàn bộ tài khoản áp lên sự ngẫu nhiên.
Sai lầm thứ hai: một bộ mô phỏng không thể chết
Khiếm khuyết thứ hai còn tệ hơn, bởi vì nó mang tính triết lý. Bộ backtest của tôi không có rào chắn hấp thụ — không có điểm nào mà tại đó tài khoản đơn giản là đã chết. Vậy nên khi một quãng giao dịch tồi tệ kéo số dư xuống tới 99,99%, mô phỏng không dừng lại. Nó giữ cái xác trên bàn và để nó tiếp tục giao dịch. Và từ số dư gần-bằng-không ấy, một chuỗi may mắn đã “hồi sinh” tài khoản và đưa nó trở lại một độ cao phi lý.
Trong một tài khoản thực, sự phục hồi đó là bất khả thi. Không là không. Một số dư đã bị thanh lý không có hồi thứ hai — bạn đã ra khỏi cuộc chơi, vĩnh viễn, và không một chuỗi thắng nào trong tương lai có thể vươn ngược qua thời gian để cứu bạn. Bằng cách cho phép một tài khoản phá sản tiếp tục giao dịch, mã của tôi đã lặng lẽ xóa đi quy tắc quan trọng nhất trong toàn bộ giao dịch: rằng sự diệt vong là chung cuộc. Mọi thứ phía sau điều đó — toàn bộ ảo mộng — đều theo sau một cách logic từ một ràng buộc bị thiếu. Mô phỏng không phải đang mô hình hóa một chiến lược sống sót. Nó đang mô hình hóa một chiến lược đã được phép chết, rồi sau đó bị cấm ở yên trạng thái chết.
Bộ tối ưu đang săn lùng điểm mù của tôi
Đây là phần khiến tôi mất nhiều thời gian nhất để hiểu: cuộc tìm kiếm tham số không tình cờ vấp phải cấu hình phi lý ấy. Nó đã chủ động đi tìm.
Một cuộc tìm kiếm trên hàng nghìn cấu hình không phải là một quan sát viên trung lập. Nó là một đối thủ tối ưu hóa cho bất kỳ thước đo nào bạn trao cho nó. Nếu thước đo của bạn là “số dư cuối cùng” và bộ mô phỏng của bạn có một điểm yếu — một nơi mà những điều phi thực tế được lặng lẽ cho phép xảy ra — thì cuộc tìm kiếm sẽ tìm ra điểm yếu đó và dồn toàn bộ sức nặng của nó lên đấy. Nó không tưởng thưởng cho chiến lược tốt nhất. Nó tưởng thưởng cho cấu hình khai thác hiệu quả nhất khoảng cách giữa mô phỏng của bạn và thực tại.
Vậy nên kết quả nghìn-tỷ-won không phải là một lỗi xui xẻo trồi lên một cách ngẫu nhiên. Nó là hệ quả có thể đoán trước được của việc chĩa một bộ tối ưu mạnh mẽ vào một bộ mô phỏng có thể bị đánh lừa. Mọi điểm yếu bạn để lại trong một backtest đều trở thành, dưới sự tìm kiếm, một chiến lược. Bộ tối ưu là một cỗ máy để khám phá ra chính xác những giả định mà bạn quên thực thi.
Dấu hiệu nhận biết
Ghép những sai lầm đó lại với nhau và bạn có một cỗ máy sản xuất ra phép màu. Nó có thể sống sót qua bất cứ thứ gì, nên nó sống sót qua mọi thứ; nó đặt cược mọi thứ, nên khi nó sống sót thì nó sống sót một cách khổng lồ; và một cuộc tìm kiếm đang lặng lẽ tinh chỉnh nó để làm cả hai điều đó hết sức có thể. Đầu ra không phải là hiệu suất của một chiến lược. Nó là hình dạng của chính cái lỗi đó, được vẽ ra bằng những con số rất lớn.
Đây là lý do “sống sót trước đã” không phải là một khẩu hiệu. Một backtest không thể phá sản, nếu được cho đủ số cấu hình để tìm kiếm, sẽ luôn cuối cùng làm trồi lên một cái trông như thiên tài — không phải vì cấu hình ấy tốt, mà vì cuộc tìm kiếm đang kiên nhẫn khai thác điểm mù trong bộ mô phỏng của bạn. Con số ấn tượng là triệu chứng. Sự thiếu vắng khả năng phá sản là căn bệnh.
Bản sửa lỗi nhàm chán
Việc sửa chữa chẳng có gì hào nhoáng. Cỡ vị thế trở thành một phần nhỏ cố định của tài khoản thay vì toàn bộ, để một lần thắng không thể tích tụ thành điều vô lý và một lần thua không thể là tất-cả-hoặc-không-gì. Bộ mô phỏng có được một điều kiện diệt vong thực sự: rơi xuống dưới một số dư sống sót tối thiểu thì lần chạy kết thúc, bị đánh dấu là đã chết, chấm hết. Và nó có được một cỡ lệnh tối thiểu, để những giao dịch nhỏ đến mức không thể tồn tại trong thị trường thực không thể lặng lẽ giữ một tài khoản đang hấp hối ở trạng thái thoi thóp.
Không ý nào trong số này là khôn ngoan cả. Không có sự thấu suốt nào trong chúng, không có lợi thế nào. Chúng là việc mô phỏng cuối cùng cũng đồng ý tuân theo những ràng buộc mà thực tại không bao giờ nới lỏng — những chi phí không tha thứ cho bạn, thanh khoản không phải là vô hạn, và một con số không mà bạn không thể quay về từ đó. Phần lớn công việc xây dựng một backtest trung thực chính là điều này: không phải làm cho nó thông minh hơn, mà là từ chối để nó gian lận. Trách nhiệm đầu tiên của một backtest trung thực không phải là cho bạn thấy lợi nhuận. Nó là có khả năng cho bạn thấy sự diệt vong.
Vì sao tôi ngừng tin vào tin tốt
Đây là phần khó chịu. Cái lỗi thì dễ. Điều khó là tôi suýt nữa đã không nhìn vào nó — bởi vì con số có lợi cho tôi, và tôi muốn nó là thật. Một kết quả mâu thuẫn với bạn thì bị tra hỏi. Một kết quả tâng bốc bạn thì được tin tưởng.
Sự bất đối xứng đó là nơi cư trú của phần lớn sự tự lừa dối trong công việc này. Không phải là người ta không thể tìm ra lỗi của mình; mà là họ ngừng tìm ngay khoảnh khắc một cái lỗi bắt đầu trả tiền cho họ. Thị trường rốt cuộc sẽ tính đủ giá cho mọi giả định dễ chịu mà bạn không bao giờ kiểm tra — nhưng một backtest sẽ vui vẻ để bạn ôm giữ giả định đó hàng tháng trời, bởi vì, theo bản chất cấu tạo, nó là nơi duy nhất mà việc sai lầm là miễn phí.
Nó thực sự đã thay đổi điều gì
Vậy nên kỷ luật mà tôi giữ lại từ một nghìn tỷ won giả hầu như chẳng liên quan gì đến position sizing. Nó đã thay đổi thứ tự niềm tin của tôi. Một kết quả trông đẹp đẽ giờ đây bị coi là có tội cho đến khi được chứng minh là vô tội: trước khi hỏi “nó đã làm được điều này bằng cách nào?”, tôi hỏi “có gì hỏng ở đây?” — và tôi cố gắng, một cách có chủ ý, phá vỡ nó bằng chính tay mình trước khi thị trường có cơ hội. Những kết quả sống sót qua sự đối xử thù địch ấy là những kết quả duy nhất tôi cho phép mình tin, và chúng ít hơn nhiều so với tôi mong muốn.
Một bộ backtest không thể mất sạch mọi thứ không phải là lạc quan. Nó đang nói dối. Và lời nói dối nguy hiểm nhất mà nó có thể nói là lời mà bạn vốn đã hy vọng được nghe.
— Không tín hiệu, không lợi nhuận, không phải lời khuyên đầu tư.