Mục lục bài viết

Bằng chứng và phạm vi

Đây là thiết kế kiểm định tổng hợp và các ví dụ tự tạo, không phải một backtest mới. Các nghiên cứu và tài liệu nguồn hỗ trợ phương pháp đánh giá; chúng không chứng nhận lợi nhuận của các thuật toán trong thư viện.

Dữ liệu và thị trườngÁp dụng cho nghiên cứu cổ phiếu, ETF, futures và crypto khi dữ liệu, contract và chi phí được đặc tả riêng.
Khung thời gian nghiên cứuMọi khung; độ phân giải execution phải phù hợp thời gian sống của tín hiệu.
Chuỗi equity giả lập được chia theo thời gian thành development, validation và test; không có thao tác xáo trộn thời gian.Mở hình kích thước đầy đủ
Đường equity và số cơ hội tự tạo chỉ minh họa cách chia thời gian, không phải kết quả chiến lược. Trục dọc là vốn quy ước; mọi phase phải được xác định trước, không chọn từ hình này.

Quy trình thực hành

Sơ đồ quy trình Kiểm định chiến lược: dữ liệu, khớp lệnh và bằng chứng ngoài mẫu
Các bước được mô tả đầy đủ bên dưới. Tại mỗi bước, dữ liệu thiếu hoặc điều kiện sai phải có lý do loại bỏ.
  1. Đăng ký giả thuyếtKhóa thị trường, rule, costs, metrics và số thử.
  2. Kiểm tra dữ liệuPoint-in-time, volume, universe và timestamps.
  3. Replay nhân quảXác nhận tín hiệu rồi mới tạo order/fill.
  4. Kiểm tra riskSizing, margin, exposure và gap stress.
  5. Walk-forwardPurge labels; chọn trên validation, khóa test.
  6. Báo toàn bộAblation, stress, bất định và cấp bằng chứng.

Bốn câu hỏi cần trả lời theo thứ tự

Bắt đầu bằng tách bốn câu hỏi: hình học được nhận diện nhất quán không; sự kiện có thông tin về return tương lai không; có giao dịch được sau chi phí không; kết quả có tồn tại ngoài mẫu không. Có thể trả lời có ở bước đầu và không ở bước cuối mà không có mâu thuẫn.

Lo–Mamaysky–Wang nghiên cứu việc lượng hóa mẫu biểu đồ và thông tin trong phân phối return có điều kiện; thông tin thống kê không đồng nghĩa lợi nhuận giao dịch vượt trội sau chi phí. [1] Bởi vậy không dùng một paper nhận diện mẫu để quảng bá win rate cho một hệ thống có entry/stop tự thêm.

Trước khi xem kết quả, viết hypothesis card: thị trường, universe, dữ liệu, điều kiện vào/ra, sizing, chi phí, benchmark, chỉ tiêu chính, các biến thể được phép và tiêu chí bác bỏ. Ví dụ đề xuất: thêm RVOL phải cải thiện mean net return với exposure tương đương; không chỉ giảm số lệnh và làm win rate đẹp hơn.

1. Dữ liệu point-in-time và nguồn volume

Mỗi record cần event_time, received_at và available_at. Event_time là lúc giao dịch xảy ra; available_at là lúc chiến lược có thể dùng sau tổng hợp, truyền và xử lý. Một corporate action có ngày hiệu lực khác ngày công bố; chọn trường theo mục đích và không ghép bản cuối cùng của lịch sử vào mọi thời điểm cũ.

Universe cũng là dữ liệu: thành viên tại mỗi ngày, mã chết, đổi ticker, IPO và trạng thái shortable cần lịch sử. Không lấy danh sách cổ phiếu hiện nay rồi lùi về quá khứ. Với continuous futures, lưu hợp đồng thực giao dịch, lịch roll và chênh lệch giữa giá nối dùng phân tích với giá contract dùng fill.

Volume cổ phiếu, số contracts, dollar volume, tick volume và volume một sàn crypto không thay thế nhau. Lưu unit, venue, session, cách tổng hợp và sửa lỗi. RVOL cần mẫu số cùng giờ; VWAP phải khóa nguồn giá, reset và xử lý volume bằng 0. Kiểm tra outlier trước nghiên cứu theo quy tắc dữ liệu, không xóa một phiên chỉ vì chiến lược lỗ lớn.

