MACD tuyến tính mở khóa phép thuật hồi quy tuyến tính trong giao dịch

Tác giả:ChaoZhang, Ngày: 15-12-2023 10:22:50
Tags:

img

Tên chiến lược: Chiến lược MACD tuyến tính theo động lực

Tổng quan: Đây là một chiến lược định lượng sử dụng hồi quy tuyến tính để dự đoán giá cổ phiếu kết hợp với chỉ số MACD. Nó tận dụng phân tích hồi quy tuyến tính trên giá và khối lượng lịch sử để dự đoán xu hướng giá trong tương lai. Sau đó nó sử dụng chỉ số MACD để xác định thời gian nhập cảnh khi cơ hội lợi nhuận xuất hiện.

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

  1. Tính toán hệ số hồi quy tuyến tính của giá: Thiết lập một đường hồi quy tuyến tính dựa trên khối lượng lịch sử để dự đoán giá trong tương lai.
  2. Chụp giá dự đoán: Chụp đường dự đoán dựa trên hệ số hồi quy từ Bước 1.
  3. Tạo tín hiệu mua: Khi giá dự đoán nằm giữa giá mở và giá đóng, và MACD đang tăng, tạo tín hiệu mua.
  4. Tạo tín hiệu bán: Khi MACD đang giảm và giá thấp hơn giá dự đoán, tạo tín hiệu bán.

Phân tích lợi thế: Chiến lược này kết hợp dự đoán thống kê và phán đoán chỉ số kỹ thuật. Nó dẫn ra dự đoán giá bằng cách sử dụng hồi quy tuyến tính, tránh suy đoán chủ quan. Trong khi đó, chỉ số MACD có thể xác định hiệu quả đà thị trường và nắm bắt các cơ hội chính xác. Nhìn chung, chiến lược này có mức độ có hệ thống cao, dự đoán chính xác và rủi ro có thể kiểm soát được.

Phân tích rủi ro:
Phục hồi tuyến tính chỉ dựa trên dữ liệu lịch sử và có thể tạo ra tín hiệu không chính xác để đáp ứng các sự kiện thiên nga đen như tin tức giảm đáng kể. Ngoài ra, các thiết lập tham số như độ dài thời gian hồi quy ảnh hưởng đến hiệu suất chiến lược. Chúng tôi đề nghị sử dụng vwma để làm mịn đường cong giá dự đoán để giảm bớt sự căng thẳng đường cong ảnh hưởng đến chiến lược.

Hướng dẫn tối ưu hóa:
Chúng tôi tin rằng chiến lược này có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kết hợp cơ chế dừng lỗ. Giảm lỗ khi giá vượt qua các đường dừng lỗ bằng cách đóng các vị trí. Điều này kiểm soát hiệu quả các lỗ gây ra bởi các tín hiệu không chính xác đôi khi.
  2. Đưa ra các mô hình học máy, áp dụng các mô hình hiệu quả hơn để cải thiện độ chính xác dự đoán.
  3. Bao gồm các chỉ số cảm xúc. Bao gồm các chỉ số sợ hãi để xác định tâm lý thị trường và cải thiện tỷ lệ chiến thắng.
  4. Kết hợp nhiều khung thời gian. Xác nhận dự đoán qua các khoảng thời gian có thể tạo thành một chiến lược kết hợp để vượt qua những hạn chế của một khung thời gian duy nhất.

Kết luận:
Chiến lược này tạo ra các tín hiệu giao dịch có hệ thống bằng cách dự đoán giá bằng hồi quy tuyến tính và xác định mục nhập bằng chỉ số MACD. Những lợi thế của nó bao gồm logic dự đoán rõ ràng, rủi ro có thể kiểm soát được và không gian tối ưu hóa rộng rãi. Chúng tôi tin rằng hiệu suất của nó sẽ tiếp tục vượt trội thông qua tối ưu hóa liên tục và lặp lại. Nó cung cấp nguồn cảm hứng về việc tận dụng các mô hình dự đoán khoa học để tiến hành giao dịch định lượng và xứng đáng nghiên cứu và ứng dụng thêm.


/*backtest
start: 2023-12-07 00:00:00
end: 2023-12-14 00:00:00
period: 1m
basePeriod: 1m
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/
// © stocktechbot

//@version=5
strategy("Linear On MACD", overlay=true, margin_long=100, margin_short=100)



fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
tolerance = input.string(title="Risk tolerance", defval = "LOW", options=["LOW", "HIGH"])

chng = 0
obv = ta.cum(math.sign(ta.change(close)) * volume)
if close < close[1] and (open < close)
    chng := 1
else if close > close[1]
    chng := 1
else
    chng := -1
obvalt = ta.cum(math.sign(chng) * volume)
//src = input(title="Source", defval=close)
src = obvalt
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//hline(0, "Zero Line", color=color.new(#787B86, 50))
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

//Linear Regression

vol = volume

// Function to calculate linear regression
linregs(y, x, len) =>
    ybar = math.sum(y, len)/len
    xbar = math.sum(x, len)/len
    b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len)
    a = ybar - b*xbar
    [a, b]

// Historical stock price data
price = close

// Length of linear regression
len = input(defval = 21, title = 'Lookback')

// Calculate linear regression for stock price based on volume
[a, b] = linregs(price, vol, len)

// Predicted stock price based on volume
predicted_price = a + b*vol

// Check if predicted price is between open and close
is_between = open < predicted_price and predicted_price < close


// Plot predicted stock price
plot(predicted_price, color=color.rgb(218, 27, 132), linewidth=2, title="Predicted Stock Price")
plot(ta.vwma(predicted_price,len), color=color.rgb(199, 43, 64), linewidth=2, title="Predicted Stock Price")

//BUY Signal
lincrossunder = close > predicted_price
macdrise = ta.rising(macd,2)
//macdvollong = ta.crossover(macd, signal)
//macdlong = ta.crossover(macdLine, signalLine)
macdvollong = macd > signal
macdlong = macdLine > signalLine
longCondition=false
if macdlong and macdvollong and is_between and ta.rising(predicted_price,1)
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lincrossover = close < predicted_price
macdfall = ta.falling(macd,1)
macdsell = macd < signal
shortCondition = false
risklevel = predicted_price
if (tolerance == "HIGH")
    risklevel := ta.vwma(predicted_price,len)


if macdfall and macdsell and (macdLine < signalLine) and (close < risklevel)
    shortCondition := true


if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


Thêm nữa