Data Cleaning và tầm quan trọng trong xây dựng chiến lược giao dịch
Data Cleaning
Data Cleaning và tầm quan trọng trong xây dựng chiến lược giao dịch
Trong xây dựng chiến lược đầu tư, phần dễ gây hứng thú nhất thường là tín hiệu mua bán, mô hình Machine Learning, backtest đẹp, Sharpe cao, drawdown thấp, equity curve đi lên mượt. Nhưng phần quyết định hệ thống đó có đáng tin hay không lại nằm ở chỗ rất ít người muốn làm: làm sạch dữ liệu.
Data cleaning nghe giống một công việc kỹ thuật phụ, kiểu xóa dòng trống, sửa dữ liệu thiếu, đổi định dạng ngày tháng. Nhưng trong tài chính, nó không đơn giản như vậy. Làm sạch dữ liệu là quá trình kiểm tra xem dữ liệu mình dùng có thật sự phản ánh đúng thị trường tại thời điểm ra quyết định hay không. Một chiến lược có thể nhìn rất đẹp trên Excel, Python hoặc backtest platform, nhưng nếu dữ liệu đầu vào sai, thì toàn bộ kết quả phía sau chỉ là ảo giác được tính toán rất chuyên nghiệp.
Nói thẳng hơn, trong trading system, dữ liệu bẩn có thể tạo ra một chiến lược thắng giả. Và điều nguy hiểm là chiến lược đó thường không nhìn sai ngay từ đầu. Nó có thể có tỷ lệ thắng cao, lợi nhuận tốt, drawdown thấp, thậm chí chạy tối ưu tham số ra kết quả rất thuyết phục. Nhà đầu tư nhìn vào tưởng mình tìm được lợi thế, nhưng thật ra chỉ đang kiếm tiền từ lỗi giá, lỗi volume, lỗi điều chỉnh cổ tức, lỗi ngày công bố báo cáo hoặc lỗi chọn sai universe cổ phiếu.

