Backtest Python cần nối được dữ liệu, thông tin đã biết tại thời điểm, lệnh, giá khớp và sổ đối chiếu. Giữ cả mã bản ghi và thời gian. Đường equity chạy nhanh không cho biết tín hiệu dùng bản công bố muộn, nến chưa đóng hoặc giá mô hình thực thi không cho phép.

Chọn môi trường theo câu hỏi nghiên cứu

Strategy Tester của MT5 hỗ trợ Expert Advisor nhiều sản phẩm, kiểm thử và tối ưu. Python là một cách tổ chức dữ liệu và phép tính riêng, không phải lối thoát bắt buộc khỏi giới hạn một cặp tiền. So yêu cầu dữ liệu, hợp đồng và thực thi thật; khi so hai triển khai, dùng cùng tập dữ liệu đã đóng băng và quy tắc.

Lưu dữ liệu cùng ý nghĩa

Ghi sản phẩm, nhà cung cấp, múi giờ, phía giá, chu kỳ lấy mẫu và khoảng yêu cầu tải. Kiểm ID trùng, thứ tự, khoảng thiếu. Thị trường đóng không tự là lỗi file; điền khoảng trống có thể tạo quan sát chưa từng có. Giữ bản gốc và bước biến đổi.

MetaTrader5.copy_rates_range trả các trường time, OHLC, tick_volume, spread và real_volume, không toàn bộ biểu phí hoa hồng hoặc swap lịch sử. Nến có sẵn phụ thuộc lịch sử terminal và thiết lập; yêu cầu khoảng ngày không chứng minh trả đủ. Đầu vào thời gian và dữ liệu trả dùng UTC, phải tạo thời gian có múi giờ rõ trước khi chuyển lịch phiên. Việt Nam UTC+7 không đổi mùa; lịch London/New York cần ngày cụ thể.

pandas và NumPy hỗ trợ tính dữ liệu. Backtrader có quy trình theo sự kiện; vectorbt cũng cập nhật tiền và tài sản theo trạng thái, có chế độ orders, signals và hàm lệnh tùy chỉnh. Nhãn “vector hóa” không có nghĩa các lệnh độc lập trạng thái trước. Chọn bộ công cụ nhỏ đủ dùng; lưu phiên bản, giấy phép, quyền dữ liệu và môi trường hỗ trợ. Dữ liệu hoặc triển khai có thể có phí riêng, không mặc định toàn bộ stack miễn phí/mã nguồn mở hoặc tốc độ cố định.

Bỏ index có thể gắn tín hiệu sang nến khác

Cuộn ngang để xem hết sơ đồ.

Ghép theo nhãn khác ghép theo vị tríGiá A:100, B:102, C:104; cờ theo thứ tự C:1, A:0, B:0. Ghép ID chọn C:104; bỏ ID rồi nhân mảng chọn hàng đầu A:100.Giá theo IDCờ khác thứ tựA 100C 1B 102A 0C 104B 0Series: ID C → 104Bỏ ID: hàng đầu → 100Cùng dữ liệu, khác bản ghi được chọn.
Ba bản ghi hoàn tất giả định, ID duy nhất; cờ 1 chỉ ứng viên cho mô hình tiếp, chưa là lệnh hay giá khớp. Đường xanh giữ ID C; vị trí đầu mảng bỏ nhãn không cùng ý nghĩa.

Giá theo A,B,C là 100,102,104; cờ theo C,A,B là 1,0,0. prices * flags của Series ghép nhãn cho A:0,B:0,C:104. Nhân hai mảng không nhãn theo vị trí cho 100,0,0; gán lại A,B,C sẽ biến A thành ứng viên. Kiểm ID trước to_numpy(), không chỉ chiều dài. Ghép đúng vẫn phải kiểm thời điểm cờ có sẵn.

Một bản ghi khi nào được dùng?

Nến H1 mang thời gian mở 10:00 chưa có OHLC hoàn chỉnh lúc 10:00. Trong resample, closed quyết định phía biên thuộc khoảng, label quyết định nhãn hiển thị. Đổi nhãn không đổi lúc tổng hợp đã biết.