Bộ kiểm tra tối thiểu gồm timestamp trùng/lệch thứ tự, thiếu phiên, H≥max(O,C), L≤min(O,C), giá không hợp lệ, volume âm, và đơn vị split. Giữ manifest hash dữ liệu, phiên bản code, timezone và config để một người khác chạy lại đúng tập đầu vào.

2. Chống repaint bằng thời điểm xác nhận và prefix invariance

Một pivot xảy ra ở i nhưng cần r bar bên phải chỉ được biết tại i+r. Lưu occurred_at=i và confirmed_at=i+r; entry không được quay về nến i. Kháng cự dùng trong breakout phải tồn tại trước tín hiệu. ATR hoặc rolling high tham chiếu cần shift theo quy tắc đã chọn, không để bar kích hoạt tự nâng ngưỡng.

Kiểm tra prefix invariance: chạy engine trên dữ liệu từ đầu đến T, lưu sự kiện đã xác nhận; nối thêm dữ liệu và chạy lại, các sự kiện cũ không được đổi. Điểm cuối ZigZag có thể thay đổi nếu được đánh dấu provisional; không được biến nó thành tín hiệu confirmed trong báo cáo.

Với đa khung, một H4 candle chưa đóng không được đối xử như close H4 hoàn tất. Join theo available_at của khung lớn; nếu nến H4 đóng đúng timestamp nến H1, chỉ dùng nó khi trình tự nhận/xử lý cho phép. Vẽ đẹp tại quá khứ không thay thế kiểm tra dữ liệu có sẵn.

Ví dụ tự tạo: low tại bar 20 cần ba bar phải; detector chỉ báo lúc 23 đóng. Một lệnh giả định mua tại low bar 20 có thể thắng đẹp nhưng không thuộc hệ thống nhân quả. Bản sửa vào sau 23 có thể có reward/risk nhỏ hơn hoặc không còn giao dịch.

3. Execution engine: order tồn tại trước fill

Mỗi order cần created_at, submitted_at, accepted_at, trigger, quantity, limit/stop, time-in-force và trạng thái. Mỗi fill cần timestamp, price, quantity, phí và liên kết order. Logic quyết định và logic khớp phải tách để không dùng kết quả fill tương lai sửa tín hiệu.

TradingView mô tả emulator với giả định đường đi OHLC và thời điểm order có hiệu lực; những mặc định này có thể khác thị trường thật. [2] Một backtest bar-only cần nêu rõ giả định, đặc biệt nến chạm cả stop và target. Không biết thứ tự thì dùng dữ liệu chi tiết hơn hoặc công bố khoảng kết quả theo hai biên.

Stop-market được kích hoạt không bảo đảm giá stop; limit kiểm soát giá nhưng có thể không khớp. [3] Khi giá gap, dùng giá khả thi sau khi order hoạt động. Nếu đã đặt stop-entry trước gap, không được hủy hồi tố chỉ vì fill quá xấu.

Chi phí gồm commission, spread, slippage/impact, funding hoặc borrow theo sản phẩm. Nếu giá fill đã ở bid/ask, đừng trừ spread lần nữa. Chỉ cộng funding tại thời điểm vị thế thực sự còn mở; lịch và rate phải lấy từ dữ liệu sản phẩm. Với limit, xử lý queue, partial fill và adverse selection; low chạm giá chưa chứng minh lệnh lớn đã khớp.

4. Sizing theo đơn vị rủi ro và giới hạn danh mục

Với sản phẩm tuyến tính và mọi đại lượng cùng currency, công thức đề xuất q=floor(B/(|E−S|×multiplier+c_unit)), trong đó B là ngân sách lỗ, E entry dự kiến, S stop và c_unit là chi phí dự kiến mỗi đơn vị. Sau đó cap bởi step size, liquidity, notional, gross exposure, margin và risk tổng danh mục. Inverse contract cần công thức PnL riêng.

Ví dụ tự tạo: equity $20.000, risk 0,5% cho B=$100; E=100, S=99,50, multiplier=1, chi phí vòng dự kiến $0,04/cổ phiếu. q=floor(100/0,54)=185. Nếu vào 100 và stop khớp 99,50, lỗ giá cộng chi phí gần $99,90. Nếu gap xuống 99,20, lỗ thành 185×0,84=$155,40. Budget không phải bảo đảm mức lỗ tối đa.