Data cleaning không phải để dữ liệu “đẹp”, mà để dữ liệu đúng với thực tế giao dịch
Một hiểu nhầm phổ biến là làm sạch dữ liệu nghĩa là làm cho bảng dữ liệu đầy đủ, gọn gàng và không có ô trống. Điều đó đúng, nhưng chưa đủ. Trong xây dựng chiến lược, dữ liệu sạch không chỉ là dữ liệu nhìn đẹp, mà là dữ liệu trả lời được một câu hỏi quan trọng: tại thời điểm đó, nhà đầu tư có thật sự biết thông tin này và có thật sự giao dịch được theo dữ liệu này không?
Ví dụ, nếu một cổ phiếu chia cổ tức bằng cổ phiếu hoặc chia tách, giá trên bảng điện có thể giảm mạnh về mặt kỹ thuật. Nếu chuỗi giá không được điều chỉnh, hệ thống có thể hiểu nhầm đó là một cú giảm rất lớn do thị trường bán tháo. Khi đó toàn bộ chỉ báo như momentum, MA20, MA50, RSI, ATR, drawdown, volatility đều bị méo. Một tín hiệu bán có thể xuất hiện không phải vì cổ phiếu yếu đi, mà vì dữ liệu chưa xử lý corporate action.
Ngược lại, dùng giá điều chỉnh cũng phải hiểu rõ mình đang dùng nó để làm gì. Nếu mục tiêu là tính lợi nhuận lịch sử hoặc xây tín hiệu dài hạn, giá điều chỉnh thường hợp lý. Nhưng nếu mục tiêu là mô phỏng khớp lệnh thật, mình phải cẩn thận vì ngoài đời nhà đầu tư không mua bán ở “giá điều chỉnh”, mà mua bán ở giá giao dịch thực tế trên sàn tại thời điểm đó. Vì vậy, cùng là dữ liệu giá, nhưng phải phân biệt rõ: giá dùng để tính return, giá dùng để tạo tín hiệu, và giá dùng để giả lập khớp lệnh.
Với dữ liệu cơ bản cũng vậy. Một công ty có lợi nhuận quý 2 rất tốt, nhưng báo cáo chỉ công bố sau ngày kết thúc quý vài tuần. Nếu mô hình dùng số liệu quý 2 ngay tại ngày 30/6 để ra quyết định, đó là lỗi nhìn trước tương lai. Backtest sẽ rất đẹp vì hệ thống đang dùng thông tin mà nhà đầu tư trong quá khứ chưa hề biết. Trong tài chính, lỗi này gọi là look-ahead bias, và đây là một trong những lỗi làm backtest đẹp giả nguy hiểm nhất.
Phương pháp luận đúng: đi từ quyết định đầu tư rồi mới xử lý dữ liệu
Một hệ thống dữ liệu tốt không bắt đầu bằng câu hỏi “tải dữ liệu ở đâu”, mà bắt đầu bằng câu hỏi “mình sẽ dùng dữ liệu này để ra quyết định gì”. Nếu mục tiêu là chiến lược momentum 20 phiên, dữ liệu cần tập trung vào giá, thanh khoản, biến động, sức mạnh tương đối, trạng thái ngành và khả năng khớp lệnh. Nếu mục tiêu là chiến lược value/mid-term, dữ liệu cần thêm báo cáo tài chính, định giá, lợi nhuận, dòng tiền, nợ vay, ROE, biên lợi nhuận, nhưng phải xử lý theo ngày công bố thực tế. Nếu mục tiêu là trading ngắn hạn, dữ liệu intraday, spread, volume, biến động trong phiên, lệnh lớn, trần sàn và thanh khoản thực tế lại quan trọng hơn.
Nói cách khác, không có dữ liệu sạch chung cho mọi chiến lược. Chỉ có dữ liệu sạch đối với một mục tiêu sử dụng cụ thể. Một bộ dữ liệu có thể đủ tốt để phân tích xu hướng dài hạn, nhưng chưa đủ tốt để backtest chiến lược lướt sóng. Một bộ dữ liệu có thể dùng để nghiên cứu cổ phiếu bluechip, nhưng không dùng được cho chiến lược cổ phiếu nhỏ nếu thiếu dữ liệu thanh khoản, trạng thái giao dịch và lịch sử hủy niêm yết.
Phương pháp luận thực tế nên đi theo thứ tự: xác định câu hỏi đầu tư, xác định universe, xác định loại dữ liệu cần dùng, kiểm tra chất lượng dữ liệu, làm sạch dữ liệu, tạo feature, tạo tín hiệu, backtest, rồi cuối cùng mới đánh giá hiệu quả. Nếu làm ngược lại, tức là tải một đống dữ liệu về, chạy mô hình trước, thấy kết quả đẹp rồi mới tìm cách giải thích, thì rất dễ rơi vào data mining. Khi đó chiến lược không được xây từ logic đầu tư, mà được “đào” ra từ nhiễu trong dữ liệu.
Một quy trình Data Cleaning thực chiến cho chiến lược giao dịch
Với dữ liệu thị trường, bước đầu tiên là giữ nguyên một bản dữ liệu thô. Đây là nguyên tắc rất quan trọng. Không nên tải dữ liệu về rồi chỉnh sửa trực tiếp trên bản gốc. Cần có một lớp raw data, một lớp cleaned data và một lớp feature data. Raw data là dữ liệu ban đầu từ nhà cung cấp. Cleaned data là dữ liệu đã được kiểm tra, điều chỉnh lỗi, chuẩn hóa. Feature data là dữ liệu đã biến đổi thành các biến dùng cho mô hình như return 20 phiên, volatility 60 phiên, thanh khoản trung bình, relative strength, drawdown từ đỉnh.
Việc tách lớp như vậy giúp mình truy vết lỗi. Nếu backtest ra một giao dịch lạ, ví dụ cổ phiếu tăng 200% trong một ngày, mình có thể quay lại xem lỗi nằm ở raw data, ở bước điều chỉnh giá, ở bước tính feature hay ở logic tín hiệu. Nếu tất cả bị trộn chung trong một file, rất khó biết hệ thống sai từ đâu.
Sau đó cần có data dictionary, tức là định nghĩa rõ từng cột dữ liệu. “Close” là giá đóng cửa đã điều chỉnh hay chưa điều chỉnh? “Volume” là khối lượng khớp lệnh hay bao gồm cả thỏa thuận? “Market cap” được tính tại ngày nào? “EPS” là trailing twelve months hay quý gần nhất? “Financial statement date” là ngày kết thúc kỳ kế toán hay ngày công bố báo cáo? Những câu hỏi này nghe nhỏ, nhưng nếu không định nghĩa rõ, mô hình sẽ dùng dữ liệu sai mà mình không biết.
Tiếp theo là kiểm tra lỗi logic cơ bản. Giá cao nhất không thể thấp hơn giá thấp nhất. Giá đóng cửa không nên nằm ngoài khoảng high-low. Volume không thể âm. Giá không thể âm. Một cổ phiếu không thể có return vài trăm phần trăm trong một ngày nếu không có sự kiện đặc biệt. Một cổ phiếu không giao dịch nhưng vẫn có giá trị khớp lệnh lớn thì cần kiểm tra. Những lỗi này nên được phát hiện bằng rule tự động, không nên kiểm tra thủ công từng mã.
Sau lớp kiểm tra logic là lớp kiểm tra bất thường. Không phải dữ liệu bất thường nào cũng là sai. Một cổ phiếu tăng trần nhiều phiên có thể là thật. Một phiên volume tăng đột biến cũng có thể là thật. Nhưng tất cả những điểm bất thường cần được đánh dấu để kiểm tra. Ví dụ, nếu return một ngày lớn hơn 30%, volume lớn hơn 10 lần trung bình 20 phiên, hoặc giá nhảy mạnh vào đúng ngày giao dịch không hưởng quyền, hệ thống nên flag lại. Flag không có nghĩa là xóa, mà là yêu cầu mình hiểu nguyên nhân.
Đây là điểm nhiều người xử lý sai. Thấy outlier là xóa ngay. Nhưng trong tài chính, outlier đôi khi chính là phần quan trọng nhất của thị trường. Một cú crash, một phiên tăng trần, một ngày thanh khoản bùng nổ có thể là dữ liệu thật và rất có giá trị. Data cleaning không phải là xóa mọi thứ khó chịu để dữ liệu mượt hơn. Data cleaning là phân biệt outlier thật với lỗi dữ liệu.
Ví dụ thực tế: chiến lược momentum có thể sai chỉ vì dữ liệu chưa sạch
Giả sử mình xây một chiến lược khá phổ biến: mỗi tuần chọn 20 cổ phiếu có momentum 60 phiên tốt nhất, thanh khoản bình quân 20 phiên trên 20 tỷ đồng/ngày, giá nằm trên MA50 và mạnh hơn VN-Index. Sau đó nắm giữ 20 phiên, tái cân bằng định kỳ. Về mặt tư duy, chiến lược này hợp lý: cổ phiếu mạnh có thể tiếp tục mạnh trong một khoảng thời gian nhất định, đặc biệt khi có dòng tiền xác nhận.
Nhưng nếu dữ liệu chưa sạch, chiến lược này có thể sai ngay từ đầu. Một cổ phiếu vừa chia tách nhưng giá chưa điều chỉnh có thể bị tính là giảm rất mạnh, nên bị loại khỏi danh sách dù thực tế không hề yếu. Một cổ phiếu có lỗi giá tăng vọt một phiên có thể lọt vào top momentum dù ngoài đời không có giao dịch đó. Một cổ phiếu có giao dịch thỏa thuận lớn có thể làm thanh khoản trung bình tăng đột biến, khiến hệ thống tưởng cổ phiếu dễ mua bán. Một cổ phiếu tăng trần liên tục với thanh khoản rất ít có thể nằm trong top lợi nhuận, nhưng nhà đầu tư thực tế gần như không mua được đủ khối lượng.
Kết quả là backtest có thể rất đẹp, nhưng không thể giao dịch. Trên máy tính, hệ thống mua được đúng giá đóng cửa, đủ khối lượng, không trượt giá. Ngoài đời, cổ phiếu có thể không có dư bán, mua không khớp, hoặc khi cần thoát thì không có thanh khoản. Vì vậy, data cleaning không chỉ là sửa dữ liệu sai, mà còn phải lọc những trường hợp không phản ánh khả năng giao dịch thật.
Một cách thực tế là thêm bộ lọc thanh khoản và capacity. Ví dụ, một chiến lược không nên giả định mình có thể mua quá 5–10% giá trị giao dịch trung bình của cổ phiếu trong một ngày. Nếu cổ phiếu giao dịch bình quân 10 tỷ/ngày, quy mô lệnh 2 tỷ đã là rất lớn, dễ gây tác động giá. Backtest phải phản ánh điều này. Nếu không, chiến lược có thể thắng trên giấy nhờ những cổ phiếu nhỏ, nhưng thua ngoài đời vì không thể khớp đủ hoặc thoát đủ.
Phải phân biệt dữ liệu nghiên cứu và dữ liệu giao dịch
Trong thực tế, nên tách hai loại dữ liệu: dữ liệu phục vụ nghiên cứu và dữ liệu phục vụ thực thi. Dữ liệu nghiên cứu có thể dùng giá điều chỉnh để tính return dài hạn, so sánh hiệu suất, xây feature như momentum, drawdown, volatility. Dữ liệu thực thi lại cần giá thật, biên độ dao động, giá trần sàn, thanh khoản khớp lệnh, spread, trạng thái giao dịch, room ngoại nếu cần, và khả năng khớp lệnh tại thời điểm vào/ra.
Nếu trộn hai loại này, backtest rất dễ sai. Ví dụ, chiến lược tạo tín hiệu bằng giá điều chỉnh là hợp lý, nhưng khi mô phỏng giao dịch lại phải dùng giá giao dịch thực tế hoặc ít nhất là một giả định khớp lệnh thực tế hơn, như mua ở giá mở cửa phiên sau, mua ở VWAP, hoặc thêm trượt giá tùy theo thanh khoản. Một hệ thống nghiêm túc không nên giả định cứ có tín hiệu cuối ngày là mua được toàn bộ vị thế ở đúng giá đóng cửa, đặc biệt với cổ phiếu thanh khoản thấp.
Đây cũng là lý do nhiều chiến lược trên giấy rất tốt nhưng vào tiền thật lại lệch. Không phải vì tín hiệu hoàn toàn sai, mà vì cầu nối từ tín hiệu sang giao dịch thật bị bỏ qua. Data cleaning tốt phải kéo dữ liệu lại gần thực tế giao dịch, chứ không chỉ làm cho feature đẹp hơn.
Các lỗi dữ liệu thường làm backtest đẹp giả
Lỗi đầu tiên là giá chưa điều chỉnh cho cổ tức, chia tách, phát hành thêm. Đây là lỗi dễ làm sai tín hiệu kỹ thuật và lợi nhuận lịch sử. Một ngày giá giảm do điều chỉnh kỹ thuật có thể bị hiểu là bán tháo, trong khi một ngày giá tăng bất thường do dữ liệu sai có thể bị hiểu là breakout.
Lỗi thứ hai là look-ahead bias trong dữ liệu cơ bản. Đây là lỗi rất nguy hiểm vì khó nhìn thấy. Nếu dùng lợi nhuận quý, EPS, ROE, nợ vay, dòng tiền hoặc P/E tại một ngày mà thực tế thị trường chưa biết dữ liệu đó, mô hình đang gian lận với quá khứ. Chiến lược càng dùng nhiều dữ liệu cơ bản càng phải lưu ý ngày công bố.
Lỗi thứ ba là survivorship bias. Nếu chỉ backtest trên những cổ phiếu còn tồn tại và còn giao dịch tốt hôm nay, mình đã vô tình loại khỏi quá khứ những cổ phiếu bị hủy niêm yết, đình chỉ, mất thanh khoản hoặc rơi vào trạng thái rất xấu. Backtest sẽ đẹp hơn thực tế vì những người thua cuộc đã bị xóa khỏi dữ liệu. Với chiến lược cổ phiếu nhỏ, cổ phiếu rẻ, cổ phiếu turnaround, lỗi này đặc biệt nguy hiểm.
Lỗi thứ tư là sai universe tại từng thời điểm. Ví dụ, dùng danh sách VN30 hiện tại để backtest từ nhiều năm trước là sai, vì tại thời điểm đó thành phần VN30 khác. Dùng danh sách cổ phiếu hiện tại để kiểm tra chiến lược quá khứ cũng có thể sai. Một chiến lược nghiêm túc cần biết tại từng thời điểm, cổ phiếu nào thuộc universe có thể đầu tư.
Lỗi thứ năm là bỏ qua trạng thái giao dịch. Cổ phiếu bị tạm ngừng giao dịch, bị kiểm soát, bị hạn chế, thanh khoản quá thấp, tăng trần trắng bên bán hoặc giảm sàn trắng bên mua đều ảnh hưởng đến khả năng vào/ra. Nếu backtest vẫn giả định mua bán bình thường, kết quả sẽ tốt hơn thực tế.
Lỗi thứ sáu là dữ liệu volume không phản ánh đúng thanh khoản có thể giao dịch. Nếu volume bao gồm cả giao dịch thỏa thuận, hoặc một phiên có giao dịch bất thường rất lớn, thanh khoản trung bình có thể bị thổi phồng. Với nhà đầu tư cá nhân, điều quan trọng là thanh khoản khớp lệnh có đủ để mua bán không, không chỉ là tổng giá trị giao dịch trên báo cáo dữ liệu.
Phương pháp kiểm tra dữ liệu trước khi tin backtest
Một cách thực tế là trước khi nhìn vào CAGR, Sharpe hay drawdown, hãy kiểm tra những giao dịch có ảnh hưởng lớn nhất đến kết quả. Lấy top 10 giao dịch lãi lớn nhất và top 10 giao dịch lỗ lớn nhất ra soi. Nếu lợi nhuận chiến lược chủ yếu đến từ vài giao dịch rất bất thường, cần mở chart, kiểm tra giá, volume, ngày sự kiện, corporate action và khả năng khớp lệnh thật.
Tiếp theo, kiểm tra những ngày lợi nhuận danh mục tăng/giảm bất thường. Nếu một ngày danh mục tăng 8–10% trong khi chiến lược phân bổ khá đa dạng, cần hỏi vì sao. Có phải do thị trường thật sự biến động mạnh, hay do một cổ phiếu lỗi giá kéo kết quả? Nếu một ngày hệ thống mua cổ phiếu thanh khoản cực thấp với tỷ trọng lớn rồi lãi rất cao, cần đánh dấu lại.
Sau đó, kiểm tra turnover. Một chiến lược có lợi nhuận tốt nhưng turnover quá cao có thể không còn lợi nhuận sau phí, thuế, spread và trượt giá. Nếu mỗi tuần thay gần hết danh mục, chiến lược phải có edge rất mạnh mới bù được chi phí. Với thị trường có thanh khoản phân hóa, turnover cao còn làm tăng rủi ro không khớp lệnh.
Tiếp nữa, kiểm tra capacity. Chiến lược có thể chạy tốt với quy mô 100 triệu nhưng không chạy được với 10 tỷ. Một backtest tốt phải trả lời được câu hỏi: với quy mô vốn cụ thể, lệnh mua bán chiếm bao nhiêu phần trăm thanh khoản trung bình của cổ phiếu? Nếu thường xuyên vượt quá mức hợp lý, lợi nhuận backtest không thực tế.
Cuối cùng, kiểm tra tính ổn định theo thời gian và theo nhóm cổ phiếu. Một chiến lược nếu chỉ thắng trong một giai đoạn thị trường tăng nóng, chỉ thắng ở nhóm cổ phiếu nhỏ, hoặc chỉ thắng nhờ vài mã đặc biệt, thì chưa chắc có lợi thế bền. Data cleaning tốt giúp mình nhìn rõ điều này, vì nó loại bỏ bớt lợi nhuận giả và buộc chiến lược đối mặt với thực tế hơn.
Data cleaning và Machine Learning: mô hình càng mạnh càng cần dữ liệu sạch
Với Machine Learning, data cleaning còn quan trọng hơn. Các mô hình như Random Forest, XGBoost, Neural Network có khả năng bắt pattern rất tốt. Nhưng chúng không tự biết pattern nào là thật, pattern nào là lỗi dữ liệu. Nếu dữ liệu đầu vào có lỗi, mô hình vẫn học. Nếu nhãn bị sai, mô hình vẫn tối ưu. Nếu feature chứa thông tin tương lai, mô hình vẫn cho accuracy cao. Vấn đề là kết quả đó không dùng được khi giao dịch thật.
Ví dụ, nếu một số cổ phiếu có lỗi giá tạo ra return cực lớn sau một phiên volume bất thường, mô hình có thể học rằng volume spike là tín hiệu cực mạnh. Nhưng thực tế đó không phải dòng tiền thật, mà là lỗi dữ liệu hoặc giao dịch bất thường. Khi đem mô hình ra tương lai, tín hiệu này không lặp lại, hoặc lặp lại nhưng không giao dịch được.
Vì vậy, trước khi hỏi nên dùng Random Forest, XGBoost hay LSTM, cần hỏi dữ liệu đã chuẩn chưa. Feature có point-in-time không? Nhãn có bị lệch bởi lỗi giá không? Universe có survivorship bias không? Dữ liệu cơ bản có bị cập nhật ngược quá khứ không? Thanh khoản có phản ánh giao dịch thật không? Nếu các câu hỏi này chưa được xử lý, thuật toán càng phức tạp chỉ càng làm mình sai một cách tự tin hơn.
Một checklist tư duy ngắn trước khi chạy chiến lược
Trước khi chạy một chiến lược bằng tiền thật, mình nên tự hỏi: dữ liệu giá đã điều chỉnh corporate actions chưa; dữ liệu dùng để tạo tín hiệu và dữ liệu dùng để mô phỏng khớp lệnh có bị lẫn không; báo cáo tài chính có dùng theo ngày công bố thực tế không; danh sách cổ phiếu có phản ánh đúng universe tại từng thời điểm không; cổ phiếu bị hủy niêm yết hoặc đình chỉ có bị loại khỏi quá khứ một cách vô thức không; thanh khoản dùng trong backtest có thật sự mua bán được không; chi phí, spread, trượt giá và giới hạn khối lượng có được tính không; các giao dịch thắng lớn nhất có hợp lý không; kết quả còn ổn không nếu bỏ vài giao dịch bất thường nhất ra khỏi backtest.
Những câu hỏi này nghe hơi mất công, nhưng nó giúp mình tránh một lỗi rất đắt: đem tiền thật đi giao dịch một chiến lược chỉ thắng vì dữ liệu sai.
Kết luận
Data cleaning là phần nền móng của xây dựng chiến lược. Nó không hào nhoáng như AI, không hấp dẫn như tín hiệu mua bán, không dễ khoe như một đường backtest đẹp. Nhưng nếu bỏ qua bước này, tất cả những phần phía sau đều có thể sai: feature sai, tín hiệu sai, backtest sai, mô hình sai, quản trị rủi ro sai và cuối cùng là quyết định đầu tư sai.
Một chiến lược tốt không chỉ cần ý tưởng tốt. Nó cần dữ liệu đúng, dữ liệu sạch, dữ liệu có thể giao dịch được và dữ liệu không chứa thông tin tương lai. Data cleaning không làm chiến lược chắc chắn thắng, nhưng nó giúp mình biết chiến lược có thật sự có lợi thế hay chỉ đang thắng trên một bộ dữ liệu bị lỗi.
Trong đầu tư định lượng, câu hỏi đầu tiên không nên là “mô hình nào mạnh nhất”, mà là “dữ liệu của mình có đáng tin không”. Vì nếu dữ liệu đầu vào đã sai, mọi thứ phía sau dù có tinh vi đến đâu cũng chỉ là một cách rất đẹp để đi đến kết luận sai.
