Chiến lược giao dịch trung bình di chuyển hồi quy tuyến tính

Tác giả:ChaoZhang, Ngày: 2023-10-25 10:58:02
Tags:

img

Tổng quan

Chiến lược giao dịch trung bình di chuyển hồi quy tuyến tính tạo ra tín hiệu mua và bán dựa trên sự chéo chéo giữa đường hồi quy tuyến tính và trung bình di chuyển của giá cổ phiếu. Chiến lược này kết hợp theo xu hướng với phân tích hồi quy tuyến tính để xác định sự đảo ngược tiềm năng và đạt được mức mua thấp và bán cao.

Chiến lược logic

Chiến lược đầu tiên tính toán đường hồi quy tuyến tính n ngày và trung bình động m ngày của giá cổ phiếu.

Khi đường trung bình động vượt trên đường hồi quy, nó báo hiệu tăng động lực tăng và tạo ra tín hiệu mua. Khi đường trung bình động vượt dưới, nó báo hiệu suy yếu tăng và tạo ra tín hiệu bán.

Cụ thể, chiến lược theo các bước sau để xác định tín hiệu giao dịch:

  1. Tính toán n-ngày tuyến tính hồi quy đường giá lrLine

  2. Tính toán trung bình di chuyển đơn giản trong m ngày của lrLine được gọi là lrMA

  3. Tính toán m-ngày chỉ số trung bình động của giá gọi là ema

  4. Khi EMA vượt qua lrMA, tạo tín hiệu mua longEntry

  5. Khi EMA vượt dưới lrMA, tạo tín hiệu bán longExit

  6. Chỉ xem xét tín hiệu mua khi thị trường tăng

  7. Thực hiện giao dịch dựa trên tín hiệu

Bằng cách sử dụng chéo giữa hồi quy và đường trung bình động để xác định các mục nhập, chiến lược có thể lọc hiệu quả các đột phá sai và xác định sự đảo ngược để mua thấp và bán cao.

Ưu điểm

  • Kết hợp phân tích xu hướng và hồi quy để xác định tín hiệu chính xác
  • Đường hồi quy là đơn giản để tính toán và thực hiện
  • Sử dụng lọc thị trường để tránh giao dịch không thuận lợi
  • Các tham số có thể tùy chỉnh để điều chỉnh chiến lược
  • Đạt được mua thấp và bán cao cho lợi nhuận

Rủi ro

  • Sự giao thoa thường xuyên trong thời gian biến động có thể tạo ra tín hiệu sai
  • Các bộ lọc thị trường không chính xác dẫn đến các mục nhập không đúng thời gian
  • Điều chỉnh tham số kém ảnh hưởng đến hiệu suất chiến lược
  • Tần suất giao dịch cao dẫn đến chi phí cao hơn

Các thông số nên được điều chỉnh để tăng thời gian trung bình động và đường hồi quy và giảm tần suất giao dịch. Các lỗ dừng hợp lý nên được thực hiện để kiểm soát rủi ro. Các bộ lọc thị trường có thể được nâng cao để cải thiện độ chính xác.

Những cải tiến

Chiến lược có thể được tối ưu hóa trong một số khía cạnh:

  1. Tối ưu hóa trung bình động bằng cách thử nghiệm các loại MAs khác nhau

  2. Tối ưu hóa đường hồi quy bằng cách điều chỉnh thời gian tính toán

  3. Tối ưu hóa bộ lọc thị trường bằng cách thử nghiệm các chỉ số khác nhau

  4. Tối ưu hóa tham số thông qua backtesting nghiêm ngặt

  5. Tối ưu hóa stop loss bằng cách thử nghiệm các logic stop loss khác nhau

  6. Tối ưu hóa chi phí bằng cách điều chỉnh tần suất giao dịch dựa trên chi phí

Những tối ưu hóa này có thể tiếp tục cải thiện sự ổn định và lợi nhuận của chiến lược.

Kết luận

Chiến lược MA hồi quy tuyến tính tích hợp các điểm mạnh của phân tích xu hướng và hồi quy tuyến tính để xác định sự đảo ngược hiệu quả và mua giá bán thấp cao. Chiến lược đơn giản này phù hợp với việc chọn cổ phiếu trong khoảng thời gian trung bình đến dài hạn. Với điều chỉnh tham số và kiểm soát rủi ro, chiến lược có thể đạt được sự ổn định cao hơn. Nó cung cấp một khuôn khổ giao dịch kỹ thuật khả thi cho phân tích thị trường.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 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/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


Thêm nữa