Xu hướng thích nghi sau chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-15 14:20:32
Tags:

img

Tổng quan

Chiến lược theo xu hướng thích nghi là một chiến lược giao dịch định lượng kết hợp các dải Bollinger và các chỉ số trung bình động để điều chỉnh động yếu tố sức mạnh xu hướng và đạt được xu hướng theo và dừng lỗ. Chiến lược này sử dụng dải Bollinger để tính biến động giá và do đó tính toán động một sức mạnh xu hướng hợp lý. Sau đó nó sử dụng chỉ số ATR để vẽ một kênh xu hướng thích nghi để xác định và theo dõi xu hướng tăng và giảm.

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

Chỉ số cốt lõi của chiến lược này là Bollinger Bands. Bollinger Bands bao gồm một dải giữa, một dải trên và một dải dưới. Dải giữa là đường trung bình di chuyển đơn giản n ngày, dải trên là dải giữa + k lần độ lệch chuẩn n ngày, và dải dưới là dải giữa - k lần độ lệch chuẩn n ngày. Ở đây chúng ta chọn dải giữa 20 ngày và 2 lần độ lệch chuẩn để xây dựng Bollinger Bands.

Sau đó, chúng ta tính chiều rộng băng thông (băng trên - băng dưới) trên tỷ lệ băng thông giữa, được gọi là yếu tố sức mạnh. Tỷ lệ này phản ánh sự biến động của thị trường hiện tại và sức mạnh xu hướng. Chúng ta đặt giá trị tối đa và tối thiểu của yếu tố sức mạnh để ngăn chặn nó quá lớn hoặc quá nhỏ.

Với một yếu tố sức mạnh hợp lý, kết hợp với chỉ số ATR, các dải trên và dưới di chuyển lên và xuống theo khoảng cách yếu tố sức mạnh ATR * tương ứng để tạo thành một kênh xu hướng thích nghi. Khi giá đóng phá vỡ đường ray trên lên từ dưới, đi dài; khi nó phá vỡ đường ray dưới xuống từ trên, đi ngắn.

Ngoài ra, chiến lược cũng thiết lập một cơ chế dừng lỗ. Sau khi một vị trí dài được hình thành, nếu giá giảm xuống dưới điểm thấp nhất khi vị trí được mở, dừng lỗ thoát; tương tự với các vị trí ngắn.

Ưu điểm chiến lược

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

  1. Khả năng thích nghi cao. Cách tính toán yếu tố sức mạnh cho phép chiến lược điều chỉnh chiều rộng kênh một cách năng động dựa trên sự biến động của thị trường, mở rộng kênh trong xu hướng thị trường tăng và thu hẹp kênh trong thị trường dao động để đạt được sự thích nghi với các loại thị trường khác nhau.

  2. Tần suất hoạt động vừa phải: So với các chiến lược trung bình động đơn giản, các chiến lược Bollinger Bands điều chỉnh các kênh ít thường xuyên hơn, tránh việc mở và đóng các vị trí thường xuyên không cần thiết.

  3. Thời gian vào chính xác. Việc phá vỡ các đường ray trên và dưới có thể lọc hiệu quả tiếng ồn thị trường và đảm bảo xác suất cao của việc bắt đầu xu hướng.

  4. Cơ chế dừng lỗ. Phương pháp dừng lỗ tích hợp có thể kiểm soát hiệu quả lỗ đơn, đây là một lợi thế lớn của chiến lược này.

Rủi ro chiến lược

Chiến lược này cũng có một số rủi ro:

  1. Độ nhạy cao của các tham số. Thời gian n và nhân k của Bollinger Bands có ảnh hưởng lớn đến kết quả, đòi hỏi phải thử nghiệm nhiều lần để tìm ra sự kết hợp các tham số tối ưu.

  2. Không thể theo dõi xu hướng khi Bollinger Bands khác nhau. Khi giá dao động mạnh mẽ, đường ray Bollinger Bands mở rộng nhanh chóng, dẫn đến không thể theo dõi xu hướng. Chiến lược cần phải được tạm dừng sau đó, chờ đợi đường ray hội tụ trước khi chạy lại.

  3. Các chiến lược Bollinger Bands không hoàn hảo, cũng sẽ có một số lượng nhất định các tín hiệu sai được tạo ra, đòi hỏi phải chịu tổn thất tương ứng.

  4. Phương pháp dừng lỗ tương đối đơn giản. Phương pháp dừng lỗ của chiến lược này chỉ xem xét giá cao nhất và thấp nhất sau khi mở một vị trí, mà không bao gồm các phương pháp dừng lỗ phức tạp hơn dựa trên biến động vv, có thể quá hung hăng hoặc bảo thủ, đòi hỏi tối ưu hóa.

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