Ghép vĩ mô theo thời gian công bố của phiên bản dữ liệu đã có, không chỉ tháng kinh tế được mô tả. merge_asof cần khóa tăng dần; backward chọn thời điểm trước hoặc bằng, nearest có thể lấy tương lai. Không tùy chọn nào tự biết số liệu bị sửa về sau; định nghĩa tolerance và thứ tự sự kiện trùng thời gian.

Ví dụ riêng: quyết định 10:04 UTC; bản lưu 10:00 giá trị 50 và 10:05 giá trị 60. Backward không giới hạn tolerance chọn 50, trước 4 phút. Nearest chọn 60 vì cách 1 phút nhưng là 1 phút tương lai. Backward với tolerance 2 phút không khớp; ghi thiếu, không lấp bằng bản tương lai gần hơn.

Công thức nến đóng riêng: 20 nến đầu có High 100–119; mỗi Open=High−0,5, Low=High−2, Close=High−1. Nến 21 là O120/H121/L118/C120,5; nến 22 là O120,6/H122/L119/C121. Giá trừu tượng, không thị trường Forex thật.

previous_high = bars["high"].shift(1).rolling(20).max()
signal = bars["close"] > previous_high
next_bar_signal = signal.shift(1, fill_value=False)

Nến 21 có đỉnh 20 nến trước 119 nên 120,5>119 đúng. Nếu đưa High hiện tại vào, ngưỡng 121 và điều kiện sai. Dòng cuối đặt tín hiệu đã quan sát ở nến 22, chưa tạo giá khớp, chấp nhận lệnh hoặc thoát. Chỉ dùng nến đầu vào đã hoàn tất và quy định riêng khối lượng, loại lệnh, thứ tự sự kiện.

Tách tín hiệu, giá khớp và chi phí

Trong mô hình Market tiêu chuẩn được tài liệu Backtrader mô tả, lệnh phát sau xử lý nến hiện tại dùng Open nến có sẵn tiếp theo. Cấu hình hoặc mô hình khác có thể đổi thời điểm. Nếu SL và TP cùng nằm trong OHLC một nến, chỉ OHLC chưa xác định cái nào xảy ra trước.

Mô hình một giao dịch: mua 10.000 EUR tại Ask 1,1002, Bid cùng lúc 1,1000. Sau đó bán hết tại Bid 1,1012, Ask cùng lúc 1,1014. Pip 0,0001 USD/EUR; chênh giá khớp 10 pip=10 USD. Hoa hồng 1 USD mỗi phía → ròng 8 USD; tài trợ và trượt thêm giả định 0. Trừ thêm spread vào 2 pip sẽ báo 6 USD và đếm đôi chênh đã có trong Ask/Bid.

Nêu tài trợ, đổi tiền, cỡ hợp đồng, margin và lệnh từ chối của sản phẩm. Nhiều sản phẩm cần tiền chung, margin còn lại và thứ tự yêu cầu đồng thời; cộng đường equity độc lập có thể chứa lệnh tài khoản chung không đủ tiền mở. Trượt giá ngẫu nhiên cần phân phối, seed và phiên bản thư viện, không chỉ chữ “ngẫu nhiên 1 pip”.

Sổ lệnh khiến tuyên bố kiểm lại được

Ví dụ R cùng giá trị tiền: 40 thắng +2R, 60 thua −1R → lãi 80R, lỗ 60R, ròng 20R, PF 80/60≈1,33, trung bình 0,2R. Trừ phí 0,1R ở mọi giao dịch → 40 kết quả +1,9R và 60 kết quả −1,1R: lãi 76R, lỗ 66R, ròng 10R, PF 76/66≈1,15, trung bình 0,1R. Đây số học giả định, không kết quả backtest thật.

Phản ví dụ tái vào: năm nến có điều kiện true,true,true,false,true. Cả hai chính sách vào nến 1; stop đóng nến 2 trước bước xét vào, sau đó không còn thoát. “Đang flat và true thì vào” tái vào nến 2 rồi giữ. “Cần false mới kích hoạt lại” chờ qua 2,3, tái kích hoạt nến 4 và vào nến 5. Đều hai lần vào, nhưng danh sách ID [1,2] khác [1,5]. Đây máy trạng thái đã chọn rõ, không mặc định của thư viện nào.

