Chiến lược giao dịch định lượng dựa trên hàm lỗi Gaussian


Ngày tạo: 2024-01-19 14:28:03 sửa đổi lần cuối: 2024-01-19 14:28:03
sao chép: 1 Số nhấp chuột: 647
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng dựa trên hàm lỗi Gaussian

Tổng quan

Chiến lược này là một chiến lược giao dịch định lượng P-Signal dựa trên hàm sai số Gaussian để tính toán sự thay đổi giá. Nó sử dụng P-Signal để đánh giá xu hướng giá và điểm biến, từ đó quyết định thời gian nhập và thoát.

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

Chỉ số cốt lõi của chiến lược là P-Signal. Công thức tính toán của P-Signal là:

fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)

Ở đây ser là chuỗi giá, int là tham số nPoints, tức là xem có bao nhiêu đường K. Công thức này bao gồm ba phần:

  1. nStDev là chênh lệch chuẩn của giá;
  2. nSma là giá động trung bình đơn giản;
  3. fErf là hàm sai Gaussian ≠ ≠ ∞.

Toàn bộ công thức này có nghĩa là giá được phân chia theo chênh lệch tiêu chuẩn của giá bằng trung bình di chuyển, sau đó được phân chia theo sqrt ((2)), sau đó được chuẩn hóa, sau đó được lập bản đồ bằng hàm sai số Gaussian vào khoảng ((-1, 1) ≠; nghĩa là nếu giá dao động lớn hơn trung bình, P-Signal gần 1; nếu giá dao động nhỏ hơn trung bình, P-Signal gần −1.

Chiến lược sử dụng giá trị của P-Signal và các ký hiệu thay đổi của nó để quyết định nhập cảnh và xuất cảnh:

strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)  

strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)

Khi P-Signal nhỏ hơn 0 và thay đổi thành tích, hãy làm nhiều; khi P-Signal lớn hơn 0 và thay đổi thành âm, hãy bằng phẳng.

Lợi thế chiến lược

Chiến lược này có những ưu điểm sau:

  1. Sử dụng hàm sai số Gaussian để phù hợp với phân phối giá. Chức năng sai số Gaussian phù hợp tốt với phân phối bình thường, phù hợp với đặc điểm phân phối của hầu hết các chuỗi thời gian tài chính.
  2. Điều này làm cho các tham số chiến lược có phạm vi rộng hơn và nhạy cảm hơn với sự thay đổi của thị trường.
  3. Chỉ số P-Signal kết hợp các ưu điểm của xu hướng và đảo ngược. Nó xem xét cả xu hướng biến động giá và điểm đảo ngược giá, giúp nắm bắt các giao dịch xu hướng và cơ hội đảo ngược.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro, đặc biệt là:

  1. Chiến lược này là chiến lược giao dịch tần số cao điển hình, sẽ tạo ra nhiều giao dịch, chịu chi phí giao dịch cao hơn và rủi ro trượt.
  2. Chỉ số P-Signal có thể tạo ra một lượng lớn tín hiệu giả trong thị trường mà giá không có xu hướng rõ ràng và không có quy tắc.
  3. Tối ưu hóa tham số có khó khăn. Các mối quan hệ giữa nhiều tham số trong công thức là phức tạp, làm cho tối ưu hóa tham số trở nên khó khăn hơn.

Để giảm những rủi ro này, bạn có thể xem xét tăng các điều kiện lọc, giảm tần suất giao dịch; tối ưu hóa các tham số và thiết lập chi phí giao dịch; mài cứng, chọn giống thích hợp.

Hướng tối ưu hóa

Chiến lược này còn có thể được tối ưu hóa hơn nữa, chủ yếu là:

  1. Thêm điều kiện lọc để tránh tín hiệu giả. Ví dụ: kết hợp với các chỉ số khác, thực hiện điều kiện AND hoặc OR, lọc một phần Noise.
  2. Tối ưu hóa bảng tham số. Điều chỉnh kích thước nPoints theo các giống và chu kỳ khác nhau, cải thiện sự ổn định của chiến lược.
  3. Xem xét các tham số động. Cho phép tham số nPoints tự điều chỉnh tùy theo mức độ biến động của thị trường, điều này có thể cải thiện tính mạnh mẽ của chiến lược.
  4. Kết hợp các phương pháp học máy. Sử dụng thuật toán AI để tối ưu hóa các tham số, điều kiện lọc và lựa chọn đa giống.

Tóm tắt

Nhìn chung, ý tưởng cốt lõi của chiến lược này là mới mẻ, sử dụng hàm Gaussian để phù hợp với phân bố giá và tự động điều chỉnh phạm vi tham số. Tuy nhiên, là một chiến lược giao dịch tần số cao, cần phải được thử nghiệm và tối ưu hóa thêm, đặc biệt là kiểm soát rủi ro và điều chỉnh tham số, để có thể ổn định lợi nhuận trong thị trường thực.

Mã nguồn chiến lược
/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// **********************************************************************************************************
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// P-Signal Strategy © Kharevsky
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy", precision = 3)
// Parameters and const of P-Signal.
nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
    nT = 1.0/(1.0 + 0.5*abs(x))
    nAns = 1.0 - nT*exp(-x*x - 1.26551223 + 
     nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + 
     nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + 
     nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
    x >= 0 ? nAns : -nAns
fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
// Strat.
float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr)
float ndPSignal = sign(nPSignal[0] - nPSignal[1])
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
// Plotting. 
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal, color = color.blue, style = plot.style_line)
plot(strategy.position_size, color = color.white, style = plot.style_cross)
// Alerts.
if(strategy.position_size[0] > strategy.position_size[1])
    alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
if(strategy.position_size[0] < strategy.position_size[1])
    alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
// The end.