Những mã tương quan có thể cùng lỗ. Cần cap tổng risk và theo cụm ngành/tài sản, đồng thời stress tất cả lệnh pending cùng kích hoạt. Đặt đòn bẩy từ đầu kiểm định; không nâng leverage riêng ở đoạn thắng. ETF đòn bẩy nội tại và margin tài khoản phải được báo tách.

Đối chiếu cùng chiến lược bằng fixed-notional và risk-based sizing để biết kết quả đến từ tín hiệu hay phân vốn. Drawdown dùng equity mark-to-market gồm vị thế mở, không chỉ cộng lệnh đã đóng.

5. Walk-forward, purging và embargo đúng vấn đề

Chia thời gian thành development, validation và test cuối. Ví dụ thiết kế: học trên quá khứ, chọn cấu hình bằng validation kế tiếp, khóa cấu hình rồi chạy test tiếp theo; lặp cuốn chiếu. Quy tắc chọn cấu hình cũng là một phần mô hình cần định trước, không xem tất cả test rồi chọn cửa sổ đẹp.

Nhãn của một sự kiện kéo từ entry đến exit. Nếu train chứa một trade bắt đầu trước T nhưng kết thúc trong vùng test sau T, label train đã dùng tương lai của test; cần purge quan sát đó. Trong walk-forward chỉ học quá khứ, kiểm tra label_end<T là bước cơ bản.

Tài liệu trình bày của López de Prado mô tả purging và embargo để giảm rò rỉ do các khoảng thông tin chồng lấn. [4] Khi cross-validation cho phép train nằm sau một fold test, embargo loại thêm vùng ngay sau test theo thiết kế phụ thuộc. Không áp dụng một tỷ lệ embargo cố định rồi cho rằng mọi leakage đã hết.

Fit scaler, quantile, feature selection và ngưỡng regime chỉ trên train. Purging không sửa được pivot backdated, fill không khả thi hoặc holdout đã dùng để điều chỉnh mô hình. Sau khi xem test và thay quy tắc dựa vào nó, cửa sổ đó trở thành dữ liệu phát triển; cần dữ liệu mới hoặc forward test cho đánh giá tiếp.

6. Ablation, thử nhiều biến thể và stress

Để đo volume, so A=price-only, B=A+RVOL, C=A+VWAP entry, D=A+VWAP exit trên cùng universe và execution. Tách lọc tín hiệu khỏi sizing: một filter có thể cải thiện return trung bình/lệnh nhưng làm lợi nhuận theo thời gian thấp hơn vì ít cơ hội. Báo cả hai.

Trials registry phải ghi mọi thay đổi: tham số, timeframe, assets, filters, stops, targets, cách chia test và lựa chọn thủ công. Deflated Sharpe Ratio điều chỉnh suy luận Sharpe cho việc chọn giữa nhiều thử nghiệm và return không chuẩn; nó không phải xác suất tài khoản sẽ có lãi. [5]

PBO dùng hiệu quả của quá trình lựa chọn: bản tốt trong mẫu có rơi dưới median ngoài mẫu hay không trong cấu trúc kiểm định của phương pháp. Nó không phải xác suất lỗ của một giao dịch hoặc một tài khoản. [6] Các phép điều chỉnh thống kê không cứu một execution engine nhìn trước.

Stress đề xuất gồm chi phí 1,5×/2×, trễ một bar, tham số lân cận, giới hạn participation, loại từng nhóm dữ liệu và xem riêng PnL không có năm lệnh tốt nhất. Bỏ lệnh tốt chỉ là đo tập trung lợi nhuận, không tự chứng minh hệ thống sai; chiến lược xu hướng có thể cần đuôi phải. Hãy báo mức phụ thuộc đó cùng tần suất cơ hội.

7. Metrics, ví dụ kỳ vọng và cấp độ bằng chứng

Báo số ứng viên, tín hiệu, orders, fills, trades và thời gian exposure. Win rate chỉ có nghĩa khi mẫu số rõ: ngày, lệnh hay setup. Báo mean/median net R, payoff, profit factor, drawdown và thời gian hồi phục, turnover, tail loss, capacity và kết quả theo năm/regime. R phải định nghĩa trước trade; không lấy stop dịch chuyển sau đó làm mẫu số thuận lợi.

