ガウス誤差関数に基づく定量的な取引戦略の分析

作者: リン・ハーンチャオチャン,日付: 2024-01-19 14:28:03
タグ:

img

概要

この戦略は,価格変動を測定するためにガウス誤差関数で計算されたP信号指標に基づいた定量的な取引戦略である.P信号を使用して価格動向とエントリーと出口のターニングポイントを決定する.

戦略の論理

この戦略の核心指標はP信号である.P信号の計算式は:

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

この式は3つの部分から成ります. この式は,次の式で表されます.

  1. nStDevは価格の標準偏差である.
  2. nSmaは価格の単純な移動平均値です.
  3. fErfはガウスの誤差関数です

この公式の意味は,価格の移動平均値を価格の標準偏差で割って,次に標準化のために平方分を割って,最後にガウス誤差関数で (-1, 1) 範囲に映し出することです.つまり,価格変動が平均よりも大きい場合,P信号は1に近いです.価格変動が平均よりも小さい場合,P信号は-1に近いです.

この戦略は,P信号の値と変更のサインを使用して入口と出口を決定します.

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

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

P信号が0未満でポジティブに変わるとロングになります. P信号が0を超えてマイナスに変わるとポジションを閉じます.

利点

この戦略の利点は以下の通りです.

  1. 価格分布に適合するためにガウス誤差関数を使用する.ガウス誤差関数は,ほとんどの金融時間列分布と一致する正常分布に非常に適している.
  2. 価格の標準偏差によってパラメータを自動的に調整する.これは,異なる市場条件において戦略をより堅牢にする.
  3. P-Signalは,トレンドフォローと平均逆転の利点を組み合わせます.価格変動のトレンドと逆転点を考慮し,トレンド取引と逆転取引の両方で機会を把握するのに役立ちます.

リスク

この戦略にはいくつかのリスクもあります:

  1. 高周波取引リスク.典型的な高周波取引戦略として,より多くの取引を生む可能性があるため,より高い取引コストとスリップリスクを負う.
  2. 価格が明確なトレンドやパターンがない場合,P信号は多くの誤った信号を生む可能性があります.
  3. パラメータ最適化が難しい.複数のパラメータ間の複雑な関係により,パラメータ最適化が困難である.

これらのリスクを軽減するために,いくつかの措置を考慮することができます: 取引頻度を減らすためにフィルターを追加し,パラメータの組み合わせと取引コストの設定を最適化し,ライブテストと適切な製品の選択.

強化

さらに改良できる場所があります:

  1. 誤った信号を避けるためにフィルターを追加します.例えば,そして/または他の指標でノイズをフィルタリングします.
  2. パラメータの組み合わせを最適化する.安定性を向上させるために,異なる製品とタイムフレームに nポイントのサイズを調整する.
  3. ダイナミックパラメータを考慮し,市場変動に応じて nポイントを適応的に調整することで,安定性が向上する可能性があります.
  4. 機械学習の方法を組み込み パラメータ,フィルター,クロスプロダクトタイムアップの AI アルゴリズムを使用します

結論

結論として,この戦略の核心構想は,革新的な,ガウス関数と自動的に調整するパラメータを合わせた価格分布である.しかし,高周波取引戦略として,特に高周波取引戦略として,ライブ取引で安定した収益性を得る前に,リスク制御とパラメータ調整に関するさらなるテストと最適化が必要である.


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

もっと