Phân tích chiến lược giao dịch định lượng dựa trên hàm lỗi Gauss

Tác giả:ChaoZhang, Ngày: 2024-01-19 14:28:03
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ố P-Signal được tính bằng hàm lỗi Gaussian để đo lường sự thay đổi giá. Nó sử dụng P-Signal để xác định xu hướng giá và các điểm chuyển đổi cho các bước vào và ra.

Chiến lược logic

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

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

Ở đây ser đại diện cho chuỗi giá, int đại diện cho tham số nPoints, đó là số thanh để xem lại.

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

Ý nghĩa của toàn bộ công thức là lấy trung bình động của giá chia cho độ lệch chuẩn của giá, sau đó chia cho sqrt (((2) để tiêu chuẩn hóa, và cuối cùng được lập bản đồ đến phạm vi (-1, 1) bằng hàm lỗi Gauss.

Chiến lược sử dụng giá trị của P-Signal và dấu hiệu thay đổi của nó để xác định các bước vào và ra:

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

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

Nó đi dài khi tín hiệu P nhỏ hơn 0 và thay đổi thành dương tính. Nó đóng vị trí khi tín hiệu P lớn hơn 0 và thay đổi thành âm.

Ưu điểm

Những lợi thế của chiến lược này bao gồm:

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

Rủi ro

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Rủi ro giao dịch tần số cao: Là một chiến lược giao dịch tần số cao điển hình, nó có thể tạo ra nhiều giao dịch hơn, do đó chịu chi phí giao dịch cao hơn và rủi ro trượt.
  2. Hiệu suất kém trong các thị trường dao động. P-Signal có thể tạo ra nhiều tín hiệu sai khi giá không có xu hướng hoặc mô hình rõ ràng.
  3. Tối ưu hóa tham số khó khăn. Mối quan hệ phức tạp giữa nhiều tham số làm cho tối ưu hóa tham số khó khăn.

Để giảm những rủi ro đó, một số biện pháp có thể được xem xét: thêm các bộ lọc để giảm tần suất giao dịch; tối ưu hóa sự kết hợp các tham số và thiết lập chi phí giao dịch; thử nghiệm trực tiếp và lựa chọn các sản phẩm phù hợp.

Tăng cường

Có chỗ cho việc nâng cao hơn nữa:

  1. Thêm bộ lọc để tránh tín hiệu sai, ví dụ: và / hoặc với các chỉ báo khác để lọc một số tiếng ồn.
  2. Tối ưu hóa sự kết hợp các tham số. Điều chỉnh kích thước của nPoint trên các sản phẩm và khung thời gian khác nhau để cải thiện sự ổn định.
  3. Xem xét các tham số năng động: Điều chỉnh thích nghi nPoints theo biến động thị trường có thể cải thiện độ bền.
  4. Kết hợp các phương pháp học máy. Sử dụng thuật toán AI trên các tham số, bộ lọc và tối ưu hóa thời gian chéo sản phẩm.

Kết luận

Kết luận, ý tưởng cốt lõi của chiến lược này là sáng tạo, phân phối giá phù hợp với hàm Gaussian và điều chỉnh tự động các tham số.


/*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.

Thêm nữa