Chiến lược giao dịch định lượng theo xu hướng lưới động

Tác giả:ChaoZhang, Ngày: 2024-03-22 16:03:09
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch định lượng theo xu hướng lưới động tiên tiến. Ý tưởng chính của chiến lược này là chia nhiều đường lưới trong một phạm vi giá đã được đặt trước và tự động mở các vị trí khi giá chạm vào đường lưới và đóng các vị trí khi bán, do đó hưởng lợi từ thị trường biến động. Đồng thời, chiến lược này cũng có chức năng điều chỉnh động vị trí của các đường lưới, có thể tối ưu hóa bố cục lưới theo xu hướng giá gần đây.

Nguyên tắc chiến lược

Các nguyên tắc cốt lõi của chiến lược này là như sau:

  1. Đầu tiên, xác định ranh giới trên và dưới của lưới và số lượng các đường lưới dựa trên cài đặt của người dùng. ranh giới có thể là giá trị cố định hoặc tự động tính toán dựa trên mức cao và thấp gần đây hoặc trung bình động.

  2. Trong ranh giới được xác định, chia phạm vi giá thành một số lưới. Mỗi đường lưới tương ứng với giá mua hoặc bán.

  3. Khi giá chạm vào mỗi đường lưới, chiến lược sẽ kiểm tra xem vị trí tương ứng với đường lưới đã được giữ chưa. Nếu không, nó sẽ mở một vị trí và mua, nếu có, nó sẽ đóng vị trí và bán.

  4. Bằng cách bán ở các vị trí tương đối cao và mua ở các vị trí thấp, chiến lược có thể liên tục kiếm lợi nhuận khi giá dao động.

  5. Đồng thời, nếu người dùng bật chức năng điều chỉnh ranh giới tự động, vị trí của các đường lưới sẽ được điều chỉnh thích nghi theo mức giá cao và thấp gần đây hoặc trung bình động được đặt để tối ưu hóa bố trí lưới.

Thông qua các nguyên tắc trên, chiến lược này có thể nhận ra tự động mua thấp và bán cao trong xu hướng giá dao động, và điều chỉnh điểm lợi nhuận theo xu hướng, do đó cải thiện lợi nhuận tổng thể.

Phân tích lợi thế

Chiến lược lưới năng động này có những lợi thế sau:

  1. Khả năng thích nghi mạnh: Nó có thể thích nghi với các thị trường và giống khác nhau thông qua cài đặt tham số và có khả năng thích nghi tốt với thị trường biến động.

  2. Mức độ tự động hóa cao. Vì chiến lược dựa trên logic toán học nghiêm ngặt và các điểm mở và đóng vị trí rõ ràng, nó có thể đạt được giao dịch tự động hoàn toàn và giảm can thiệp cảm xúc chủ quan.

  3. Rủi ro có thể kiểm soát: Bằng cách thiết lập các tham số như số lượng lưới và ranh giới lưới, việc tiếp xúc với rủi ro của mỗi giao dịch có thể được kiểm soát hiệu quả, do đó duy trì rủi ro tổng thể trong phạm vi chấp nhận được.

  4. Khả năng thích nghi với xu hướng: Chức năng điều chỉnh năng động ranh giới lưới được thêm vào chiến lược, để lưới có thể theo dõi xu hướng giá và được tối ưu hóa, cải thiện lợi nhuận trong các thị trường xu hướng.

  5. Tỷ lệ thắng ổn định. Vì giao dịch lưới chủ yếu thường xuyên ném cao và hút thấp trong biến động giá, miễn là giá duy trì biến động, chiến lược này có thể tiếp tục kiếm lợi nhuận, vì vậy nó có tỷ lệ thắng cao trong thời gian dài.

Phân tích rủi ro

Mặc dù chiến lược này có những lợi thế rõ ràng, nó cũng có một số rủi ro:

  1. Rủi ro xu hướng: Nếu giá vượt qua ranh giới lưới với xu hướng đơn phương mạnh mẽ, không gian lợi nhuận của chiến lược này sẽ bị hạn chế và nó có thể phải đối mặt với một sự thoái lui lớn.

  2. Khó khăn trong tối ưu hóa tham số. Chiến lược này có nhiều tham số, bao gồm số lượng lưới, ranh giới ban đầu, tham số ranh giới động, v.v. Sự kết hợp các tham số khác nhau có tác động lớn đến hiệu suất chiến lược và khó khăn tối ưu hóa thực tế không nhỏ.

  3. Giao dịch thường xuyên: Chiến lược lưới chủ yếu là một chiến lược tần suất cao, với việc mở và đóng các vị trí rất thường xuyên, có nghĩa là chi phí giao dịch cao hơn và rủi ro trượt tiềm năng.

  4. Sự phụ thuộc mạnh vào điều kiện thị trường. Chiến lược này phụ thuộc rất nhiều vào thị trường biến động. Một khi giá đi vào một xu hướng đơn phương nhanh chóng, chiến lược này có khả năng phải đối mặt với một sự thoái lui lớn.

Do những rủi ro này, có thể cải thiện từ các khía cạnh sau: thêm các chỉ số đánh giá xu hướng như là điều kiện lọc cho việc khởi động chiến lược, tối ưu hóa không gian và phương pháp tìm kiếm tham số, giới thiệu quản lý quỹ và logic kiểm soát vị trí, tăng logic đóng cửa xu hướng, v.v. Thông qua các tối ưu hóa này, độ vững chắc và lợi nhuận của chiến lược này có thể được cải thiện hơn nữa.

