Chiến lược Chuyển hướng tuyến tính ngắn dài là một chiến lược phân tích kỹ thuật sử dụng mô hình hồi quy tuyến tính để dự đoán các biến động giá trong tương lai của một cổ phiếu. Nguyên tắc cơ bản của chiến lược là: các biến động giá cổ phiếu thường theo một xu hướng tuyến tính nhất định, và bằng cách tính toán hồi quy tuyến tính của giá, giá trong tương lai có thể được dự đoán. Chiến lược đi dài khi giá dự đoán vượt trên giá hiện tại, và thoát khỏi vị trí khi nó vượt dưới.
Chiến lược đầu tiên tính toán sự hồi quy tuyến tính của giá cổ phiếu trong một khoảng thời gian nhất định. Sự hồi quy tuyến tính phù hợp với một đường thẳng bằng phương pháp vuông nhỏ nhất, đại diện cho xu hướng thay đổi giá theo thời gian. Chiến lược sau đó vẽ đường giá dự đoán và giá hiện tại trên biểu đồ.
Chiến lược xác định hai tín hiệu:
Khi tín hiệu dài xuất hiện, chiến lược mở một vị trí dài; khi tín hiệu ngắn xuất hiện, nó đóng vị trí.
Các bước chính của chiến lược là như sau:
Chiến lược chéo hồi quy tuyến tính ngắn dài có những lợi thế sau:
Mặc dù có nhiều lợi thế, Chiến lược chéo hồi quy tuyến tính ngắn dài cũng có một số rủi ro:
Chiến lược Long-Short Linear Regression Crossover tạo ra các tín hiệu giao dịch dựa trên việc so sánh giá dự đoán từ hồi quy tuyến tính và giá hiện tại. Logic của chiến lược đơn giản và rõ ràng, và nó có thể nắm bắt xu hướng tuyến tính của giá và có thể áp dụng cho các điều kiện thị trường khác nhau. Đồng thời, chiến lược dễ thực hiện và tối ưu hóa, và các tham số có thể được điều chỉnh linh hoạt, kết hợp với các chỉ số khác, các mô-đun kiểm soát rủi ro có thể được thêm vào, v.v., để liên tục cải thiện hiệu suất của chiến lược. Tuy nhiên, chiến lược cũng có những rủi ro như nhận dạng xu hướng không chính xác, cài đặt tham số không phù hợp và quá tải dữ liệu lịch sử, vì vậy cần thận trọng trong ứng dụng thực tế. Nhìn chung, Chiến lược Long-Short Linear Regression Crossover là một chiến lược giao dịch đơn giản và định lượng hiệu quả đáng để tiếp tục khám phá và tối ưu hóa.
/*backtest start: 2024-02-25 00:00:00 end: 2024-03-26 00:00:00 period: 3h basePeriod: 15m 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 Cross", overlay=true, margin_long=100, margin_short=0) //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 = 'Strategy Length') linearlen=input(defval = 9, title = 'Linear Lookback') [a, b] = linregs(price, vol, len) // Calculate linear regression for stock price based on volume //eps = request.earnings(syminfo.ticker, earnings.actual) //MA For double confirmation out = ta.sma(close, 200) outf = ta.sma(close, 50) outn = ta.sma(close, 90) outt = ta.sma(close, 21) outthree = ta.sma(close, 9) // 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 //MACD //[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // Plot predicted stock price plot(predicted_price, color=color.rgb(65, 59, 150), linewidth=2, title="Predicted Price") plot(ta.sma(predicted_price,linearlen), color=color.rgb(199, 43, 64), linewidth=2, title="MA Predicted Price") //offset = input.int(title="Offset", defval=0, minval=-500, maxval=500) plot(out, color=color.blue, title="MA200") [macdLine, signalLine, histLine] = ta.macd(predicted_price, 12, 26, 9) //BUY Signal longCondition=false mafentry =ta.sma(close, 50) > ta.sma(close, 90) //matentry = ta.sma(close, 21) > ta.sma(close, 50) matwohun = close > ta.sma(close, 200) twohunraise = ta.rising(out, 2) twentyrise = ta.rising(outt, 2) macdrise = ta.rising(macdLine,2) macdlong = ta.crossover(predicted_price, ta.wma(predicted_price,linearlen)) and (signalLine < macdLine) if macdlong and macdrise longCondition := true if (longCondition) strategy.entry("My Long Entry Id", strategy.long) //Sell Signal lastEntryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1) daysSinceEntry = len daysSinceEntry := int((time - strategy.opentrades.entry_time(strategy.opentrades - 1)) / (24 * 60 * 60 * 1000)) percentageChange = (close - lastEntryPrice) / lastEntryPrice * 100 //trailChange = (ta.highest(close,daysSinceEntry) - close) / close * 100 //label.new(bar_index, high, color=color.black, textcolor=color.white,text=str.tostring(int(trailChange))) shortCondition=false mafexit =ta.sma(close, 50) < ta.sma(close, 90) matexit = ta.sma(close, 21) < ta.sma(close, 50) matwohund = close < ta.sma(close, 200) twohunfall = ta.falling(out, 3) twentyfall = ta.falling(outt, 2) shortmafall = ta.falling(outthree, 1) macdfall = ta.falling(macdLine,1) macdsell = macdLine < signalLine if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2) shortCondition := true if (shortCondition) strategy.entry("My Short Entry Id", strategy.short)