CÁCH THÊM CHỈ SỐ DO NGƯỜI DÙNG ĐỊNH NGHĨA VÀO BÁO CÁO KIỂM TRA / TỐI ƯU HÓA TRONG AMIBROKER

ha.anh
7 Min Read

AmiBroker phiên bản BETA 4.67.x / 4.68.x giới thiệu một giao diện lập trình Backtester danh mục đầu tư hoàn toàn mới, cho phép người dùng kiểm soát toàn diện quá trình kiểm tra chiến lược ở giai đoạn thứ hai (Portfolio-level Backtest). Với hệ thống mở rộng này, người dùng không chỉ thực hiện kiểm tra thông thường, mà còn có thể thêm vào các chỉ số tùy chỉnh, truy cập dữ liệu vốn, danh sách giao dịch, và thực hiện các thao tác phức tạp như điều chỉnh kích thước vị thế theo vốn danh mục.

🔧 Những khả năng chính được hỗ trợ:

  • Thêm chỉ số do người dùng định nghĩa (Custom Metrics): xuất hiện trong kết quả kiểm tra, tối ưu hóa, báo cáo thống kê và bảng giao dịch.

  • Truy cập giá trị vốn theo thời gian thực, cho phép điều chỉnh kích thước vị thế theo vốn.

  • Đọc/ghi vào tiền mặt danh mục.

  • Truy cập danh sách giao dịch đang mở / đã đóng, bao gồm các thuộc tính như MAE, MFE, số nến đã qua, lợi nhuận, v.v.

  • 3 cấp độ can thiệp:

    • Cấp cao: Backtest() – lý tưởng để thêm chỉ số tuỳ chỉnh.

    • Cấp trung: PreProcess(), ProcessTradeSignal(), PostProcess() – tốt cho xử lý tín hiệu.

    • Cấp thấp: kiểm soát toàn bộ quá trình với các hàm EnterTrade(), ExitTrade(), HandleStops()

🧮 Ví dụ 1: Thêm Expectancy ($) vào báo cáo kiểm tra

Expectancy là chỉ số thể hiện lợi nhuận kỳ vọng trung bình trên mỗi giao dịch. Công thức đơn giản:

ini

Copy code

Expectancy = (% Win * Lợi nhuận trung bình) + (% Loss * Lỗ trung bình)


🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc(“”);

 

if (Status(“action”) == actionPortfolio)

{

    bo = GetBacktesterObject();

    bo.Backtest();

 

    st = bo.GetPerformanceStats(0);

 

    expectancy = st.GetValue(“WinnersAvgProfit”) * st.GetValue(“WinnersPercent”) / 100

               + st.GetValue(“LosersAvgLoss”) * st.GetValue(“LosersPercent”) / 100;

 

    bo.AddCustomMetric(“Expectancy ($)”, expectancy);

}

 

// Hệ thống giao dịch

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

 

✅ Kết quả:

  • Chỉ số “Expectancy ($)” xuất hiện trong tab báo cáo và danh sách kết quả tối ưu.

  • Có thể sắp xếp theo chỉ số này, và hiển thị đồ thị 3D trong cửa sổ tối ưu hóa.

🧮 Ví dụ 2: Expectancy tính theo lợi nhuận % trên mỗi $100 đầu tư

Phương pháp trước có thể không chính xác nếu sử dụng kích thước vị thế biến thiên. Giải pháp là tính kỳ vọng lợi nhuận tính trên mỗi $100 đầu tư.

🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc(“”);

 

if (Status(“action”) == actionPortfolio)

{

    bo = GetBacktesterObject();

    bo.Backtest();

 

    SumProfitPer100Inv = 0;

    NumTrades = 0;

 

    for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())

    {

        SumProfitPer100Inv += trade.GetPercentProfit();

        NumTrades++;

    }

 

    for (trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos())

    {

        SumProfitPer100Inv += trade.GetPercentProfit();

        NumTrades++;

    }

 

    expectancy2 = SumProfitPer100Inv / NumTrades;

 

    bo.AddCustomMetric(“Expectancy (per $100 inv.)”, expectancy2);

}

 

// Hệ thống giao dịch

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

 

✅ Kết quả:

  • Expectancy thực tế hơn trong các hệ thống có tái đầu tư hoặc quản lý vốn linh hoạt.

🧮 Ví dụ 3: Expectancy theo rủi ro (R-multiple)

Theo Van Tharp, expectancy nên tính theo lợi nhuận kỳ vọng trên mỗi đơn vị rủi ro (1R), trong đó:

ini

Copy code

1R = số tiền tối đa bạn có thể mất trong giao dịch đó.

 

Ví dụ: nếu bạn đặt dừng lỗ tại 10%, thì 1R = 10% * vốn đầu tư vào giao dịch.

🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc(“”);

MaxLossPercentStop = 10;

 

if (Status(“action”) == actionPortfolio)

{

    bo = GetBacktesterObject();

    bo.Backtest(1);  // 1 = không tạo danh sách giao dịch mặc định

 

    SumProfitPerRisk = 0;

    NumTrades = 0;

 

    for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())

    {

        Risk = (MaxLossPercentStop / 100) * trade.GetEntryValue();

        RMultiple = trade.GetProfit() / Risk;

 

        trade.AddCustomMetric(“Rủi ro ban đầu $”, Risk);

        trade.AddCustomMetric(“R-Multiple”, RMultiple);

 

        SumProfitPerRisk += RMultiple;

        NumTrades++;

    }

 

    expectancy3 = SumProfitPerRisk / NumTrades;

 

    bo.AddCustomMetric(“Expectancy (theo rủi ro)”, expectancy3);

    bo.ListTrades();

}

 

// Hệ thống giao dịch

ApplyStop(stopTypeLoss, stopModePercent, MaxLossPercentStop);

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

 

✅ Kết quả:

  • Thêm 2 chỉ số theo từng giao dịch: Rủi ro ban đầu, R-Multiple.

  • Expectancy cuối cùng phản ánh chính xác hơn hiệu quả của chiến lược theo quan điểm quản lý rủi ro.

📌 Tổng kết

Loại Expectancy Đơn vị tính Phù hợp với
Expectancy ($) USD/giao dịch Kích thước vị thế cố định
Expectancy trên $100 đầu tư % Vốn linh hoạt, gộp lãi
Expectancy theo R-multiple R/giao dịch Quản lý rủi ro chặt chẽ (Van Tharp)

👉 Giao diện kiểm tra danh mục mới trong AmiBroker là một bước tiến lớn, mở rộng khả năng kiểm tra, phân tích, và tùy chỉnh. Việc thêm các chỉ số định nghĩa bởi người dùng không chỉ hỗ trợ đo lường chiến lược chính xác hơn mà còn giúp bạn tối ưu hóa tốt hơn theo các tiêu chí riêng biệt.

 

TAGGED:
Share This Article
Leave a Comment