Chiến lược theo dõi xu hướng trung bình động kép

Tác giả:ChaoZhang, Ngày: 21-12-2023 11:45:35
Tags:

img

Tổng quan

Chiến lược theo dõi xu hướng trung bình động kép là một chiến lược giao dịch định lượng theo dõi xu hướng giá cổ phiếu. Chiến lược này sử dụng hệ thống trung bình động hàm số kép để xác định hướng của xu hướng giá và kết hợp chỉ số ADX để đánh giá sức mạnh của xu hướng, nắm bắt xu hướng giá trong trung hạn đến dài hạn.

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

Chiến lược này chủ yếu dựa trên hệ thống đường trung bình động theo hàm số nhân kép để xác định hướng của xu hướng giá. Chiến lược sử dụng hai EMA nhanh và chậm với các thông số khác nhau, EMA nhanh 1 phản ứng với thay đổi giá nhanh hơn và EMA chậm 2 phản ứng với thay đổi giá chậm hơn. Khi đường nhanh vượt qua đường chậm, đó là tín hiệu mua cho thấy giá đã bắt đầu tăng; khi đường nhanh vượt qua dưới đường chậm, đó là tín hiệu bán cho thấy giá đã bắt đầu giảm.

Ngoài ra, chiến lược cũng giới thiệu chỉ số ADX để đánh giá sức mạnh của xu hướng. ADX tính toán biến động giá để đánh giá sức mạnh của xu hướng. Khi ADX tăng, điều đó có nghĩa là xu hướng đang tăng cường; khi ADX giảm, điều đó có nghĩa là xu hướng đang suy yếu. Chiến lược thiết lập điều kiện lọc giao dịch thông qua chỉ số ADX, chỉ phát ra tín hiệu giao dịch khi sức mạnh xu hướng tương đối mạnh.

Cụ thể, các quy tắc tạo tín hiệu của chiến lược là:

  1. Đi dài khi đường nhanh vượt qua đường chậm, và đi ngắn khi đường nhanh vượt qua đường chậm
  2. Chỉ cho phép dài và ngắn khi ADX>25

Điều này có thể lọc hiệu quả các tín hiệu không hợp lệ với sức mạnh xu hướng yếu hơn, tiếp tục cải thiện sự ổn định của hệ thống giao dịch.

Ưu điểm của Chiến lược

Chiến lược này có những lợi thế chính sau:

  1. Nhận được xu hướng giá trung hạn đến dài hạn: Hệ thống EMA kép có thể xác định hiệu quả xu hướng giá trung hạn đến dài hạn và tránh sự can thiệp của tiếng ồn thị trường ngắn hạn.

  2. Bộ lọc các sự đột phá giả: Bằng cách đánh giá sức mạnh xu hướng thông qua chỉ số ADX, nó tránh mất mát không cần thiết gây ra bởi các sự đột phá sai xung quanh các điểm chuyển hướng xu hướng.

  3. Không gian tối ưu hóa tham số lớn: Các thông số đường nhanh và chậm, các thông số ADX và nhiều hơn nữa có không gian tối ưu hóa có thể mang lại kết quả giao dịch tốt hơn thông qua sự kết hợp các thông số.

  4. Khả năng thích nghi cao: Chiến lược này phù hợp với hầu hết các cổ phiếu và khung thời gian, và đã được xác minh trên các thị trường khác nhau.

  5. Dễ thực hiện: Chiến lược này chỉ yêu cầu các chỉ số trung bình động đơn giản, tiêu thụ ít tài nguyên, dễ lập trình và có chi phí ứng dụng thực tế thấp.

Rủi ro của chiến lược

Chiến lược này cũng có một số rủi ro, chủ yếu tập trung vào các lĩnh vực sau:

  1. Rủi ro đảo ngược xu hướng: Bất kỳ chiến lược xu hướng nào cũng không thể xác định hoàn hảo các điểm đảo ngược xu hướng, và chắc chắn sẽ phải chịu tổn thất lớn hơn khi xu hướng thực sự đảo ngược.

  2. Rủi ro tối ưu hóa quá mức: Tối ưu hóa các tham số đến cực độ cũng có thể dẫn đến quá phù hợp của chiến lược với dữ liệu lịch sử, điều này sẽ làm giảm sự ổn định và hiệu quả thực tế của chiến lược.

  3. Rủi ro sự kiện thiên nga đen: Các sự kiện bất ngờ lớn sẽ phá vỡ mô hình xu hướng giá ban đầu, khiến chỉ số trung bình động thất bại, yêu cầu can thiệp thủ công hoặc cài đặt dừng lỗ để kiểm soát lỗ.

Để giải quyết các rủi ro trên, chúng ta có thể tối ưu hóa từ các khía cạnh sau:

  1. Tạo thêm các chỉ số để xác định các điểm chuyển đổi giá. ví dụ: giới thiệu khối lượng giao dịch, sẽ tăng lên khi các điểm chuyển đổi giá xuất hiện.

  2. Nới lỏng các thông số ADX một cách thích hợp để đảm bảo các cơ hội có thể được nắm bắt trong giai đoạn đầu của xu hướng.

  3. Thực hiện đào tạo và thử nghiệm kết hợp tham số nhiều nhóm và chọn các kết hợp có ổn định tốt và hiệu quả thực tế.