Chiến lược này cần được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra tác động của các loại tiền tệ khác nhau và các tham số chu kỳ. Các tham số của chiến lược có thể được tối ưu hóa cho các loại tiền tệ và chu kỳ khác nhau để cải thiện khả năng thích nghi của chiến lược.

  2. Tối ưu hóa cơ chế dừng lỗ. Di chuyển dừng lỗ, dao động dừng lỗ, dừng lỗ sau lưng vv có thể được giới thiệu để làm cho phương pháp dừng lỗ thông minh hơn.

  3. Kết hợp các chỉ số khác để lọc tín hiệu nhập cảnh. Các chỉ số như MACD, KDJ vv có thể được thêm vào để tránh các tín hiệu sai từ Bollinger Bands trong các thị trường dao động bên.

  4. Thêm các cơ chế quản lý vị trí. Thực hiện theo dõi dừng lợi nhuận, giao dịch kim tự tháp, vị trí tỷ lệ cố định vv phương pháp quản lý để cải thiện lợi nhuận của các chiến lược.

  5. Thực hiện tối ưu hóa backtest. Kiểm tra toàn diện kết quả chiến lược bằng cách mở rộng khung thời gian backtest, điều chỉnh các tham số, phân tích các báo cáo backtest vv để tìm các tham số tối ưu.

Kết luận

Nói chung, chiến lược theo xu hướng thích nghi là một chiến lược định lượng khá trưởng thành. Nó sử dụng Bollinger Bands để nắm bắt xu hướng một cách năng động, kết hợp với chỉ số ATR để xây dựng một kênh thích nghi để đánh giá xu hướng dài và ngắn. Trong khi đó, nó có một cơ chế dừng lỗ tích hợp để kiểm soát rủi ro. Những lợi thế của chiến lược này là tần suất hoạt động thích hợp, thời gian nhập chính xác và kiểm soát rủi ro tốt. Tuy nhiên, có một số vấn đề cần tối ưu hóa trong các lĩnh vực như lựa chọn tham số, phương pháp dừng lỗ, lọc tín hiệu để làm cho chiến lược mạnh mẽ và thông minh hơn.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true)

Pd=input(2, minval=1,maxval = 100, title="Period")
Bw=input(50, minval=1,maxval = 100, title="Bandwidth")
minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor")
maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor")
plot_trend=input(true, title="Plot trend")

plot_losscut = input(true, title="Plot losscut")

/////////////// Calculate the BB's ///////////////
basisBB = ema(close, 20)
devBB     = 2 * stdev(close, 20)
upperBB = basisBB + devBB
lowerBB = basisBB - devBB
//plot(upperBB)
//plot(lowerBB)

///////////// Trend ////////////////////////////

rawFactor = ((upperBB-lowerBB)/basisBB)*Bw
Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor

Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1)
TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1)
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80)
sig_trend_long = Trend[1] == -1 and Trend == 1
sig_trend_short = Trend[1] == 1 and Trend == -1

///////////// Loss Cut ////////////////////////////
price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] 
current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1])

sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) )
has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1])
sig_reentry_long = not has_position and current_trend == 1 and low > price_cut
sig_reentry_short = not has_position and current_trend == -1 and high < price_cut

bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70)
plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny)
plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny)

LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60)
fill(TrendDownPlot, LossCutPlot, color=silver, transp=90)

plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny)
    
    
///////////// Strategy //////////////////////////// 
if true

    strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long)
    strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short)
    
    if(current_trend == 1)
        strategy.close('long', when=sig_loss_cut == true) 
        //strategy.exit('lc',from_entry='long', stop=price_cut)
    
    if( current_trend == -1 )
        strategy.close('short', when=sig_loss_cut == true) 
        //strategy.exit('sc',from_entry='short', stop=price_cut)


Thêm nữa