Chiến lược Động lực Stochastic

Tác giả:ChaoZhang, Ngày: 2024-01-22 10:13:23
Tags:

img

Tổng quan

Chiến lược Động lực Chế độ Stochastic là một chiến lược giao dịch định lượng kết hợp Chỉ số Động lực Chế độ Stochastic (SMI) và Chỉ số Sức mạnh Tương đối (RSI). Nó sử dụng SMI để xác định các khu vực mua quá nhiều và bán quá nhiều trên thị trường, với chỉ số RSI nhanh hoạt động như một bộ lọc tín hiệu. Nó cũng thực hiện bộ lọc cơ thể để lựa chọn tín hiệu đáng tin cậy hơn.

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

Chỉ số Động lực Stochastic

Chỉ số Động lực Stochastic (SMI) là một chỉ số kỹ thuật phổ biến được sử dụng trong giao dịch định lượng kết hợp sức mạnh của các chỉ số động lực và dao động.

Cụ thể, SMI được tính như sau:

SMI = (Close - (HH + LL) /2)/(0.5*(HH - LL)) * 100

nơi HH là giá cao nhất trong N ngày qua và LL là giá thấp nhất.

Vì vậy, SMI kết hợp cả phán quyết theo xu hướng của động lực và phán quyết đảo ngược của dao động. Giá trị trên 80 được coi là mua quá mức, trong khi giá trị dưới 20 là bán quá mức. Chiến lược tạo ra tín hiệu giao dịch khi SMI đạt đến mức mua quá mức hoặc bán quá mức này.

RSI nhanh

Chỉ số sức mạnh tương đối (RSI) là một chỉ số tiêu chuẩn mua quá mức / bán quá mức. Chiến lược này sử dụng chỉ số RSI nhanh với khoảng thời gian 7 để đánh giá các điều kiện mua quá mức / bán quá mức ngắn hạn.

Các bài đọc dưới 20 được coi là đã bán quá mức, trong khi những người trên 80 được coi là đã mua quá mức theo chỉ số RSI nhanh.

Bộ lọc cơ thể

Chiến lược này cũng thực hiện bộ lọc cơ thể bằng cách kiểm tra kích thước cơ thể nến để lọc các tín hiệu nhất định.

Điều này lọc ra một số tín hiệu sai và tăng độ tin cậy.

Ưu điểm

Kết hợp nhiều chỉ số

Cách tiếp cận này kết hợp SMI, RSI nhanh và bộ lọc cơ thể thành một hệ thống 3 phần mạnh mẽ. Sử dụng nhiều tín hiệu tích hợp cải thiện độ chính xác và tăng tính ổn định.

Phát hiện mua quá mức/bán quá mức

Cả SMI và chỉ số RSI nhanh đều rất tốt để phát hiện xu hướng cạn kiệt. Bằng cách giao dịch đảo ngược trung bình từ các khu vực bị kéo dài quá mức này, chiến lược tuân thủ mua thấp và bán cao.

Giao dịch hai chiều

Khả năng mua cả giảm và tăng ngắn tối đa hóa cơ hội trong các điều kiện thị trường.

Kiểm soát rủi ro

Bộ lọc cơ thể tránh chém bằng cách từ chối tín hiệu ít thuyết phục trong các điều kiện hỗn độn.

Rủi ro

Bánh đấm

Chuyển đổi thường xuyên dài / ngắn mang lại rủi ro whipsaw. tối ưu hóa logic có thể giảm thiểu điều này.

Các ngành nghề đông đúc

Các tín hiệu có thể tập hợp các thành viên thị trường và thúc đẩy sự đảo ngược nhanh chóng khi nhập cảnh.

Bạch Dương Đen

Các sự kiện cực đoan có thể đảo ngược tất cả các mô hình.

Những cải tiến

Tối ưu hóa tham số

Thử nghiệm các khoảng thời gian SMI / RSI khác nhau và ngưỡng bộ lọc cơ thể có thể tiết lộ các giá trị tối ưu cho lợi nhuận cao hơn.

Dừng động

Việc kết hợp các điểm dừng dựa trên biến động hoặc ATR sẽ chứa tốt hơn rủi ro vị trí và danh mục đầu tư.

Học máy

Các mô hình dự đoán mức chỉ số trong tương lai có thể xác định các bước ngoặt sớm hơn. Điều này sẽ tăng cường sức dự đoán.

Kết luận

Tóm lại, bằng cách tích hợp SMI, RSI nhanh và bộ lọc cơ thể, chiến lược này đã tạo ra một hệ thống mua quá mức / bán quá mức khá toàn diện. Cách tiếp cận đa tín hiệu cải thiện độ chính xác, trong khi khả năng giao dịch hai chiều và kiểm soát rủi ro góp phần cân bằng. Với tối ưu hóa tham số và mô hình liên tục, nó cho thấy hứa hẹn để nắm bắt lợi nhuận trong dài hạn.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Thêm nữa