Xu hướng theo chiến lược dựa trên sự tự tin xu hướng

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

img

Tổng quan

Ý tưởng chính của chiến lược này là thực hiện một chiến lược theo xu hướng chính xác nhất có thể. Nó đánh giá khả năng tiếp tục của xu hướng tuyến tính hiện tại bằng cách tính toán độ tin cậy của một số giá đóng cửa trước đó. Chiến lược giả định rằng một khi độ tin cậy vượt quá một mức độ nhất định, xu hướng tuyến tính đang diễn ra có nhiều khả năng tiếp tục.

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

Chiến lược tính toán sự phù hợp tuyến tính của giá đóng cửa N trong quá khứ bằng cách sử dụng hồi quy tuyến tính thông thường, lấy độ nghiêng k và độ lệch chuẩn σ của độ lệch so với giá đóng cửa.

Khi sự tin tưởng xu hướng vượt quá ngưỡng long entry, đi dài; khi nó giảm xuống ngưỡng long exit, đóng dài. Tương tự như vậy, khi sự tin tưởng xu hướng dưới ngưỡng short entry, đi ngắn; khi nó vượt quá ngưỡng short exit, đóng ngắn.

Bằng cách này, nó có thể lọc các tín hiệu từ các chuyển động giá hoang dã không theo xu hướng tuyến tính rõ ràng.

Phân tích lợi thế

Chiến lược kết hợp các phương pháp theo xu hướng và hồi quy tuyến tính trong thống kê, có thể tránh theo biến động giá ngắn hạn và chỉ theo xu hướng dài hạn, do đó có tần suất giao dịch thấp hơn và tỷ lệ thắng cao hơn.

Chiến lược có không gian điều chỉnh tham số lớn và có thể được điều chỉnh cho các sản phẩm và khung thời gian khác nhau bằng cách điều chỉnh các tham số, đạt được khả năng tổng quát tốt.

Phân tích rủi ro

Chiến lược này có nguy cơ bị mắc kẹt. Nó sẽ tạo ra tổn thất lớn khi có sự đảo ngược xu hướng đáng kể. Ngoài ra, cài đặt tham số không đúng cũng có thể dẫn đến giao dịch quá mức hoặc bỏ lỡ cơ hội giao dịch tốt.

Stop loss có thể được thiết lập để kiểm soát rủi ro giảm. Đồng thời, sự lựa chọn các tham số phải được đánh giá cẩn thận để tránh quá mức.

Hướng dẫn tối ưu hóa

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

  1. Thêm logic dừng lỗ / lấy lợi nhuận để khóa lợi nhuận và kiểm soát rủi ro

  2. Thêm mô-đun tối ưu hóa thích nghi để điều chỉnh tham số động

  3. Thêm mô hình học máy để xác định các điểm đảo ngược xu hướng và tiếp tục cải thiện tỷ lệ thắng

  4. Kiểm tra khả năng thích nghi trên các sản phẩm và khung thời gian khác nhau để cải thiện khái quát hóa

Kết luận

Thông thường, đây là một chiến lược theo xu hướng dài hạn với kiểm soát rủi ro. Nó kết hợp các phương pháp theo xu hướng và hồi quy tuyến tính để lọc ra các tín hiệu giao dịch tiếng ồn. Thông qua điều chỉnh tham số, nó có thể thích nghi tốt với các sản phẩm và khung thời gian khác nhau và là một chiến lược hiệu quả đáng nghiên cứu và cải tiến sâu sắc.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 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/
// © carefulCamel61097

// ################################################################################################

// "This is a trend following strategy that performed very well on the past 5 years"
// "Intended to be used on BTC-USDT, 4hr timeframe"

// "A factor 2 Leverage can be added by changing Order Size to 200% of equity"
// "Higher leverage is not recommended due to big drawdowns"

// "Also seems to work on 1D timeframe, although ideal parameters may be different"
// "Also seems to work on ETH-USDT and some other altcoins, although ideal parameters are different"

// ################################################################################################

//@version=5
strategy("Trend Following based on Trend Confidence", overlay=false )

// Inputs

source      = input(close)

since       = input(timestamp('2000-01-01'), title='Start trading interval')
till        = input(timestamp('2030-01-01'), title='End trading interval')

length      = input(30, title='Length')

longs_on    = input.bool(true, title='Longs')
shorts_on   = input.bool(true, title='Shorts')

// Parameters for best performance 2018 - 2022
// long_entry  = input.float(0.26, step=0.01, title='Long entry threshold')
// long_exit   = input.float(-0.10, step=0.01, title='Long exit threshold')
// short_entry = input.float(-0.24, step=0.01, title='Short entry threshold')
// short_exit  = input.float(-0.04, step=0.01, title='Short exit threshold')

long_entry  = input.float(0.25, step=0.01, title='Long entry threshold')
long_exit   = input.float(-0.10, step=0.01, title='Long exit threshold')
short_entry = input.float(-0.25, step=0.01, title='Short entry threshold')
short_exit  = input.float(-0.05, step=0.01, title='Short exit threshold')

stop_loss   = input.float(10, step=1, title='Stop loss (percentage)') / 100

// Trend Confidence

linreg = ta.linreg(source, length, 0)
linreg_p = ta.linreg(source, length, 0+1)

x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
    deviationSum := deviationSum + math.pow(source[i]-(slope*(x-i)+intercept), 2)
deviation = math.sqrt(deviationSum/(length))

slope_perc = slope / source[0]
deviation_perc = deviation / source[0]
trend_confidence = slope_perc / deviation_perc

// Strategy

in_interval = true

sl_long = strategy.position_avg_price * (1 - stop_loss)
sl_short = strategy.position_avg_price * (1 + stop_loss)

if in_interval and longs_on and ta.crossover(trend_confidence, long_entry)
    strategy.entry("TC Long Entry", strategy.long)
    strategy.exit("TC Long Exit", stop=sl_long)
if in_interval and longs_on and ta.crossunder(trend_confidence, long_exit)
    strategy.close("TC Long Entry")

if in_interval and shorts_on and ta.crossunder(trend_confidence, short_entry)
    strategy.entry("TC Short Entry", strategy.short)
    strategy.exit("TC Short Exit", stop=sl_short)
if in_interval and shorts_on and ta.crossover(trend_confidence, short_exit)
    strategy.close("TC Short Entry")

// Plots 

plot(trend_confidence, "Trend Confidence", color.rgb(255, 255, 255))

plot(long_entry, "", color.rgb(0, 255, 0), linewidth=1)
plot(long_exit, "", color.rgb(255, 0, 0), linewidth=1)
plot(short_entry, "", color=bar_index % 10 == 0 ? color.rgb(0, 255, 0) : #00000000, linewidth=1)
plot(short_exit, "", color=bar_index % 10 == 0 ? color.rgb(255, 0, 0) : #00000000, linewidth=1)


Thêm nữa