Hướng dẫn tối ưu hóa chiến lược

Ngoài ra còn có một số hướng mà trong đó chiến lược này có thể được tối ưu hóa:

  1. Đưa ra các cơ chế dừng lỗ: Thiết lập stop loss di chuyển hoặc stop loss phần trăm, có thể chủ động dừng lỗ khi xu hướng đảo ngược để tránh thua lỗ quá mức.

  2. Kết hợp các chỉ số khối lượng giao dịch: Ví dụ khối lượng giao dịch, có thể tránh các tín hiệu sai khi khối lượng giao dịch mở rộng tại các thời điểm chuyển đổi giá.

  3. Parameter tự điều chỉnh tối ưu hóa: Cho phép các tham số chỉ số điều chỉnh thích nghi theo sự thay đổi thị trường thời gian thực, thay vì các tham số tĩnh cố định, có thể cải thiện đáng kể sự ổn định của các chiến lược.

  4. Giới thiệu máy học: Sử dụng các thuật toán học máy để phân tích một lượng lớn dữ liệu lịch sử để xác định các tham số cho các đường trung bình động và ADX, và thậm chí dự đoán biến động giá trong tương lai.

  5. Tối ưu hóa chu kỳ chéo: Các thông số chu kỳ giao dịch khác nhau có thể được thiết lập khác nhau và cấu hình tối ưu trong mỗi chu kỳ có thể được kiểm tra.

Tóm lại

Nói chung, chiến lược theo dõi xu hướng trung bình chuyển động kép là một ý tưởng chiến lược trưởng thành và ổn định. Chiến lược này nắm bắt xu hướng giá trung hạn đến dài hạn thông qua hệ thống EMA kép, và có chỉ số ADX để lọc tín hiệu, có thể nắm bắt hiệu quả xu hướng giá cổ phiếu và tránh sự can thiệp của tiếng ồn thị trường ngắn hạn. Đồng thời, chiến lược này cũng có một số rủi ro nhất định, đòi hỏi tối ưu hóa các kết hợp tham số và phương pháp dừng lỗ, và thậm chí có thể giới thiệu nhiều chỉ số phụ và thuật toán học máy để tăng cường sự ổn định của chiến lược. Tóm lại, chiến lược theo dõi xu hướng trung bình chuyển động kép có cân bằng tốt, và là một ý tưởng chiến lược định lượng phù hợp cho các nhà đầu tư trung hạn đến dài hạn.


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

//@version=3
strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing")
len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2")
len3=input(550)
src = close
ema1=ema(src, len)
ema2=ema(ema1, len2)
d=ema1-ema2
zlema=ema1+d

ema21=ema(src, (len/3)*2)
ema22=ema(ema21, (len2/3)*2)
d2=ema21-ema22
zlema2=ema21+d2

ema31=ema(src, len3)
ema32=ema(ema21, len3)
d3=ema31-ema32
zlema3=ema31+d2

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//MAs
//ma1 = security(tickerid, "60", vwma(src, len)[1])
//ma2 = security(tickerid, "120", vwma(src, len)[1])
//plot(ma1, linewidth = 2, color = blue, title = "MA")
//plot(ma2, linewidth = 2, color = red, title = "MA2")

// ADX
lenadx = 14
lensig = 14
limadx = 18

up = change(high)
down = -change(low)
trur = rma(tr, lenadx)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur)
sum = plus + minus 
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
adx2 = ema(adx, 14)
adx2i = ema(adx2,14)
dadx2 = adx2 - adx2i
zladx2 = adx2 + dadx2
plus2 = ema(plus, 14)
plus2i = ema (plus2, 14)
dplus2 = plus2 - plus2i
zlplus2 = plus2 + dplus2

minus2 = ema(minus, 14)
minus2i = ema (minus2, 14)
dminus2 = minus2 - minus2i
zlminus2 = minus2 + dminus2

vwma = vwma(close, 150)
vwma2 = ema(vwma, 9)
vwma2i = ema(vwma2, 9)
dvwma2 = vwma2 - vwma2i
zlvwma2 = vwma2 + dvwma2


rmax=rma(src, len)
rmax2=rma(rmax, len2)
rmd=rmax-rmax2
zlrmax=rmax+rmd
rmaxz=rma(src, (len/3)*2)
rmaxz2=rma(rmaxz, (len2/3)*2)
rmzd=rmaxz-rmaxz2
zlrmaxz=rmaxz+rmzd
rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime
rmaxcol= zlrmax[1] > zlema[1] ? red:lime


rmazlema3=rma(zlema3, 100)
plot(rmazlema3, color=gray, linewidth=2)
plot(zlema, color=green)
plot(zlema2, color=yellow)
plot(zlema3, color=teal, linewidth=2)
plot(ema2, color=na)
plot(rmax, color=rmaxcol2, linewidth=3)
plot(zlrmax, color=rmaxcol, linewidth=3)


//Trading
size = strategy.position_size
lot = 0.0 
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]

if zlrmax[1] < zlema[1]
    strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if zlrmax[1] > zlema[1]
    strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))


Thêm nữa