Chiến lược giao dịch định lượng phức tạp dựa trên MACD

Tác giả:ChaoZhang, Ngày: 2023-12-13 16:44:46
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch định lượng hỗn hợp dựa trên chỉ số MACD. Nó kết hợp nhiều chỉ số như MACD và KDJ để tạo ra tín hiệu giao dịch thông qua sự kết hợp của các chỉ số.

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

Chỉ số cốt lõi của chiến lược này là MACD. MACD viết tắt của Moving Average Convergence Divergence, đây là một chỉ số theo xu hướng. Nó bao gồm trung bình di chuyển nhanh (EMA) và trung bình di chuyển chậm (EMA). Các tham số mặc định là 12 cho đường nhanh và 26 cho đường chậm. Chiến lược tính toán sự khác biệt giữa hai đường EMA, được gọi là DIF. Sau đó, EMA 9 ngày được tính trên DIF để có được chỉ số DEA. Khi DIF vượt qua trên DEA, một tín hiệu mua được tạo ra. Khi vượt qua dưới, một tín hiệu bán được tạo ra.

Chỉ số KDJ bao gồm giá trị K, giá trị D và giá trị J. Trong số đó, giá trị K đề cập đến giá trị ngẫu nhiên, giá trị D là trung bình động của giá trị K, và giá trị J đề cập đến giá trị xác định. Chỉ số KDJ phản ánh mức mua quá mức và bán quá mức trên thị trường. Khi giá trị J lớn hơn 100, nó đại diện cho điều kiện mua quá mức. Khi thấp hơn 10, nó đại diện cho điều kiện bán quá mức. Chiến lược kết hợp chỉ số KDJ để tránh tạo ra tín hiệu sai ở các điểm chuyển hướng của thị trường.

Ưu điểm của Chiến lược

Chiến lược này kết hợp nhiều chỉ số như MACD và KDJ, có thể lọc hiệu quả tiếng ồn thị trường và xác định hướng xu hướng. Chỉ số MACD có thể nắm bắt sự thay đổi giá ngắn hạn một cách kịp thời, trong khi chỉ số KDJ có thể xác nhận xu hướng trung và dài hạn. Sự kết hợp của cả hai có thể cân bằng việc theo đuổi sự nhanh nhẹn và ổn định.

Ngoài ra, chiến lược kết hợp một bộ chọn khoảng thời gian, cung cấp sự linh hoạt hơn trong việc đánh giá hiệu suất chiến lược.

Rủi ro và giải pháp

  • Khi thị trường biến động trong một khoảng thời gian dài, MACD sẽ có nhiều tín hiệu sai. Tại thời điểm này, chúng ta có thể điều chỉnh đúng các thông số của đường EMA để lọc ra một số tiếng ồn.

  • Các thiết lập tham số KDJ không chính xác cũng sẽ ảnh hưởng đến kết quả. Chúng ta có thể kiểm tra nhiều nhóm tham số và chọn một sự kết hợp tham số ổn định hơn.

  • Việc lựa chọn không phù hợp khung thời gian backtest sẽ đánh giá quá cao hoặc đánh giá thấp lợi nhuận của chiến lược.

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

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

  1. Thêm một cơ chế dừng lỗ. Khi giá kích hoạt đường dừng lỗ, nó sẽ buộc một vị trí thoát khỏi mục đích dừng lỗ.

  2. Thêm nhiều bộ lọc chỉ số, kết hợp các chỉ số như RSI và Bollinger Bands để cải thiện độ chính xác tín hiệu.

  3. Tối ưu hóa các tham số chỉ số. Thay đổi sự kết hợp của EMA và KDJ tham số để tìm các thiết lập tối ưu.

  4. Sử dụng kỹ thuật học máy để tối ưu hóa tự động. Sử dụng mạng thần kinh để đào tạo và tối ưu hóa tham số.

Kết luận

Đây là một chiến lược định lượng điển hình chủ yếu theo xu hướng, được bổ sung bằng kiểm soát mua quá mức và bán quá mức. Nó kết hợp các lợi thế của nhiều chỉ số và cân bằng hiệu quả sự ổn định và nhạy cảm. Thông qua tối ưu hóa và điều chỉnh liên tục, khả năng áp dụng của chiến lược có thể được mở rộng hơn nữa để có được lợi nhuận ổn định dài hạn.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="New Renaissance", shorttitle="New Renaissance", overlay=true,initial_capital=10000)

source = close

fastlength=input(12, minval=1)
slowlength=input(26,minval=1)
signallength=input(9,minval=1)

// === Defining the MACD oscillator
fastMA=ema(source,fastlength)
slowMA=ema(source,slowlength)
MACD=fastMA-slowMA
signal=sma(MACD,signallength)
delta=MACD-signal

// === Buy and Sell Signals ===
buy=crossover(MACD, signal)
sell=crossunder(MACD, signal)

// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2018, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 12,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 31,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2020, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

// === EXECUTION ===
strategy.entry("L", strategy.long, when = window() and buy)    // enter long when "within window of time" AND crossover
strategy.close("L", when = window() and sell)                   // exit long when "within window of time" AND crossunder      

Thêm nữa