Chuyển đến nội dung

Xem bản gốc

BtcSpotDualTimeframeMomentumConfluenceLong

Giả thuyết

BTC Spot Song Khung Thời Gian Hợp Lưu Momentum, LONG-ONLY 1x (BTCUSDT.BINANCE_SPOT, 4H Chính + 1D Xác Nhận, Chỉ Long Khi BOTH Khung Thời Gian Cùng Hướng UP, FLAT Về Tiền Mặt Trong Trường Hợp Khác, Thoát Lệnh ATR-Trailing + Phá Vỡ Chế Độ Theo Ngày, Giữ Nguyên Tham Số Đã Tối Ưu Từ Nguồn)

Giả thuyết

Một bản chuyển đổi LONG-ONLY, 1x, tài khoản CASH của chiến lược được promote có hiệu suất tốt nhất trong factory (BtcDualTimeframeMomentumConfluenceLS, Sharpe 1.99, 458 giao dịch, +$4,774 trong 29 ngày paper trading) sang BTCUSDT.BINANCE_SPOT, được tạo ra cụ thể như FIRST LIVE-TRADING CANDIDATE vì sàn giao dịch live chỉ hỗ trợ spot. Cơ chế không đổi, thuần OHLCV, một công cụ duy nhất: chân FAST = dấu của lợi suất trailing 18-thanh trên các thanh 4-HOUR; chân SLOW = dấu của lợi suất trailing 15-thanh trên các thanh DAILY (đọc qua on_extra_bar như một chân bối cảnh (context leg), không bao giờ là rào chắn đồng bộ (sync barrier)). Cả hai đều phải AGREE. Thay đổi cấu trúc duy nhất mà tài khoản CASH buộc phải có là thu gọn {LONG/FLAT/SHORT} thành {LONG/FLAT}: nơi mà chiến lược gốc futures vào lệnh SHORT khi có hợp lưu cùng giảm (joint-down), phiên bản spot giữ 100% USDT. Mọi thứ khác được giữ nguyên đúng như bản gốc: stop trailing ATR(14) ở mức 3.033x ATR tính từ mức cực trị đang chạy, điều kiện thoát khi chế độ theo ngày bị phá vỡ, kích thước vị thế theo tỷ lệ biến động tương ứng với vốn (risk_pct 1.011% / khoảng cách stop 3.033xATR), mức trần giá trị danh nghĩa tối đa 49.7%, và đúng vector tham số mà quá trình tối ưu hóa nguồn đã chọn (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Ba tham số có thể tinh chỉnh, không có dữ liệu bổ sung, không có short, không có đòn bẩy. Các thay đổi mã nguồn dành riêng cho spot: sàn giao dịch BINANCE_SPOT CASH (không có hệ số nhân đòn bẩy trong position_size), size_precision 5 / price_precision 2, min_notional $10, các lệnh bán chỉ được định cỡ theo số lượng tài sản cơ sở đang nắm giữ. Dữ liệu đã được xác minh có sẵn: BTCUSDT.BINANCE_SPOT các thanh 4-HOUR và 1-DAY chạy liên tục từ 2017-08-17 (~9 năm, ~19,800 thanh 4H).

Giả thuyết

Chuyển đổi trực tiếp từ chiến lược gốc futures đã được promote BtcDualTimeframeMomentumConfluenceLS sang sàn giao dịch spot, vì sàn giao dịch live dự kiến chỉ hỗ trợ spot. Cơ chế được giữ nguyên đúng như bản gốc: cùng hai chân momentum, cùng cổng AGREE-hoặc-flat, cùng stop trailing ATR(14) 3.033x tính từ mức cực trị đang chạy (running extreme), cùng điều kiện thoát khi chế độ (regime) theo ngày bị phá vỡ, cùng cách xác định kích thước vị thế theo tỷ lệ biến động risk_pct / khoảng cách stop, với mức trần giá trị danh nghĩa 49.7%, và đúng vector tham số mà quá trình tối ưu hóa nguồn đã chọn (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Tài khoản CASH buộc phải có đúng một thay đổi cấu trúc, như giả thuyết đã nêu rõ: {LONG,FLAT,SHORT} thu gọn thành {LONG,FLAT} — should_enter trả về BUY chỉ khi cả hai cùng tăng (joint-up) và None trong các trường hợp còn lại, do đó trường hợp cả hai cùng giảm (joint-down) trở thành 100% USDT thay vì một lệnh short. Các chỉnh sửa dành riêng cho spot: sàn giao dịch BINANCE_SPOT với đòn bẩy 1.0 và không có thành phần đòn bẩy trong position_size, size_precision 5 / price_precision 2 (BTCUSDT spot), min_notional được nâng lên $10, và tất cả các lệnh thoát đều được định tuyến qua cơ chế reduce-only close_position của template gốc, để một SELL chỉ có thể giảm bớt số lượng tài sản cơ sở đang nắm giữ (một lệnh short spot trần trụi là không thể xảy ra về mặt cấu trúc, và cơ chế bảo vệ _would_open_spot_short của base không bao giờ bị kích hoạt). calculate_signal trả về lợi suất liên tục 18-thanh 4H mỗi thanh (giá trị thay đổi theo từng thanh); cổng hợp lưu (confluence) rời rạc nằm trong should_enter, đúng như yêu cầu. Chi phí mỗi thanh là O(1): ATR sử dụng một cửa sổ cố định 15-thanh và lợi suất nhanh chỉ là một lần tra cứu chỉ mục đơn, nên không có khối lượng công việc tăng theo lịch sử. Một lưu ý trung thực dành cho Nhà phân tích: chi phí round-trip trên spot là ~0.20% so với ~0.10% trên chiến lược gốc futures, nên lợi thế mỗi giao dịch phải vượt qua gấp đôi ma sát giao dịch — cấu trúc thoát lệnh theo xu hướng (trailing + phá vỡ chế độ, không có chốt lời cố định) chính là yếu tố giúp thời gian nắm giữ trung bình đủ dài để điều này khả thi, nhưng đây là chỉ số cần theo dõi đầu tiên.

Triển khai

LONG-ONLY 1x BTCUSDT spot (BINANCE_SPOT, CASH) hợp lưu momentum song khung thời gian. Chân FAST = dấu của lợi suất trailing 18-thanh trên các thanh 4-HOUR (chính); chân SLOW = dấu của lợi suất trailing 15-thanh trên các thanh 1-DAY, được tiêu thụ qua on_extra_bar như một chân bối cảnh khung thời gian chậm hơn (khung thời gian khác nên rào chắn căn chỉnh chéo chân (cross-leg alignment barrier) của template gốc không bao giờ trì hoãn tín hiệu 4H). Cả hai chân đều phải cùng hướng UP để giữ BTC; cả trường hợp cùng giảm (joint-down, nơi chiến lược gốc futures short) và trường hợp bất đồng đều có nghĩa là giữ 100% USDT. Thoát lệnh: trailing stop ATR(14) ở mức 3.033x ATR bên dưới đỉnh chạy (running peak) của vị thế, OR khi chân theo ngày đảo chiều giảm dưới vị thế long (phá vỡ chế độ ở khung thời gian cao hơn). Kích thước vị thế được tính theo tỷ lệ biến động và tương ứng với vốn: equity * 1.011% / (3.033 * ATR), giới hạn trần ở 49.7% số dư USDT theo giá trị danh nghĩa, với hệ số nhân đòn bẩy NO (tài khoản CASH không thể vay), được lượng tử hóa (quantized) theo size_precision 5 và bị từ chối nếu dưới mức giá trị danh nghĩa tối thiểu spot $10. Ba tham số có thể tinh chỉnh, thuần OHLCV, không có dữ liệu bổ sung, không có short.

Kết quả xác minh

Hoặc sử dụng self._atr (hiện tại) trong so sánh trailing của should_exit để khớp chính xác với chiến lược gốc, hoặc nêu rõ trong mô tả rằng trailing được neo theo ATR tại thanh vào lệnh (entry-bar) để nhà phân tích không quy sự khác biệt so với chiến lược gốc là do thay đổi sàn giao dịch.

Kết quả xác minh

ATR của trailing stop được FROZEN tại thời điểm vào lệnh (self._entry_atr, được ghi nhận trong should_enter / khi nhận vị thế) và không bao giờ được làm mới, nên khoảng cách trailing là 3.033 x ATR-tại-thời-điểm-vào-lệnh thay vì 3.033 x ATR(14) hiện tại. Chiến lược gốc futures đã được promote (BtcDualTimeframeMomentumConfluenceLS4H) điều chỉnh trailing của nó theo CURRENT ATR mỗi thanh. Cách diễn đạt của giả thuyết ('trailing stop ATR(14) ở mức 3.033x ATR tính từ mức cực trị đang chạy') vẫn được thỏa mãn trong cả hai trường hợp, và vì _extreme là đơn điệu nên mức stop vẫn chỉ điều chỉnh tăng lên, nên đây không phải là một lỗi về tính đúng đắn — nhưng khi biến động mở rộng sau khi vào lệnh, mức stop thực tế sẽ chặt hơn so với chiến lược gốc, đây là một sự khác biệt hành vi thực sự so với chiến lược được cho là chuyển đổi 'nguyên văn' (verbatim).

Kết quả xác minh

Thiết lập trạng thái giao dịch từ khớp lệnh (fill) (on_order_filled / thanh đầu tiên có vị thế mở) thay vì bên trong should_enter, hoặc đặt lại (reset) nó một cách phòng thủ ở đầu calculate_signal trước khi tra cứu vị thế.

Kết quả xác minh

should_enter() làm thay đổi trạng thái giao dịch (_in_long = True, _extreme, _entry_atr) BEFORE khi template gốc đã định cỡ lệnh và áp dụng cổng giá trị danh nghĩa tối thiểu (min-notional gate). Nếu position_size() trả về 0 hoặc kiểm tra giá trị danh nghĩa tối thiểu $10 làm loại bỏ lệnh vào, chiến lược sẽ bị đánh dấu là đang ở trạng thái long với trailing đã được kích hoạt trong khi thực tế đang flat (không có vị thế). Trên thực tế, điều này tự khắc phục ở thanh tiếp theo (calculate_signal thấy vị thế là None và đặt lại các cờ, và should_exit không bao giờ được chạm tới khi đang flat), nên không có lỗi hành vi nào quan sát được — nhưng bất biến (invariant) này khá mong manh nếu đường dẫn thoát lệnh (exit path) từng bị thay đổi.

Kết quả xác minh

Không cần sửa để đảm bảo tính đúng đắn. Nếu muốn tiêu thụ chính xác trong cùng một thanh, hãy tính lại _slow_dir một cách lazily từ self._extra_bars[...] bên trong calculate_signal thay vì cache nó trong on_extra_bar.

Kết quả xác minh

Độ trễ một thanh (one-bar latency) trên chân theo ngày: thanh DAILY và thanh 4H cuối cùng trong ngày có cùng dấu thời gian đóng (close timestamp). Nếu engine gửi thanh chính 4H trước, _maybe_process_primary() sẽ chạy và đóng dấu _last_processed_ts, và cập nhật _slow_dir của thanh theo ngày (đến cùng dấu thời gian) chỉ được tiêu thụ từ thanh NEXT 4H. Đây là cách xử lý thận trọng (nó chỉ có thể làm trễ một tín hiệu, không bao giờ để lộ dữ liệu tương lai), nhưng điều này có nghĩa là điều kiện thoát khi chế độ theo ngày bị phá vỡ có thể kích hoạt trễ tới 4 giờ sau khi đóng ngày trong khoảng một nửa số trường hợp, và tính nhất quán giữa backtest/paper phụ thuộc vào việc thứ tự gửi dữ liệu phải ổn định.

Kết quả xác minh

Triển khai trung thực, nhưng có ba điều mà nhà phân tích nên cân nhắc trên toàn bộ lịch sử: (1) chi phí round-trip trên spot là ~0.20% so với ~0.10% của chiến lược gốc futures, nên cùng một biên lợi thế gộp (gross edge) sẽ ròng lại chỉ còn khoảng một nửa — sandbox đã cho thấy hoa hồng chiếm 10.03% giá trị gộp; (2) vector tham số (fast 18 / slow 15 / trail 3.033) được chọn bởi một lần chạy tối ưu hóa trên một DIFFERENT sàn giao dịch, tổ hợp khung thời gian và tập hướng giao dịch (LONG/SHORT futures) khác, nên đây là một sự chuyển giao ngoài mẫu (out-of-sample), không phải một cấu hình đã được tối ưu — Sharpe trong sandbox là 0.527 với sharpe_ci_low -0.233 và information_ratio -0.760 so với benchmark, tức là một danh mục BTC chỉ mua (long-only) kém hiệu quả hơn việc nắm giữ BTC trong cửa sổ smoke test; (3) việc bỏ chân short làm mất đi khoảng một nửa tổng số giao dịch của chiến lược gốc (250 giao dịch, toàn bộ là long, 43.6% mức độ tiếp xúc), nên Sharpe thực tế nên được kỳ vọng thấp hơn đáng kể so với mức 1.99 của chiến lược gốc, thay vì gần bằng. Điều đầu tiên cần kiểm tra trên backtest thực: avg_trade_return_pct so với ngưỡng sàn spot 0.25% (sandbox cho thấy 0.82%, nhưng cửa sổ đó không bao gồm 2017 và chỉ kéo dài 2401 ngày) và liệu tam phân vị biến động 'bình thường' (-8.77% trong sandbox) có tiếp tục âm trên toàn bộ lịch sử hay không.

Đánh giá backtest

314 giao dịch đã đóng trong 3146 ngày (2017-08 → 2026-03), metrics_reliable=true, entry_diag 314/314 lệnh vào được gửi với 0 bị loại bỏ.

Đánh giá backtest

Các giao dịch triển khai đúng giả thuyết: toàn bộ 314 LONG / 0 short (thu gọn CASH đúng của LONG/FLAT/SHORT thuộc chiến lược gốc), tỷ lệ giá trị danh nghĩa/vốn tối đa 0.50 so với mức trần 0.497, thời gian nắm giữ trung bình 4ngày8giờ và mức độ tiếp xúc 43.6% tái hiện lại chiến lược gốc futures.

Đánh giá backtest

avg_trade_return_pct 1.20% so với round trip ~0.20% BINANCE_SPOT; hoa hồng chỉ chiếm 8.97% giá trị gộp, tác động 4.33% — không nhạy cảm với phí (not fee-marginal).

Đánh giá backtest

max_drawdown 10.3% (dưới mức mặc định spot 15%), PF 1.41, payoff 2.07 với tỷ lệ thắng 40.4% (hình dạng xu hướng đúng), tam phân vị biến động căng thẳng (stressed) +28.0%.

Đánh giá backtest

Mức độ tập trung cực cao: top 10 trong số 314 giao dịch = 93.8% tổng lợi nhuận mỗi giao dịch cộng dồn, top 20 = 141% (các giao dịch 21–314 âm ròng).

Đánh giá backtest

Chỉ có 6/10 năm dương lịch dương — đúng ở ngưỡng sàn cứng — và cả hai năm gần đây nhất đều âm (2025 −10.5%, 2026 −9.9%).

Đánh giá backtest

Sharpe 0.664 với sharpe_ci_low 0.0042 và PSR 0.924 (<0.95): đã ở mức biên (marginal) ngay cả trước ngưỡng chọn lọc ~225-lần thử.

Đánh giá backtest

Mối lo ngại của QA được xác nhận một phần: tam phân vị biến động 'bình thường' vẫn âm (−7.70%, 16.1% DD), information_ratio −0.757, alpha chỉ +2.4%/năm — chiến lược này kém hiệu quả hơn việc nắm giữ BTC, và benchmark_meaningful=true nên khoản thiếu hụt đó là có thật.

Đánh giá backtest

Các tham số là một sự chuyển giao ngoài mẫu (out-of-sample) từ một sàn giao dịch/tập hướng giao dịch khác — chưa được tinh chỉnh (untuned) chứ không phải overfit, nhưng cũng chưa được kiểm chứng ở đây.
Báo cáo chiến lược

Stratmill là công cụ nghiên cứu và giao dịch thử nghiệm (paper trading), không phải lời khuyên tài chính hay một nhà môi giới. Kết quả kiểm thử ngược và giao dịch thử nghiệm chỉ mang tính giả định. Giao dịch tiềm ẩn rủi ro thua lỗ.