Ví dụ tự tạo: p=0,40, W=2R, L=1R, c=0,08R cho E=pW−(1−p)L−c=0,12R. Ngưỡng hòa vốn p=(L+c)/(W+L)=0,36. Một hệ thống thắng 65% nhưng W=0,5R, L=1R và cùng phí có E=−0,105R. Win rate cao hơn không tự tốt hơn.

Sharpe tính trên chuỗi return equity cùng tần suất, kèm convention risk-free và annualization. Không tính Sharpe ngày bằng cách coi các trade không đều thời gian là các ngày độc lập. CAGR mô tả ghép lãi đầu–cuối theo thời gian; IRR phụ thuộc cashflow và convention; alpha là hệ số mô hình benchmark. Chỉ đổi nhãn khi đã kiểm tra phép tính.

Một báo cáo có thể ở cấp chia sẻ quy tắc, backtest tự công bố, mã/dữ liệu tái lập, kiểm định độc lập, forward paper trading hoặc account live được xác minh. Mỗi cấp trả lời một câu hỏi khác. Video có vài lệnh thắng và paper có bảng tổng hợp đều là nguồn nghiên cứu, nhưng không tự xác nhận toàn bộ quá trình khớp và chọn mẫu.

Pipeline đầu ra để người khác kiểm tra được

Sản phẩm cuối nên là một manifest nghiên cứu, event log, order/fill log, equity và báo cáo mọi nhánh đã đăng ký. Một người khác cần lần được từ lệnh bất kỳ về dữ liệu tạo tín hiệu, cách size, giá khớp và chi phí, không chỉ xem đường equity.

Điều kiện tiếp tục nghiên cứu là kết quả đủ ổn định theo tiêu chí đã khóa và còn khả năng thực thi ở quy mô dự định. Nếu không đạt, ghi failed/uncertain với nguyên nhân. Không sửa ngưỡng rồi giữ nhãn test nguyên vẹn. Sau backtest, forward paper trading dùng để kiểm tra vận hành và sai lệch dữ liệu, không thay thế đo live fills.

Pipeline tách development khỏi final holdout trước nghiên cứu. Mỗi fold loại nhãn train chồng validation hoặc test, đồng thời loại nhãn validation chồng test. Sau khi đã chọn toàn bộ cấu hình bằng development, đánh giá final holdout đúng một lần; không dùng kết quả đó để chọn lại tham số.

spec = freeze_hypothesis_and_trial_registry()
data = load_versioned_point_in_time_inputs()
assert_data_integrity(data)
assert_confirmed_events_are_prefix_invariant(data)
development, final_test = split_chronologically_before_research(data)
for fold in chronological_folds(development, spec):
    train = purge_overlapping_labels(fold.train, fold.validation + fold.test)
    validation = purge_overlapping_labels(fold.validation, fold.test)
    model = fit_using_train_only(train)
    config = select_on_validation(model, validation)
    freeze(config)
    events = replay_causally(fold.test, config)
    fills = simulate_orders_after_available_at(events, spec.execution)
    equity = mark_to_market(fills, fees=spec.costs)
    archive_all_results(config, events, fills, equity)
final_config = freeze_selection_using_development_only()
evaluate_final_holdout_once(final_test, final_config)
report_net_metrics_ablations_stress_and_uncertainty()

Sai lầm thường gặp

Detector đẹp thành chiến lược có lãi

Hình học, thông tin dự báo, execution và OOS là bốn tầng kiểm định riêng; vượt một tầng không chứng minh các tầng còn lại.

Chart đẹp che thời điểm xác nhận trong tương lai

Vẽ pivot tại vị trí lịch sử có thể che độ trễ xác nhận. Lưu cả occurred_at và confirmed_at, rồi kiểm mọi quyết định theo thời điểm thông tin sẵn sàng.

Mọi chi phí gom thành một commission nhỏ

Spread, impact, borrow/funding và fills thiếu có thể lớn hơn commission; phải mô hình theo sản phẩm và thanh khoản.

Phí thực tế nhưng fill bất khả thi

Commission không bù được entry tại signal-close chưa biết, thứ tự intrabar luôn có lợi hoặc giả định limit chắc chắn khớp.

