Chiến lược định lượng trung bình động thích nghi

Tác giả:ChaoZhang, Ngày: 2023-11-17 17:14:36
Tags:

Tổng quan

Chiến lược này dựa trên đường trung bình động, có thể tự động điều chỉnh các tham số và phù hợp với thị trường sóng ở khung thời gian cao. Nó có thể tự động tìm ra sự kết hợp các tham số tối ưu và tạo ra tín hiệu giao dịch khi giá vượt qua đường trung bình động.

Chiến lược logic

Chiến lược này sử dụng một trung bình động thích nghi như là tín hiệu giao dịch. Đầu tiên nó tính toán trung bình động đơn giản (CMA) của giai đoạn được chỉ định (bắt đầu). Sau đó nó kiểm tra các thông số CMA xung quanh giai đoạn, đánh giá sự kết hợp nào có ít chạm nhất theo thân cây nến và nến. Cuối cùng nó sử dụng CMA với ít chạm nhất như đường tín hiệu.

Cụ thể, chiến lược kiểm tra CMA với khoảng thời gian cộng với 1 (CMA_P1) và trừ 1 (CMA_M1), đếm số lần chạm theo cơ thể và vít. Nếu CMA có ít lần chạm hơn CMA_P1 và CMA_M1, sau đó giữ khoảng thời gian hiện tại; nếu CMA_P1 có ít lần chạm, sau đó tăng khoảng thời gian bằng 1; nếu CMA_M1 có ít lần chạm, sau đó giảm khoảng thời gian bằng 1.

Khi giá vượt qua CMA lên, tín hiệu mua được tạo ra; khi giá vượt qua CMA xuống, tín hiệu bán được tạo ra.

Phân tích lợi thế

Chiến lược trung bình động thích nghi này có những lợi thế sau:

  1. Tự động tìm các thông số tối ưu. Không cần phải tự chọn thời gian trung bình động, chiến lược sẽ kiểm tra các giai đoạn khác nhau và tìm ra tối ưu.

  2. Giảm tín hiệu sai. So với MA thời gian cố định, MA thích nghi có thể lọc ra nhiều tiếng ồn hơn và giảm nhiều tín hiệu sai.

  3. Khi thị trường chuyển từ giới hạn đến xu hướng, thời gian MA sẽ tự động tăng để tạo ra tín hiệu; khi thị trường chuyển từ xu hướng sang giới hạn, thời gian MA sẽ tự động giảm. Vì vậy, chiến lược có thể thích nghi năng động với những thay đổi của thị trường.

  4. Đơn giản hóa hệ thống giao dịch. Phương pháp thích nghi này có thể đơn giản hóa toàn bộ hệ thống giao dịch mà không cần tối ưu hóa tham số thủ công.

  5. Khả năng mở rộng tốt. Khái niệm này có thể được áp dụng cho các chỉ số khác như adaptive Bollinger Bands, adaptive KD v.v.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro cần lưu ý cho chiến lược này:

  1. Rủi ro lựa chọn mua. Khi thị trường có một mô hình lựa chọn mua, cơ thể nến có thể không phá vỡ đường MA, dẫn đến các tín hiệu sai. Các điều kiện lọc cần được thêm vào để giảm rủi ro đó.

  2. Rủi ro đột phá thất bại. MA đột phá không phải lúc nào cũng tiếp tục, một số đột phá thất bại có thể xảy ra. Xác nhận đột phá là cần thiết để đảm bảo tỷ lệ thành công cao.

  3. Rủi ro đảo ngược xu hướng. Sự đảo ngược xu hướng sau khi bước vào xu hướng cần phải được chuyển đổi kịp thời, nếu không nó có thể gây ra tổn thất.

  4. Rủi ro tối ưu hóa tham số. Các tham số điều chỉnh thích nghi có thể rơi vào tối ưu hóa cục bộ, dẫn đến MA dư thừa. Các phương pháp đánh giá mô hình cần phải được giới thiệu để tránh vấn đề này.

  5. Rủi ro quá phù hợp. Việc điều chỉnh tham số quá mức có thể dẫn đến quá phù hợp và mất khả năng tổng quát hóa mô hình. Xác minh kéo dài trong các môi trường thị trường khác nhau là cần thiết, không chỉ dựa vào kết quả backtest.

Hướng dẫn cải thiện

Một số hướng để cải thiện chiến lược MA thích nghi này:

  1. Thêm xác nhận đột phá xu hướng thông qua các đột phá liên tiếp để lọc các đột phá sai.

  2. Tăng chiến lược dừng lỗ, dừng lỗ khi giá di chuyển trở lại phía bên kia của MA.

  3. Thêm bộ lọc tùy chọn để tránh tín hiệu sai khi tùy chọn gọi xuất hiện.

  4. Đưa ra các chỉ số đánh giá như IC, LIC, SIC v.v. để hạn chế điều chỉnh tham số và ngăn ngừa quá mức.

  5. Mở rộng đến các chỉ số khác như chiến lược chéo vàng thích nghi, Bollinger Bands thích nghi vv

  6. Tối ưu hóa tính toán MA bằng cách sử dụng MA có trọng lượng, MA theo cấp số nhân v.v. để có được MA mượt mà hơn.

Tóm lại

Chiến lược này tạo ra tín hiệu giao dịch bằng cách điều chỉnh thích nghi thời gian MA để tìm các thông số tối ưu. So với các thông số cố định, nó có thể giảm nhiều tín hiệu sai và thích nghi với những thay đổi của thị trường. Nhưng chúng ta cũng cần phải cảnh giác với những rủi ro tiềm ẩn, và thực hiện xác minh và tối ưu hóa bước đi trước khi áp dụng nó trong giao dịch trực tiếp để có lợi nhuận ổn định.

[/trans]


/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)


Thêm nữa