Chiến lược giao dịch định lượng chiến thắng hoàn hảo dựa trên các chỉ số BB kép và RSI

Tác giả:ChaoZhang, Ngày: 2024-01-29 10:33:43
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch định lượng dựa trên chỉ số Bollinger Bands và chỉ số chỉ số sức mạnh tương đối (RSI). Chiến lược này sử dụng các phương pháp học máy để kiểm tra lại và tối ưu hóa các tham số trong gần 1 năm dữ liệu lịch sử bằng ngôn ngữ Python, tìm ra sự kết hợp tham số tối ưu.

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

Các tín hiệu giao dịch của chiến lược này đến từ sự đánh giá kết hợp của hai Bollinger Bands và chỉ số RSI. Trong số đó, chỉ số Bollinger Bands là kênh biến động được tính dựa trên độ lệch chuẩn giá. Nó tạo ra các tín hiệu giao dịch khi giá tiếp cận hoặc chạm vào kênh. Chỉ số RSI đánh giá tình huống mua quá mức và bán quá mức của giá.

Cụ thể, tín hiệu mua được tạo ra khi giá đóng dưới đường ray dưới 1.0 độ lệch chuẩn và RSI lớn hơn 42 cùng một lúc. Một tín hiệu bán được tạo ra khi giá đóng trên đường ray trên 1.0 độ lệch chuẩn và RSI lớn hơn 70 cùng một lúc. Ngoài ra, chiến lược này cũng đặt ra hai bộ tham số BB và RSI, được sử dụng cho các vị trí đóng vào và dừng lỗ tương ứng. Các tham số này là các giá trị tối ưu thu được thông qua kiểm tra ngược và học máy rộng rãi.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là độ chính xác của các thông số. Thông qua các phương pháp học máy, mỗi thông số được thu được thông qua kiểm tra sau toàn diện để đạt được tỷ lệ Sharpe tốt nhất. Điều này đảm bảo cả tỷ lệ lợi nhuận của chiến lược và kiểm soát rủi ro. Ngoài ra, sự kết hợp của các chỉ số kép cũng cải thiện độ chính xác và tỷ lệ thắng của tín hiệu.

Phân tích rủi ro

Rủi ro chính của chiến lược này đến từ việc thiết lập điểm dừng lỗ. Nếu điểm dừng lỗ được đặt quá lớn, nó sẽ không kiểm soát hiệu quả lỗ. Ngoài ra, nếu điểm dừng lỗ không tính toán đúng các chi phí giao dịch khác như hoa hồng và trượt, nó cũng sẽ làm tăng rủi ro. Để giảm rủi ro, nên điều chỉnh tham số kích thước dừng lỗ để giảm tần suất giao dịch, trong khi tính toán vị trí dừng lỗ hợp lý.

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

Bạn có thể thử thay đổi các thông số chiều dài của Bollinger Bands, hoặc điều chỉnh ngưỡng mua quá mức và bán quá mức của RSI. Bạn cũng có thể thử giới thiệu các chỉ số khác để xây dựng một sự kết hợp đa chỉ số. Điều này có thể làm tăng không gian lợi nhuận và sự ổn định của chiến lược.

Tóm lại

Chiến lược này kết hợp hai chỉ số BB và chỉ số RSI, và có được các thông số tối ưu thông qua các phương pháp học máy để đạt được lợi nhuận cao và mức độ rủi ro có thể kiểm soát được. Nó có lợi thế của việc kết hợp đánh giá chỉ số và tối ưu hóa tham số. Với sự cải thiện liên tục, chiến lược này có tiềm năng trở thành một chiến lược giao dịch định lượng tuyệt vời.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Bunghole 2020
strategy(overlay=true, shorttitle="Flawless Victory Strategy" )

// Stoploss and Profits Inputs
v1 = input(true, title="Version 1 - Doesn't Use SL/TP")
v2 = input(false, title="Version 2 - Uses SL/TP")
stoploss_input = input(6.604, title='Stop Loss %', type=input.float, minval=0.01)/100
takeprofit_input = input(2.328, title='Take Profit %', type=input.float, minval=0.01)/100
stoploss_level = strategy.position_avg_price * (1 - stoploss_input)
takeprofit_level = strategy.position_avg_price * (1 + takeprofit_input)

//SL & TP Chart Plots
plot(v2 and stoploss_input and stoploss_level ? stoploss_level: na, color=color.red, style=plot.style_linebr, linewidth=2, title="Stoploss")
plot(v2 and takeprofit_input ? takeprofit_level: na, color=color.green, style=plot.style_linebr, linewidth=2, title="Profit")

// Bollinger Bands 1
length = 20
src1 = close
mult = 1.0
basis = sma(src1, length)
dev = mult * stdev(src1, length)
upper = basis + dev
lower = basis - dev

// Bollinger Bands 2
length2 = 17
src2 = close
mult2 = 1.0
basis2 = sma(src1, length2)
dev2 = mult2 * stdev(src2, length2)
upper2 = basis2 + dev2
lower2 = basis2 - dev2

// RSI
len = 14
src = close
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)

// Strategy Parameters
RSILL= 42
RSIUL= 70
RSILL2= 42
RSIUL2= 76

rsiBuySignal = rsi > RSILL
rsiSellSignal = rsi > RSIUL
rsiBuySignal2 = rsi > RSILL2
rsiSellSignal2 = rsi > RSIUL2

BBBuySignal = src < lower
BBSellSignal = src > upper
BBBuySignal2 = src2 < lower2
BBSellSignal2 = src2 > upper2

// Strategy Long Signals
Buy = rsiBuySignal and BBBuySignal
Sell = rsiSellSignal and BBSellSignal
Buy2 = rsiBuySignal2 and BBBuySignal2
Sell2 = rsiSellSignal2 and BBSellSignal2

if v1 == true
    strategy.entry("Long", strategy.long, when = Buy, alert_message = "v1 - Buy Signal!")
    strategy.close("Long", when = Sell, alert_message = "v1 - Sell Signal!")

if v2 == true
    strategy.entry("Long", strategy.long, when = Buy2, alert_message = "v2 - Buy Signal!")
    strategy.close("Long", when = Sell2, alert_message = "v2 - Sell Signal!")
    strategy.exit("Stoploss/TP", "Long", stop = stoploss_level, limit = takeprofit_level)


Thêm nữa