Giữ equity cả vị thế mở lẫn kết quả đóng. Khi tính drawdown phải có vốn đầu; tách nạp/rút khỏi lợi nhuận chiến lược. Không thêm lợi suất, Sharpe hoặc drawdown thiếu sổ theo thời gian để tái tạo.

Tách lựa chọn mô hình khỏi dữ liệu giữ lại

Cố định cửa sổ train/test theo thời gian trước chọn quy tắc. Ghi mọi sản phẩm, bộ tham số, filter và split đã thử, kể cả bị bỏ. Ít tham số chưa là ít giả thuyết. Bailey và đồng tác giả nghiên cứu lựa chọn chiến lược nhiều lần và overfitting; bài này không ước tính PBO từ mô hình giả định.

Mô hình 100 giao dịch khác: 75 lãi +0,2R và 25 lỗ −1R cho lãi 15R, lỗ 25R, ròng −10R, PF 0,6 dù thắng 75% trước phí. Tỷ lệ thắng cao chưa chẩn đoán lỗi. Kiểm quan sát, phụ thuộc mẫu, khớp, chi phí và độ nhạy thay vì ngưỡng thắng/PF chung hoặc số tham số “an toàn”.

Cùng dấu 10:05 vẫn cần biết thứ tự sự kiện

Cùng dấu 10:05 vẫn cần biết thứ tự sự kiệnMô hình mới: chỉ bản 10:00=50 và 10:05=60; quyết định cũng mang thời gian 10:05 UTC.PHÉP TÍNH GIẢ ĐỊNHQuyết định trước nhận bản 10:05Cho trước chỉ dùng thôngtin trước: 50Quyết định sau nhận bản 10:05Cho trước bản đã khảdụng: 60Không có log thứ tựChưa xác định bản nàođược phép dùng
Cùng dấu 10:05 vẫn cần biết thứ tự sự kiện. Mô hình mới: chỉ bản 10:00=50 và 10:05=60; quyết định cũng mang thời gian 10:05 UTC.

Tùy chọn ghép chỉ thực thi quy tắc. Cần log khả dụng và thứ tự; không chọn inclusive hay strict theo kết quả có lãi hơn.

Trên màn hình nhỏ, bạn có thể cuộn ngang hoặc phóng to sơ đồ. Các giá trị và kết luận cũng có ở phần văn bản bên dưới.

Quyết định trước nhận bản 10:05
Cho trước chỉ dùng thông tin trước: 50 – allow_exact_matches=False với backward loại cùng thời điểm; không tự chứng minh độ trễ thật.
Quyết định sau nhận bản 10:05
Cho trước bản đã khả dụng: 60 – Backward cho khớp bằng thời điểm mới phù hợp sự kiện này.
Không có log thứ tự
Chưa xác định bản nào được phép dùng – Nhãn thời gian bằng nhau không tự chứng minh dữ liệu đã nhận.

Bắt đầu với kiểm thử hồ sơ nhỏ

  1. Tạo dự án riêng, giữ dữ liệu gốc và ID, nguồn, thời gian UTC, phía giá, phiên bản. Bài tập offline này không cần thông tin đăng nhập live hoặc gửi lệnh.
  2. Đi qua vài bản ghi đã định; ghi lúc tín hiệu có sẵn, sự kiện tiếp có thể khớp và cách xử lý thiếu/sửa dữ liệu.
  3. Chọn quy tắc vị thế: thêm, đảo, tái vào sau stop hay đợi tái kích hoạt; kiểm danh sách ID vào.
  4. Đối chiếu từng fill và chi phí rồi suy kết quả từ sổ; so quy tắc đã đóng băng dưới giả định thực thi khác được nêu.
  5. Giữ nhật ký lần thử, cửa sổ chưa dùng, phiên bản và giới hạn. Mức giảm hiệu suất cố định không chỉ ra nguyên nhân. Đọc kiểm định walk-forward để kiểm dữ liệu đã có trước từng cửa sổ.