Chiến lược kênh hồi quy động

Tác giả:ChaoZhang, Ngày: 2024-02-23 12:14:49
Tags:

img

Tổng quan

Chiến lược kênh hồi quy động sử dụng phân tích hồi quy tuyến tính của xu hướng giá kết hợp với dừng lỗ động để thực hiện xu hướng theo sau trong giao dịch định lượng. Chiến lược sử dụng hồi quy tuyến tính để vẽ kênh giá và tạo ra tín hiệu mua và bán khi giá thoát khỏi kênh. Đồng thời, chiến lược theo dõi giá trong thời gian thực để cập nhật mức dừng lỗ để khóa lợi nhuận.

Chiến lược logic

Chiến lược này đầu tiên tính toán đường cong hồi quy tuyến tính của giá để xác định giá có vượt qua trên hoặc dưới kênh hồi quy. Khi giá tăng trên đường ray trên của kênh, một tín hiệu mua được tạo ra. Khi giá giảm dưới đường ray dưới, một tín hiệu bán được kích hoạt.

Sau khi nhập vào một vị trí, chiến lược tiếp tục theo dõi nếu giá vượt qua đường trung bình di chuyển dừng lỗ. Đối với các lệnh dài, nếu giá giảm xuống dưới đường dừng lỗ, lệnh bán dừng lỗ sẽ được ban hành. Đối với các lệnh ngắn, nếu giá tăng trên đường dừng lỗ, lệnh mua dừng lỗ sẽ được kích hoạt. Điều này khóa lợi nhuận và kiểm soát rủi ro.

Điều quan trọng cần lưu ý là nếu giá phá vỡ kênh một lần nữa ngược hướng, chiến lược sẽ ngay lập tức làm phẳng vị trí ban đầu và chuyển sang giao dịch theo hướng ngược lại.

Phân tích lợi thế

Chiến lược này kết hợp cả hai khái niệm theo xu hướng và đảo ngược trung bình, đi cùng với xu hướng giá tổng thể trong khi bắt sự đảo ngược ngắn hạn.

So với các chiến lược trung bình động đơn giản, Chiến lược kênh hồi quy động nhạy cảm hơn với sự thay đổi giá và có thể giảm các giao dịch chủ yếu.

Phân tích rủi ro

Rủi ro chính nằm ở sự phù hợp không chính xác của đường cong hồi quy. Nếu phạm vi kênh được thiết lập không chính xác, quá rộng hoặc quá hẹp, nó sẽ làm tăng các giao dịch không hợp lệ hoặc bỏ lỡ cơ hội giao dịch.

Ngoài ra, vị trí dừng lỗ thích hợp là rất quan trọng. Một mức dừng lỗ quá gần với giá thị trường có xu hướng thanh lý sớm bởi biến động ngắn hạn trong khi mức dừng lỗ quá xa không thể phục vụ mục đích kiểm soát rủi ro của nó. Cần điều chỉnh kỹ trên các sản phẩm khác nhau.

Tối ưu hóa

Xem xét các tham số tự động tối ưu hóa cho các giai đoạn hoặc sản phẩm khác nhau để làm cho kênh hồi quy và đường dừng lỗ phù hợp hơn với xu hướng giá. Ví dụ, các thuật toán học máy có thể được sử dụng để đào tạo các tham số tối ưu.

Ngoài ra, các loại hồi quy khác nhau như hồi quy đa thức và hồi quy trọng lượng cục bộ có thể được thử nghiệm để cải thiện sự phù hợp.

Kết luận

Chiến lược kênh hồi quy động sử dụng kỹ thuật theo dõi xu hướng và đảo ngược trung bình, theo xu hướng giá tổng thể trong khi nắm bắt sự đảo ngược ngắn hạn. Điều chỉnh đúng các thông số kênh hồi quy chính và dừng lỗ là rất quan trọng đối với hiệu suất chiến lược.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)

// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)

// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)

// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0


var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0

// Regressão linear para uso como sinal de entrada 
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)

//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])

// Condição de entrada (reversão da regressão)
if long_entry_signal
    long_signal := true
    short_signal := false
    long_entry_level := high
    long_stop_level := low

if short_entry_signal
    short_signal := true
    long_signal := false
    short_entry_level := low
    short_stop_level := high


// Indica quando o preço cruzou o nível de stop 
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)

// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
    if low > long_entry_level
        long_stop_level := high

// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
    if high < short_stop_level
        short_stop_level := low

// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
    if long_entry_signal //and short_order_open
        strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
        short_order_open:= false
    if short_entry_signal //and long_order_open
        strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
        long_order_open:=false

// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    long_order_id+=1
    // strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level) 
    strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
    long_order_open := true
    // log.info("Open Long:"+str.tostring(long_order_id))

if short_signal and close < short_entry_level and not short_order_open
    if strategy.opentrades != 0
        strategy.cancel_all()

    short_order_id+=1
    // strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
    short_order_open := true
    // log.info("Open Short:"+str.tostring(short_order_id))

// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
    strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
    long_order_open := false

if short_signal and close > short_stop_level and short_order_open
    strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
    short_order_open := false

// Plotagem da regressão e do stop

plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))

plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")

plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)

plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")



Thêm nữa