Tập test được dùng nhiều lần

Mỗi lần điều chỉnh theo kết quả test làm giai đoạn đó tham gia quá trình phát triển. Ghi lại các lần sử dụng và giữ một giai đoạn đánh giá mới chưa đụng tới.

Chỉ lưu chiến lược thắng

Không biết số thử và phân phối các bản thất bại sẽ đánh giá quá cao bằng chứng của bản được chọn.

Dùng thuật ngữ thống kê như bảo đảm

DSR, PBO và p-value giải quyết các câu hỏi suy luận cụ thể theo giả định; chúng không thay thế kiểm tra execution hoặc chứng nhận lợi nhuận tài khoản tương lai.

Checklist trước khi dùng phương pháp

Tự đánh dấu khi đã kiểm tra trên dữ liệu của bạn. Trạng thái lưu trong trình duyệt này; đây không phải chứng nhận chiến lược có lãi.

0/16 mục

Câu hỏi thường gặp

Bao nhiêu lệnh thì đủ để chứng minh có lợi thế?

Không có số chung. Độ phụ thuộc, phân phối payoff, số biến thể, chế độ thị trường và độ lớn hiệu ứng quyết định bất định. Nhiều lệnh gần như trùng nhau không bằng nhiều cơ hội độc lập.

Backtest không có quote thì có dùng được không?

Có thể dùng sàng lọc ý tưởng với giả định công khai và khoảng kết quả. Với chiến lược stop hẹp hoặc limit nhạy queue, thiếu quote/intrabar làm kết luận khả thi yếu hơn.

Đã có kết quả ngoài mẫu dương có cần paper trade?

Có để kiểm tra vận hành, thời gian dữ liệu và xử lý order. Paper trade vẫn không đảm bảo queue hoặc fill live, nên phải ghi rõ cấp bằng chứng.

Nguồn nghiên cứu

Các nguồn dưới đây hỗ trợ phần định nghĩa hoặc bằng chứng được ghi bên cạnh. Mã giả, ví dụ minh họa và tham số đề xuất trong bài cần được kiểm định riêng.

  1. Foundations of Technical Analysis: Computational Algorithms, Statistical Inference, and Empirical ImplementationAndrew W. Lo, Harry Mamaysky, Jiang Wang. Đọc nghiên cứu nhận diện mẫu và suy luận thống kê; không dùng làm bằng chứng mọi rule trong thư viện có lãi. Đối chiếu: .
  2. Pine Script — StrategiesTradingView. Tài liệu order timing và broker emulator; chỉ mô tả simulator, không phải cơ chế fill mọi sàn. Đối chiếu: .
  3. Understanding Order Types — Investor BulletinU.S. SEC — Investor.gov. Định nghĩa market/limit/stop và giới hạn bảo đảm thực thi. Đối chiếu: .
  4. MLX 2018 — The 7 Reasons Most Machine Learning Funds FailMarcos López de Prado — bản trình bày đăng trên SlideShare. Đọc slides về purging/embargo; không tuyên bố đã đọc toàn bộ cuốn sách về machine learning tài chính. Đối chiếu: .
  5. The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting and Non-NormalityDavid H. Bailey, Marcos López de Prado — 2014. Đọc PDF; phương pháp suy luận với giả định và thông tin số thử, không xác suất live profit. Đối chiếu: .
  6. The Probability of Backtest OverfittingBailey, Borwein, López de Prado, Zhu. Đọc phương pháp CSCV/PBO; phân biệt rank ngoài mẫu với xác suất thua tiền. Đối chiếu: .

Đọc tiếp theo phương pháp

Lưu ý rủi ro

Nội dung phục vụ giáo dục và thiết kế nghiên cứu, không phải lời khuyên tài chính. Backtest là mô phỏng lịch sử, không bảo đảm hiệu quả tương lai và không đặt lệnh giao dịch thật. Các phương pháp trong thư viện không mặc nhiên là tính năng đã có trong ứng dụng. Xem phương pháp tính và trung tâm học.

Kiểm tra quy tắc trước khi dùng vốn thật

Đối chiếu khả năng hỗ trợ của ứng dụng, dữ liệu và từng giao dịch mô phỏng; các detector nâng cao có thể cần triển khai riêng.

Tải Backtest trên App Store