• 24ºC, Rain
  • Wednesday, 21st January, 2026
  • Trang Chủ
  • Bộ Lọc
  • Nhận Định Thị Trường
  • Phân Tích Doanh Nghiệp
  • Amibroker
    • Code AFL
    • Tự học Amibroker
  • Kiến Thức Đầu Tư
    • Chỉ Báo Kỹ Thuật
    • Phân Tích Cơ Bản
    • Phương Pháp Sóng Elliot
    • Phương Pháp Wyckoff/VSA
    • Vĩ Mô Liên Thị Trường
  • Liên hệ
  • Giới Thiệu
Mới Nhất
  • Phân tích VN-Index ngày 11/08
  • Phân tích HAH
  • Bài 46: Trở thành nhà giao dịch chuyên nghiệp
  • Bài 45: GFX Functions – Bảng trạng thái giao dịch Amibroker
  1. Trang chủ
  2. Amibroker
  3. Tự học Amibroker
  4. Bài 29: BackTesting – 52 week high breakout strategy
Bài 29: BackTesting – 52 week high breakout strategy

Xem nhanh:

  • Xây Dựng, Backtest và Giải Quyết Vấn Đề Repainting Trong Amibroker AFL
  • 1. Xây Dựng Chiến Lược Đơn Giản: “Phá Vỡ Cao Nhất Trong 1 Năm”
  • 2. Thiết Lập Backtesting Trong Amibroker
  • 3. Đánh Giá Kết Quả Backtesting (Report)
  • 4. Giải Quyết Vấn Đề Repainting (Vẽ Lại Tín Hiệu)

Tuyệt vời! Đây là một bài viết chuyên sâu về việc xây dựng, backtest một chiến lược đơn giản và quan trọng hơn là xử lý vấn đề repainting (vẽ lại tín hiệu) trong Amibroker AFL. Dưới đây là bài viết chuẩn SEO và các từ khóa liên quan.

Xây Dựng, Backtest và Giải Quyết Vấn Đề Repainting Trong Amibroker AFL

Chào các bạn! Chúng ta sẽ đi sâu vào việc xây dựng và kiểm thử một chiến lược giao dịch đơn giản trong Amibroker Formula Language (AFL). Quan trọng hơn, chúng ta sẽ tìm hiểu một trong những vấn đề đau đầu nhất trong backtesting: Repainting (Vẽ lại tín hiệu) và cách khắc phục nó để đảm bảo kết quả kiểm thử chính xác và đáng tin cậy.

1. Xây Dựng Chiến Lược Đơn Giản: “Phá Vỡ Cao Nhất Trong 1 Năm”

Đây là một chiến lược theo xu hướng cơ bản, được thiết kế để nắm bắt các đột phá lớn.

Logic chiến lược:

  • Tín hiệu MUA (Buy Signal): Khi giá đóng cửa (Close) phá vỡ lên trên đỉnh cao nhất của 52 tuần (1 năm giao dịch) trước đó. Để tạo ra tín hiệu mua trên thanh nến hiện tại mà không bị kéo theo giá trị cao nhất thay đổi, chúng ta sẽ dịch chuyển đường biên trên xuống 1 bar.
  • Tín hiệu BÁN (Sell Signal): Khi Đường trung bình động EMA 20 cắt lên trên giá thấp nhất (Low) của nến.

Phân tích code AFL cơ bản:

// Phần 1: Cài đặt Biểu đồ
Plot(C, "Candlestick", colorBlack, styleCandle); // Vẽ nến Nhật

// Phần 2: Tính toán các dải (Band)
// GrafSpace để điều chỉnh khoảng cách biểu đồ (có thể dùng Param() để làm tham số)
GraphSpace = Param("Graph Space", 0, -100, 100, 1);

// Upper Band (Đỉnh cao nhất 52 tuần) và Lower Band (Đáy thấp nhất 52 tuần)
UpperBand = HHV(High, 252); // 252 ngày giao dịch ~ 1 năm
LowerBand = LLV(Low, 252);   // 252 ngày giao dịch ~ 1 năm

// Phần 3: Định nghĩa Tín hiệu Mua/Bán
Buy = Cross(Close, Ref(UpperBand, -1)); // Mua khi Close vượt qua UpperBand đã dịch chuyển 1 bar xuống (-1)
Sell = Cross(EMA(Close, 20), Close);      // Bán khi EMA 20 cắt lên Close

// Phần 4: Định nghĩa Giá Mua/Bán (đơn giản hóa)
BuyPrice = Close;  // Mua tại giá đóng cửa của nến tín hiệu
SellPrice = Close; // Bán tại giá đóng cửa của nến tín hiệu

// (Tùy chọn) Hàm ValueWhen: Giữ giá trị cho đến khi có tín hiệu mới
// Hàm ValueWhen() rất hữu ích trong backtesting. Ví dụ:
// BuyPrice = ValueWhen(Buy, Close); // Nếu có Buy, lấy Close. Giữ giá trị này cho đến Buy tiếp theo.

