Chiến lược giao dịch thuật toán hiệu suất cao dựa trên mô hình định lượng

Tác giả:ChaoZhang, Ngày: 2023-12-22 13:14:33
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch thuật toán hiệu suất cao dựa trên các mô hình định lượng. Nó sử dụng mô hình khối lượng Modelius làm mô hình cơ bản và mở rộng và tối ưu hóa nó. Chiến lược này có thể nắm bắt các cơ hội giao dịch định lượng trên thị trường và đạt được lợi nhuận ổn định.

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

Cốt lõi của chiến lược này là mô hình khối lượng Modelius. Mô hình này xác định các cơ hội giao dịch định lượng trên thị trường bằng cách phát hiện thay đổi giá và khối lượng. Cụ thể, chiến lược kết hợp giá đóng, giá mở, giá cao nhất, giá thấp nhất để tính toán hướng của đường K hiện tại dựa trên một số quy tắc. Khi hướng đường K thay đổi, chất lượng của cơ hội giao dịch định lượng được đánh giá dựa trên khối lượng giao dịch. Ngoài ra, chiến lược cũng kết hợp chỉ số SAR và chỉ số trung bình động để giúp xác định thời gian vào và ra.

Lý thuyết giao dịch cơ bản là đi dài khi chỉ số vượt qua từ âm đến dương và đi ngắn khi chỉ số vượt qua từ dương đến âm. Ngoài ra, dừng lỗ, lấy lợi nhuận, dừng lỗ kéo theo được thiết lập để kiểm soát rủi ro.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là mô hình khối lượng Modelius có thể xác định hiệu quả các cơ hội giao dịch định lượng. So với các chỉ số kỹ thuật truyền thống, mô hình này chú ý nhiều hơn đến thay đổi khối lượng, rất thực tế trong giao dịch định lượng tần số cao ngày nay. Ngoài ra, các quy tắc nhập vào chiến lược tương đối nghiêm ngặt, có thể tránh bỏ lỡ các cơ hội giao dịch định lượng trong khi giảm khả năng rối loạn càng nhiều càng tốt.

Phân tích rủi ro

Rủi ro chính của chiến lược này là mô hình khối lượng của Modelius không thể tránh hoàn toàn tiếng ồn. Khi có biến động thị trường bất thường, nó sẽ dẫn đến các tín hiệu giao dịch sai. Ngoài ra, các cài đặt tham số trong chiến lược cũng sẽ ảnh hưởng đến kết quả cuối cùng.

Để kiểm soát rủi ro, các tham số có thể được điều chỉnh phù hợp và kết hợp với các chỉ số khác để đánh giá phụ trợ.

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

Ngoài ra, mối tương quan giữa các biến thể khác nhau có thể được nghiên cứu để thiết lập một mô hình điều chỉnh đa biến thể.

Tóm lại

Tóm lại, chiến lược này sử dụng những lợi thế của mô hình định lượng khối lượng Modelius và thiết kế một bộ các chiến lược giao dịch thuật toán có khả năng hoạt động cao. Nó có thể được tối ưu hóa và nâng cao hơn nữa thông qua điều chỉnh tham số, mở rộng mô hình, học máy, vv để có được lợi nhuận tương đối tốt và ổn định trong giao dịch thực tế.


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


//@version=3
strategy(title="strategy modelius volume model ", shorttitle="mvm",overlay=true, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50, overlay=false)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating=input(defval=true, type=bool, title="Oscillating")
normalize=input(defval=false, type=bool, title="Normalize")
vol = useTrueRange == "Always" or (useTrueRange == "Auto" and na(volume))? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close/methodvalue

currclose = na
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = na
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol/barcount : vol


x=isOscillating and directionIsDown ? -res : res

TP = input(0) * 10
SL = input(0) * 10
TS = input(1) * 10
TO = input(3) * 10
CQ = 100

TPP = (TP > 0) ? TP : na
SLP = (SL > 0) ? SL : na
TSP = (TS > 0) ? TS : na
TOP = (TO > 0) ? TO : na

longCondition = crossover(x,0)
if (longCondition)
    strategy.entry("Long", strategy.long)


shortCondition = crossunder(x,0)
if (shortCondition)
    strategy.entry("Short", strategy.short)

strategy.exit("Close Short", "Short", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP)
strategy.exit("Close Long", "Long", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP)

Thêm nữa