Chiến lược đi bộ ngẫu nhiên

Tác giả:ChaoZhang, Ngày: 2023-10-09 16:10:24
Tags:

Tổng quan

Chiến lược đi ngẫu nhiên là một chiến lược giao dịch tự động dựa trên việc tạo ra số ngẫu nhiên. Nó sử dụng một máy tạo congruential tuyến tính để tạo ra số ngẫu nhiên dựa trên một bộ hạt giống. Khi số lớn hơn ngưỡng, nó sẽ dài, khi ít hơn, nó sẽ ngắn, thực hiện mục nhập ngẫu nhiên dài / ngắn.

Chiến lược logic

Các phần chính thực hiện giao dịch ngẫu nhiên là:

  1. Đặt các tham số a, c và mô đun m cho việc tạo số ngẫu nhiên, cũng như hạt giống ban đầu.

  2. Định nghĩa hàm tạo số ngẫu nhiên GetRandom bằng cách sử dụng thuật toán congruential tuyến tính để tạo số ngẫu nhiên giữa 0-m.

  3. Trên mỗi ngọn nến, nếu không có vị trí, so sánh kích thước số ngẫu nhiên được tạo ra, đi dài khi lớn hơn m/2, nếu không đi ngắn.

  4. Thiết lập các điều kiện dừng lỗ và lấy lợi nhuận theo tỷ lệ phần trăm.

  5. Đặt thời gian backtest theo khung thời gian.

Thông qua các bước trên, chiến lược thực hiện hoàn toàn các hoạt động dài / ngắn ngẫu nhiên. Khi số ngẫu nhiên lớn hơn m / 2, nó mở vị trí dài, nếu không nó sẽ mở ngắn, sau đó đặt dừng lỗ và lấy lợi nhuận để thoát khỏi các vị trí. Thời gian kiểm tra lại có thể tùy chỉnh.

Phân tích lợi thế

  • Đơn giản và rõ ràng chiến lược logic, dễ hiểu và thực hiện.

  • Giao dịch ngẫu nhiên có hiệu quả tránh tác động cảm xúc và giảm các hoạt động sai lệch chủ quan.

  • Các thông số tạo số ngẫu nhiên có thể tùy chỉnh để điều chỉnh tính ngẫu nhiên.

  • Các thiết lập dừng lỗ và lấy lợi nhuận linh hoạt để kiểm soát lợi nhuận / lỗ duy nhất.

  • Hỗ trợ tối ưu hóa tham số thông qua kiểm tra hậu quả của các tham số khác nhau về tác động đến tổng lợi nhuận.

Phân tích rủi ro

  • Giao dịch ngẫu nhiên có thể dẫn đến xu hướng dài hạn không xác định và lợi nhuận không chắc chắn.

  • Không thể điều chỉnh các vị trí dựa trên điều kiện thị trường, có thể bỏ lỡ cơ hội xu hướng.

  • Lợi nhuận duy nhất hạn chế, rủi ro rút tiền cao.

  • Cần tỷ lệ dừng lỗ/lấy lợi nhuận hợp lý để tránh tổn thất đáng kể.

  • Các vị trí mở / đóng thường xuyên do ngẫu nhiên làm tăng chi phí giao dịch.

  • Xét nghiệm ngược đủ để xác minh các thiết lập tham số hợp lý, không sử dụng mù quáng.

Rủi ro có thể được giảm bằng cách thêm phán đoán xu hướng, tối ưu hóa cơ chế dừng lỗ, kiểm soát chặt chẽ lợi nhuận / lỗ duy nhất v.v.

Hướng dẫn cải thiện

  • Thêm phán đoán xu hướng để tránh giao dịch chống lại xu hướng.

  • Thêm kích thước vị trí dựa trên sự thay đổi vốn.

  • Tối ưu hóa thuật toán tạo số ngẫu nhiên để có sự ngẫu nhiên tốt hơn.

  • Tỷ lệ dừng lỗ / lấy lợi nhuận năng động.

  • Giới hạn tần số lệnh.

  • Tối ưu hóa backtest đa tham số.

Tóm lại

Chiến lược đi bộ ngẫu nhiên thực hiện giao dịch cơ học thông qua số ngẫu nhiên kiểm soát dài / ngắn. Nó có sự ngẫu nhiên mạnh mẽ và tránh tác động cảm xúc và sai sót chủ quan. Nhưng các mục nhập ngẫu nhiên cũng có thể bỏ lỡ cơ hội xu hướng, lợi nhuận duy nhất hạn chế, cần cơ chế kiểm soát rủi ro tối ưu hóa. Nhìn chung chiến lược phù hợp để xác minh ý tưởng giao dịch, đánh giá tác động của tham số, nhưng cần đánh giá cẩn thận để sử dụng thực tế.


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

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Thêm nữa