// Phần 5: Vẽ các đường chỉ báo
Plot(EMA(Close, 20), "EMA 20", colorRed, styleLine);
Plot(UpperBand, "Upper Band", colorGreen, styleLine);
Plot(LowerBand, "Lower Band", colorBlue, styleLine);

// Phần 6: Vẽ các tín hiệu Mua/Bán trên biểu đồ
// Tín hiệu Mua là mũi tên xanh hướng lên dưới đáy nến
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone), colorGreen, 0, Low, 0);
// Tín hiệu Bán là mũi tên đỏ hướng xuống trên đỉnh nến
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed, 0, High, 0);
Kết quả

Kết quả

Ví dụ

Ví dụ

2. Thiết Lập Backtesting Trong Amibroker

Sau khi có code, chúng ta cần thiết lập các tùy chọn backtesting trong cửa sổ Analysis (phím tắt Alt + A).

Cửa sổ setting

Cửa sổ setting

Cửa sổ setting

Cửa sổ setting

  • Date Range (Phạm vi ngày): Chọn khoảng thời gian dữ liệu bạn muốn kiểm thử.
  • Apply to (Áp dụng cho): Chọn các công cụ (mã cổ phiếu) mà bạn muốn kiểm thử chiến lược. Có thể chọn tất cả, đang hiển thị, hoặc từ một Watchlist cụ thể.
  • Backtesting Settings (Cài đặt Backtesting):
    • Periodicity (Chu kỳ): Khung thời gian của dữ liệu (Daily, Weekly, Hourly,…). Chiến lược này dùng Daily.
    • Positions (Vị thế): Chọn “Long Only” (Chỉ Mua) hoặc “Short Only” (Chỉ Bán) hoặc “Long & Short”.
    • Initial Equity (Vốn ban đầu): Số vốn khởi điểm cho backtest (ví dụ: 50,000 USD).
    • Commission (Phí giao dịch): Cấu hình phí môi giới theo phần trăm hoặc theo số tiền cố định.
    • Margin (Ký quỹ): Nếu giao dịch ký quỹ, nhập tỷ lệ đòn bẩy. 100 nghĩa là không sử dụng ký quỹ.
    • Buy/Sell/Short Cover/Cover Delays: Quan trọng! Cho phép bạn trì hoãn việc vào/ra lệnh sang thanh nến kế tiếp. Ví dụ: Buy Delay = 1 sẽ thực hiện lệnh mua ở giá mở cửa của nến tiếp theo sau khi tín hiệu xuất hiện.
    • Stops (Dừng lỗ/Chốt lời): Cấu hình các loại dừng lỗ/chốt lời mặc định như Profit Target (chốt lời), Stop Loss (cắt lỗ), Trailing Stop (dừng lỗ theo sau), N-bar Stop (thoát lệnh sau N bar).
      • Nên ưu tiên cấu hình các loại stop này trực tiếp trong code AFL của bạn để có sự kiểm soát chính xác nhất, nhưng Amibroker cũng cung cấp các tùy chọn cơ bản ở đây.

3. Đánh Giá Kết Quả Backtesting (Report)

Sau khi chạy backtest, bạn sẽ nhận được một báo cáo chi tiết. Một số chỉ số quan trọng cần chú ý:

kết quả backtest

kết quả backtest

Báo cáo về backtest

Báo cáo về backtest

  • Net Profit/Loss (Lợi nhuận/Thua lỗ ròng): Tổng lợi nhuận/thua lỗ sau tất cả các giao dịch.
  • CAGR (Compound Annual Growth Rate): Tỷ suất sinh lời kép hàng năm.
  • Max Drawdown (Sụt giảm vốn tối đa): Mức sụt giảm lớn nhất từ đỉnh vốn chủ sở hữu. Một hệ số quan trọng để đánh giá rủi ro.
  • Recovery Factor (Hệ số phục hồi): Khả năng hệ thống phục hồi sau các đợt sụt giảm.
  • Sharpe Ratio: Đo lường lợi nhuận điều chỉnh theo rủi ro. Nên > 1.
  • Profit per year/month/week: Lợi nhuận theo từng khoảng thời gian.
  • Winning/Losing Trades: Số lượng giao dịch thắng/thua.

Lưu ý: Chiến lược “Phá vỡ Cao nhất 1 năm” trong ví dụ có thể không sinh lời (-17% trong ví dụ). Đây là điều hoàn toàn bình thường trong backtesting; mục tiêu là học cách đánh giá và cải thiện.

Trực quan hóa giao dịch: Bạn có thể xem chi tiết từng giao dịch bằng cách click chuột phải vào biểu tượng cổ phiếu trên báo cáo backtest và chọn Tools -> Show report charts hoặc Show trades in symbol chart.

4. Giải Quyết Vấn Đề Repainting (Vẽ Lại Tín Hiệu)

