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


作成日: 2024-01-19 14:28:03 最終変更日: 2024-01-19 14:28:03
コピー: 1 クリック数: 647
1
フォロー
1617
フォロワー

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

概要

この戦略は,高氏誤差関数に基づく価格変化を計算するP-シグナル指数による量化取引戦略である. P-シグナル指数を使用して価格の傾向と転換点を判断し,それにより入場と退出のタイミングを決定する.

戦略原則

この戦略の核心指標はP-Signal. P-Signalの計算式は以下の通りである.

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

ここでserは価格の順序を,intはnPointsのパラメータを,すなわち,何根のK線を見る.この式は3つの部分から構成される:

  1. nStDevは価格の標準差で
  2. nSmaは,価格の単純移動平均であり,
  3. fErfはゴスの誤差関数である。

この公式の全体的な意味は,価格の移動平均を価格の標準差で割って,sqrt ((2) で標準化して,ゴッホの誤差関数で ((-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-Signalが0より小さく,正に変化したときには多行し,P-Signalが0より大きく,負に変化したときには平行する.

戦略的優位性

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

  1. 高ス誤差関数を使用して価格分布をマッチする.高ス誤差関数は正常分布にうまくマッチする.これは,ほとんどの金融時間序列分布特性と一致する.
  2. 価格の標準差を利用してパラメータを自動的に調整する.これは,戦略パラメータの範囲を広め,市場の変化に対してより敏である.
  3. P-シグナル指数は,トレンドと逆転トレードの優位性を組み合わせている.これは,価格の変動のトレンドと,価格の逆転のポイントの両方を考慮し,トレンド取引と逆転取引の機会を捉えるのに役立ちます.

リスク分析

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

  1. 高頻度取引のリスク.この戦略は,典型的な高頻度取引戦略であり,より多くの取引を生み出し,より高い取引コストと滑り場リスクを負う.
  2. P-シグナル指数は,価格が明確な傾向や規則性がない市場で,大量に偽信号を生成する.
  3. 参数最適化は困難である。公式の複数の参数間の関係は複雑で,参数最適化は比較的困難である。

これらのリスクを軽減するために,フィルタリング条件を増やし,取引頻度を減らす;パラメータの組み合わせと取引コストの設定を最適化;実盤磨き,適切な品種を選択することを考慮することができます.

最適化の方向

この戦略は,以下の方向に,さらに改善できる.

  1. フィルタリング条件を追加して,偽信号を回避する.例えば,他の指標と組み合わせて,ANDまたはOR条件を行い,ノイズの一部をフィルタリングする.
  2. オピティマイズパラメータの組み合わせ 異なる品種と周期でnPointsのサイズを調整し,戦略の安定性を改善する
  3. ダイナミックなパラメータを考慮する.nPointsのパラメータを市場の波動程度に応じて自律的に調整するようにする.これは戦略の強性を改善するかもしれない.
  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.