Chiến lược đảo ngược tín hiệu P

Tác giả:ChaoZhang, Ngày: 2024-01-29 14:44:56
Tags:

img

Tổng quan

Chiến lược đảo ngược tín hiệu P là một chiến lược giao dịch định lượng được xây dựng dựa trên các thông số thống kê và hàm lỗi để xây dựng một không gian tín hiệu xác suất. Nó tích lũy các tín hiệu giao dịch một cách năng động bằng cách theo dõi sự phân phối giá trị cực của một loạt các đường K để nắm bắt các điểm đảo ngược thị trường.

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

Chỉ số cốt lõi của chiến lược này là tín hiệu P, kết hợp các thông số thống kê của đường trung bình động và độ lệch chuẩn và lập bản đồ chúng vào phạm vi từ -1 đến 1 thông qua hàm lỗi Gauss để tạo thành một chỉ số phán đoán định lượng.

Các tham số chiến lược bao gồm Cardinality, ΔErf và Thời gian quan sát. Cardinality kiểm soát kích thước mẫu, ΔErf kiểm soát băng tần chết của hàm lỗi để giảm tần suất giao dịch. Thời gian quan sát kiểm soát thời gian bắt đầu của chiến lược.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược đảo ngược tín hiệu P là nó được xây dựng dựa trên các phân phối xác suất của các thông số thống kê, có thể đánh giá hiệu quả các điểm đặc trưng của thị trường và nắm bắt các cơ hội đảo ngược. so với một chỉ số kỹ thuật duy nhất, nó kết hợp nhiều thông tin thị trường hơn và đưa ra các phán đoán toàn diện và đáng tin cậy hơn.

Ngoài ra, thiết kế tham số của chiến lược được điều chỉnh tốt, cho phép người dùng điều chỉnh không gian tham số theo nhu cầu của riêng họ để tìm sự kết hợp tối ưu. Điều này đảm bảo khả năng thích nghi và linh hoạt của chiến lược.

Phân tích rủi ro

Rủi ro chính của chiến lược đảo ngược tín hiệu P là nó phụ thuộc quá nhiều vào các tham số của phân bố xác suất, dễ bị ảnh hưởng bởi dữ liệu bất thường dẫn đến đánh giá sai.

Tăng tham số Cardinality để tăng kích thước mẫu có thể làm giảm tác động của các sự bất thường dữ liệu.

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

Chiến lược đảo ngược tín hiệu P có thể được tối ưu hóa trong các khía cạnh sau:

  1. Thêm các chỉ số khác để lọc các tín hiệu bất thường, chẳng hạn như tăng mạnh âm lượng.

  2. Xác nhận tín hiệu trên nhiều khung thời gian để tăng tính ổn định của phán đoán.

  3. Tăng các chiến lược dừng lỗ để giảm lỗ đơn.

  4. Tối ưu hóa các thông số để tìm ra sự kết hợp tốt nhất và cải thiện lợi nhuận.

  5. Tích hợp máy học để điều chỉnh tham số động.

Tóm lại

Chiến lược đảo ngược tín hiệu P thiết lập một khuôn khổ giao dịch định lượng dựa trên phân phối xác suất với thiết kế tham số linh hoạt và thân thiện với người dùng. Nó đánh giá hiệu quả các đặc điểm thống kê của thị trường và nắm bắt các cơ hội đảo ngược. Chiến lược có thể được tăng cường hơn nữa về tính ổn định và lợi nhuận thông qua xác thực nhiều chỉ số, tối ưu hóa dừng lỗ và các phương tiện khác. Nó cung cấp một mô hình hiệu quả và đáng tin cậy cho giao dịch thuật toán sử dụng các kỹ thuật định lượng.


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

//@version=5
// **********************************************************************************************************
// 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 RVS © Kharevsky
// **********************************************************************************************************
strategy('P-Signal Strategy RVS.', precision=3, process_orders_on_close=true, pyramiding=0, 
     commission_type=strategy.commission.percent,
     commission_value=0.2)
// Parameters and const of P-Signal.
nPoints = input.int(title='Cardinality:', defval=4, minval=4, maxval=200, group='Parameters of strategy.')
ndErf = input.float(title='|ΔErf|:', defval=0, minval=0, maxval=1, step=0.01, group='Parameters of strategy.')
tStartDate = input(title='Start date:', defval=timestamp('30 Dec 1957 00:00 +0300'), group='Observation time.')
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
    nT = 1.0 / (1.0 + 0.5 * math.abs(x))
    nAns = 1.0 - nT * math.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 = ta.stdev(ser, int)
    nSma = ta.sma(ser, int)
    nStDev > 0 ? fErf(nSma / nStDev / math.sqrt(2)) : math.sign(nSma)
// Data.
float nPSignal = ta.sma(fPSignal(ta.change(ohlc4), nIntr), nIntr)
float ndPSignal = math.sign(nPSignal[0] - nPSignal[1])
bool isStartDate = true
// Reversal Strategy.
strategy.entry('short', strategy.short, when=isStartDate and nPSignal > ndErf and ndPSignal < 0)
strategy.entry('long', strategy.long, when=isStartDate and nPSignal < -ndErf and ndPSignal > 0)
// Plotting. 
hline(+1.0, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false)
hline(-1.0, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false)
hline(-ndErf, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false)
hline(ndErf, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false)
plot(nPSignal, color=color.new(color.blue, 0), style=plot.style_line)
// Table of state.
if barstate.isconfirmed
    var Table = table.new(position=position.bottom_right, columns=3, rows=1, 
     frame_color=color.new(color.orange, 70), frame_width=1, 
     border_color=color.new(color.orange, 70), border_width=1)
    table.cell(table_id=Table, column=0, row=0, 
     text=strategy.position_size > 0 ? 'Long: ' + str.tostring(strategy.position_size) : 'Short: ' + str.tostring(strategy.position_size), 
     text_color=strategy.position_size > 0 ? color.green : color.red)
    table.cell(table_id=Table, column=1, row=0, 
     text='Net P/L: ' + str.tostring(strategy.netprofit, '#.#'), 
     text_color=strategy.netprofit > 0 ? color.green : color.red)
    table.cell(table_id=Table, column=2, row=0, 
     text='Open P/L: ' + str.tostring(strategy.openprofit, '#.#'), 
     text_color=strategy.openprofit > 0 ? color.green : color.red)
// The end.



Thêm nữa