Chiến lược chỉ số PB trung bình băng thông

Tác giả:ChaoZhang, Ngày: 2024-01-17 17:10:53
Tags:

img

Tổng quan

Chiến lược này tính toán chỉ số PB trung bình và dải Bollinger để xác định mối quan hệ chéo vàng và chéo chết giữa chỉ số PB và đường ray trên và dưới của dải Bollinger. Nó tạo ra tín hiệu mua khi chỉ số PB phá vỡ trên đường ray giữa hoặc đường ray dưới của dải Bollinger, và tạo ra tín hiệu bán khi chỉ số PB phá vỡ dưới đường ray giữa hoặc đường ray trên của dải Bollinger.

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

Chỉ số trung tâm của chiến lược là chỉ số PB trung bình. Chỉ số PB trung bình kết hợp sự ổn định của hệ thống trung bình động và độ nhạy của chỉ số PB. Nó sử dụng sự khác biệt giữa trung bình động nhanh và chậm của các chu kỳ khác nhau để thể hiện xu hướng thay đổi giá để xác định xu hướng dài và ngắn.

Bollinger Band là một chỉ số giá cổ phiếu được sử dụng để xác định các điều kiện mua quá mức và bán quá mức của giá cổ phiếu. Chỉ số Bollinger Band bao gồm ba đường cong: đường ray giữa, đường ray trên và đường ray dưới.

Tóm lại, chiến lược này sử dụng thông minh chỉ số PB trung bình để xác định xu hướng tăng hoặc giảm của giá cổ phiếu, và các dải Bollinger như một chỉ số phụ để xác định điều kiện mua quá mức và bán quá mức, để tìm tín hiệu giao dịch từ mối quan hệ giữa hai chỉ số.

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Sử dụng chỉ số PB trung bình để xác định sự thay đổi trong xu hướng giá, độ nhạy cao
  2. Hỗ trợ với Bollinger Bands để xác định các khu vực mua quá mức và bán quá mức để cải thiện độ chính xác của việc xác định các điểm nhập và xuất
  3. Lý thuyết chiến lược đơn giản, dễ thực hiện
  4. Dữ liệu backtest cho thấy lợi nhuận tương đối thỏa mãn

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Cả chỉ số PB trung bình và Bollinger Bands đều dựa trên dữ liệu lịch sử để tính toán. Chúng có thể tạo ra các tín hiệu không chính xác khi giá cổ phiếu biến động mạnh.
  2. Chỉ số PB và Bollinger Bands khá nhạy cảm với các thiết lập tham số.
  3. Những thay đổi môi trường vĩ mô trong giai đoạn thực hiện chiến lược, chẳng hạn như khủng hoảng kinh tế, thay đổi chính sách, v.v., có thể gây ra sự thất bại của chiến lược.

Để giải quyết các rủi ro trên, các phương pháp như tối ưu hóa cài đặt tham số, dừng lỗ nghiêm ngặt, xem xét các yếu tố vĩ mô, giám sát thủ công có thể được sử dụng để giảm thiểu rủi ro.

Hướng dẫn tối ưu hóa

Các hướng tối ưu hóa cho chiến lược này bao gồm:

  1. Tối ưu hóa các tham số của chỉ số PB trung bình và Bollinger Bands để tìm kết hợp tham số tốt nhất
  2. Thêm các chỉ số khác để lọc, chẳng hạn như MACD, KDJ, vv để cải thiện hiệu suất chiến lược
  3. Thêm các cơ chế dừng lỗ để kiểm soát hiệu quả lỗ đơn
  4. Kết hợp các chỉ số khung thời gian lớn hơn để xác định xu hướng chính để tránh giao dịch chống lại xu hướng

Kết luận

Với chỉ số PB trung bình là cốt lõi của nó và Bollinger Bands để hỗ trợ xác định tín hiệu giao dịch, nó có logic đơn giản, độ nhạy cao và kết quả backtest tốt. Bằng cách tiếp tục tối ưu hóa các thiết lập tham số, thêm các chỉ số hỗ trợ khác, thực hiện stop loss nghiêm ngặt vv, lợi nhuận và sự ổn định của chiến lược có thể được cải thiện hơn nữa. Nó đáng để xác minh trong giao dịch trực tiếp và ứng dụng.


/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("BandPass EOS", overlay=false, initial_capital = 1000)

src = input(close, "Source", input.source)
Period1 = input(41, "Fast Period", input.integer)
Period2 = input(54, "Slow Period", input.integer)
showBG = input(false, "Show crosses on background?", input.bool)
UseReversalStop = input(true, "Use additional triggers?", input.bool)

//Super Passband Filter
a1 = 0.0
a2 = 0.0
PB = 0.0
RMS = 0.0
if bar_index > Period1
    a1 := 5 / Period1
    a2 := 5 / Period2
    PB := (a1 - a2) * src + (a2 * (1 - a1) - a1 * (1 - a2)) * src[1] + 
       (1 - a1 + 1 - a2) * nz(PB[1]) - (1 - a1) * (1 - a2) * nz(PB[2])
    for i = 0 to 49 by 1
        RMS := RMS + PB[i] * PB[i]
        RMS
    RMS := sqrt(RMS / 40)
    RMS
z = 0

buy = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)
sell = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)
signal = buy ? 1 : sell ? -1 : 0
bg = buy ? color.green : sell ? color.red : color.white
bg := showBG ? bg : na
upperFill = PB>RMS ? color.lime : na
lowerFill = PB<-RMS ? color.red : na

p1 = plot(PB,"PB",color.red)
p2 = plot(RMS,"+RMS",color.blue)
p3 = plot(-RMS,"-RMS",color.blue)
bgcolor(bg)
fill(p1,p2,upperFill)
fill(p1,p3,lowerFill)
hline(0)



//PERIOD
testStartYear = input(2018, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
lcolor = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)
scolor = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)

c1 = (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z))
c2 = (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z))

plot (c1 ? PB : na, style = plot.style_circles, color = color.red, linewidth = 3)
plot (c2 ? PB : na, style = plot.style_circles, color = color.green, linewidth = 3)

if (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z))
    strategy.entry("long", strategy.long, when = testPeriod())


if (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z))
    strategy.entry("short", strategy.short, when = testPeriod())

    

Thêm nữa