Trong bài viết này
Sau khi đọc bài này…
- Ghép tín hiệu và giá theo đúng ID.
- Xác định dữ liệu đã có tại quyết định.
- So danh sách lệnh thay vì chỉ tổng số.
Tra cứu thuật ngữ ngay trong bài
Backtesting (kiểm thử dữ liệu lịch sử) Khớp lệnh Phí hoa hồng giao dịch Drawdown (sụt giảm từ đỉnh) Stop loss — lệnh dừng lỗ Take profit — mức chốt vị thế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ơ đồ.
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
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ỏ
- 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.
- Đ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.
- 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.
- Đố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.
- 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ổ.
Kiểm tra mức độ hiểu bài
Bài tập: khoảng 2 phút.
Xem đáp án và giải thích
Cờ 1 thuộc ID C và giá của C là 104.
Câu hỏi khác
Cần Python nâng cao ngay?
Backtrader hay vectorbt?
Lấy lịch sử đáng tin ở đâu?
Kết quả quá đẹp thì kiểm gì?
Nguồn và kiểm chứng
- pandas.pydata.org
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- pandas.pydata.org
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- pandas.pydata.org
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- www.mql5.com
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- www.backtrader.com
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- vectorbt.dev
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- www.davidhbailey.com
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- www.metatrader5.com
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- ranaroussi.github.io
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
- docs.ccxt.com
Nguồn tham khảo cho nội dung; xem phạm vi và giả định được nêu trong bài.
Các phép tính dùng giả định được nêu rõ. Chúng không thay thế dữ liệu thị trường hiện tại hoặc điều khoản của nhà cung cấp.