Repainting là một vấn đề nghiêm trọng trong backtesting, xảy ra khi một chỉ báo hoặc tín hiệu thay đổi giá trị lịch sử của nó khi có dữ liệu mới xuất hiện. Điều này làm cho kết quả backtest trông đẹp hơn thực tế, vì tín hiệu có vẻ “hoàn hảo” trong quá khứ nhưng lại không xuất hiện (hoặc xuất hiện khác) trong giao dịch thời gian thực.

Tại sao Repainting xảy ra? Trong chiến lược của chúng ta, UpperBand = HHV(High, 252); có thể gây repainting. HHV tính giá cao nhất trong 252 bar tính từ bar hiện tại về trước. Nếu bạn tính UpperBand[i] dựa trên High[i], khi một bar mới xuất hiện và High của nó cao hơn tất cả các bar trước đó trong 252 bar, giá trị UpperBand của các bar quá khứ cũng có thể bị “vẽ lại” để khớp với đỉnh mới này, làm sai lệch tín hiệu buy trong lịch sử.

Giải pháp cho Repainting: Dịch chuyển tín hiệu bằng Ref()

Cách khắc phục phổ biến là dịch chuyển tín hiệu mua/bán sang thanh nến kế tiếp bằng hàm Ref() và thực hiện lệnh tại giá mở cửa của nến đó. Điều này đảm bảo rằng tín hiệu được đưa ra dựa trên dữ liệu đã đóng cửa hoàn toàn của thanh nến trước.

  1. Dịch chuyển tín hiệu Buy/Sell: Thay vì Buy = Cross(Close, Ref(UpperBand, -1));, chúng ta sẽ dịch chuyển toàn bộ tín hiệu Buy/Sell.

    // Dịch chuyển tín hiệu sang nến tiếp theo
    
    Buy = ExRem(Buy,Sell);
    Sell = ExRem(Sell,Buy);
    
    Buy = Ref(Buy,-1);
    Sell = Ref(Sell,-1);
    
    • Ref(..., -1): Dịch chuyển giá trị về phía trước 1 bar. Tức là, nếu điều kiện Cross xảy ra ở bar i, thì tín hiệu Buy sẽ chỉ được ghi nhận ở bar i+1.
  2. Thực hiện lệnh tại giá Mở cửa (Open Price): Khi tín hiệu được dịch chuyển sang nến tiếp theo, lệnh phải được thực hiện ngay lập tức. Giá tốt nhất để làm điều này là giá mở cửa của nến tiếp theo.

    BuyPrice = Open;  // Mua tại giá mở cửa của nến có tín hiệu Buy
    SellPrice = Open; // Bán tại giá mở cửa của nến có tín hiệu Sell
    
Ví dụ

Ví dụ

Lợi ích của việc giải quyết Repainting:

  • Kết quả Backtest chính xác: Phản ánh đúng hiệu suất của chiến lược trong môi trường thực.
  • Đáng tin cậy trong Live Trading: Tín hiệu bạn thấy trên biểu đồ lịch sử sẽ khớp với tín hiệu bạn nhận được trong thời gian thực.
  • Giảm thiểu Overfitting: Tránh được việc điều chỉnh chiến lược dựa trên những tín hiệu ảo.

Việc nắm vững cách xây dựng, backtest và giải quyết vấn đề repainting là những kỹ năng cốt lõi để phát triển các chiến lược giao dịch tự động đáng tin cậy và hiệu quả trong Amibroker.

  • trancotam
❮ Prev Next ❯
Chia sẻ: Facebook WhatsApp Twitter
Chia sẻ với ứng dụng khác

Tin Xem Nhiều

Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư (Phần 1)
Chỉ Báo Kỹ Thuật
Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư…
21 Tháng 5, 2025
Phân tích BFC
Phân Tích Doanh Nghiệp
Phân tích BFC
14 Tháng 7, 2025
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
Tự học Amibroker
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
22 Tháng 6, 2025
Phân tích HAH
Phân Tích Doanh Nghiệp
Phân tích HAH
15 Tháng 7, 2025
Bảng công cụ phân tích thị trường
Chưa phân loại
Bảng công cụ phân tích thị trường
13 Tháng 5, 2025
Donation
Phóng to ảnh

TADOSO là nền tảng chia sẻ kiến thức và kinh nghiệm đầu tư tài chính, đặc biệt trong lĩnh vực chứng khoán, nhằm kết nối và nâng cao tư duy cho nhà đầu tư cá nhân tại Việt Nam. Với triết lý "Tạo dựng – Đồng hành – Sở hữu", TADOSO hướng đến xây dựng cộng đồng học hỏi minh bạch, trung lập, không bị chi phối bởi tổ chức tài chính nào.

Newsletter

Hãy để lại mail để chúng tôi có thể phục vụ bạn tốt hơn

Donation - Buy me a coffee

Donation

Copyright © All rights reserved | This template is made with by Tran Co Tam

  • Terms of use
  • Privacy Policy
  • Contact
Zalo Messenger
×

Liên hệ