Hướng tối ưu hóa

Dựa trên phân tích trên, các hướng tối ưu hóa của chiến lược này chủ yếu bao gồm:

  1. Giới thiệu các điều kiện lọc xu hướng. Thêm các chỉ số đánh giá xu hướng trước khi chiến lược bắt đầu, chẳng hạn như đường trung bình động, ADX, vv. Chỉ bắt đầu chiến lược trong điều kiện thị trường biến động, và tiếp tục theo dõi các thị trường xu hướng để tránh hiệu quả rủi ro giảm giá trong các thị trường xu hướng.

  2. Tối ưu hóa tìm kiếm tham số. Sử dụng các thuật toán thông minh để tối ưu hóa các tham số lưới, chẳng hạn như thuật toán di truyền, thuật toán bầy hạt, vv, để tự động tìm ra sự kết hợp tham số tối ưu và cải thiện hiệu quả và chất lượng tối ưu hóa.

  3. Cải thiện logic kiểm soát rủi ro. Thêm logic kiểm soát rủi ro vào chiến lược, chẳng hạn như điều chỉnh chiều rộng lưới theo biến động giá, đặt ngưỡng khôi phục tối đa để kích hoạt đóng cửa, v.v., để kiểm soát tốt hơn rủi ro.

  4. Thiết lập đường dừng lỗ xu hướng. Thiết lập một đường dừng lỗ đột phá xu hướng, chẳng hạn như một tỷ lệ phần trăm nhất định của ranh giới lưới. Một khi giá vượt qua đường dừng lỗ, đóng tất cả các vị trí để tránh sự thoái lui lớn trong thị trường xu hướng.

  5. Tối ưu hóa việc thực hiện giao dịch. Tối ưu hóa liên kết thực hiện giao dịch, chẳng hạn như áp dụng các loại lệnh và thuật toán lệnh tiên tiến hơn, giảm thiểu tần suất và chi phí giao dịch và cải thiện hiệu quả thực thi.

Thông qua tối ưu hóa trên, khả năng thích nghi, độ bền và lợi nhuận của chiến lược này có thể được cải thiện toàn diện, làm cho nó gần hơn với nhu cầu giao dịch thực tế.

Tóm lại

Nói chung, chiến lược theo xu hướng lưới động này là một chiến lược giao dịch định lượng tần số trung bình đến cao dựa trên nguyên tắc giao dịch lưới, và tích hợp các cơ chế điều chỉnh và thích nghi xu hướng năng động. Những lợi thế của nó nằm trong khả năng thích nghi mạnh mẽ, mức độ tự động hóa cao, rủi ro có thể kiểm soát được, khả năng thích nghi xu hướng tốt và tỷ lệ thắng ổn định. Đồng thời, nó cũng có những rủi ro như rủi ro xu hướng, khó khăn trong tối ưu hóa tham số, giao dịch thường xuyên và phụ thuộc mạnh vào điều kiện thị trường.

Khái niệm giao dịch lưới tự nó là một phương pháp định lượng tương đối trưởng thành và thực tế. Thông qua việc thêm các cơ chế tối ưu hóa năng động và thích nghi xu hướng vào chiến lược này, những lợi thế của giao dịch lưới cổ điển đã được mở rộng và phát triển. Nó cung cấp cho các nhà đầu tư một ý tưởng giao dịch định lượng mới và khả năng trong thị trường biến động. Với việc tối ưu hóa và cải thiện hơn nữa, chiến lược này dự kiến sẽ trở thành một công cụ giao dịch định lượng tần số trung bình đến cao tuyệt vời.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds    = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool)                             // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc      = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"])     // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev      = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1)  // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound    = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float)                      // for manual grid bounds only. The upperbound price of your grid
i_lowerBound    = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float)                      // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty       = input(group="Grid Lines",  title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer)       // how many grid lines are in your grid

f_getGridBounds(_bs, _bl, _bd, _up) =>
    if _bs == "Hi & Low"
        _up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl)  * (1 - _bd)
    else
        avg = sma(close, _bl)
        _up ? avg * (1 + _bd) : avg * (1 - _bd)

f_buildGrid(_lb, _gw, _gq) =>
    gridArr = array.new_float(0)
    for i=0 to _gq-1
        array.push(gridArr, _lb+(_gw*i))
    gridArr

f_getNearGridLines(_gridArr, _price) =>
    arr = array.new_int(3)
    for i = 0 to array.size(_gridArr)-1
        if array.get(_gridArr, i) > _price
            array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
            array.set(arr, 1, i == 0 ? i : i-1)
            break
    arr

var upperBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound  // upperbound of our grid
var lowerBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth       = (upperBound - lowerBound)/(i_gridQty-1)                                                       // space between lines in our grid
var gridLineArr     = f_buildGrid(lowerBound, gridWidth, i_gridQty)                                                 // an array of prices that correspond to our grid lines
var orderArr        = array.new_bool(i_gridQty, false)                                                              // a boolean array that indicates if there is an open order corresponding to each grid line

var closeLineArr    = f_getNearGridLines(gridLineArr, close)                                                        // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
    if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
        buyId = i
        array.set(orderArr, buyId, true)
        strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
    if close > array.get(gridLineArr, i) and i != 0
        if array.get(orderArr, i-1)
            sellId = i-1
            array.set(orderArr, sellId, false)
            strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))

if i_autoBounds
    upperBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
    lowerBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
    gridWidth   := (upperBound - lowerBound)/(i_gridQty-1)
    gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)

closeLineArr    := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)







Thêm nữa