P-Signal マルチタイムフレーム取引戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月28日 16:32:36
タグ:

img

概要

P-Signalマルチタイムフレーム取引戦略は,統計的原則とマルチタイムフレーム分析に基づいた暗号通貨アルゴリズム取引戦略である.この戦略は,ガウスエラー関数とP-Signal指標を使用して,ビットコインの日,週,月チャートに適したモデルを作成し,指数のクロス値が0以上でロングで,トレード変動が0以下のクロス値で終了する.

戦略の論理

P・シグナル戦略の核心指標は,統計標準偏差と単純な移動平均を組み合わせて,市場が正規分布に適合しているか検出するために,ガウス誤差関数を使用して -1 から 1 の範囲に映し出するP・シグナルそのものである.特定の計算式は以下のとおりである:

fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function 

fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator

この戦略は,ビットコインの日,週,月間タイムフレームでP信号指標を計算し,インジケーターが0を超えるとロングになり,0を下回ると退出します.インジケーター値バルブも繰り返しエントリを制御するように設定されています.

利点分析

P信号戦略の最大の利点は,戦略の安定性を向上させるための複数のタイムフレームの使用である.日々のチャートは短期間の市場変動を捉えるが,週期および月間チャートは偽のブレイクをフィルターする.同時に,P信号指標自体は,トレンドの動きの変動を拡大するための予測能力もある.

単一のタイムフレームと比較して,複数のタイムフレームは,変動時期の引き下げを制御するために日々のストップの使用を可能にし,変動する市場の間により高いタイムフレームを使用して取引頻度を減らす.全体として,この組み合わせは,絶対的および相対的な引き下げを最小限に抑えながら利益を最大化することを可能にします.

リスク分析

P-Signal戦略の最大のリスクは,指標そのものが量子トレーダーにとってブラックボックスであることです.この指標の特定の市場への適応性を決定する方法はありません.また,そのパラメータの最適な範囲を決定することもできません.これは,ライブトレーディングで戦略のパフォーマンスが低下する可能性があります.

また,戦略自体にはいくつかの制限があります. 例えば,暴力的な動きを処理できないこと,指標クロスオーバーからの信号の遅延など. これらはすべてライブ取引中に隠された問題になり得ます.

これらの問題を解決するために,指標パラメータを調整し,ストップ損失を最適化し,より多くの補助指標を導入することができます. しかし前提は十分なバックテスト期間を通して安定性をテストすることです.

オプティマイゼーションの方向性

P信号戦略の最適化にはいくつかの方向性があります.

  1. P-シグナル指標パラメータを変更する: nIntr_D, nIntr_Wと nIntr_M,最適なパラメータ組み合わせを見つける

  2. ストップ損失方法を追加: 後ろのストップ損失,時間ストップ損失,ATRストップ損失など,最適なストップ損失を見つける

  3. 補助指標の導入: 特定の市場状況の判断を改善し,例えばMACDを使用して動向を決定する

  4. ポジションサイズを最適化:アカウント使用効率に基づいて動的位置サイズを設定

  5. 機械学習の最適化: ニューラルネットワークや遺伝子アルゴリズムを使用して,グローバルに最適なパラメータを見つける

結論

P-Signalのマルチタイムフレーム取引戦略は,全体的に非常に有望な戦略アイデアです. 統計的原則と技術指標を組み合わせ,安定性を向上させるためにマルチタイムフレーム分析を使用します. 広範なバックテストと最適化を通じていくつかの制限を解決できれば,それを現実的で利用可能な暗号通貨アルゴリズム取引戦略に変換することは完全に可能です.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 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
// A good strategy should be able to handle backtesting.
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy:", precision = 3, pyramiding = 3)
//
// Parameters and const of P-Signal.
//
nPoints_D = input(title = "Number of D Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_W = input(title = "Number of W Bars", type = input.integer, defval = 4, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_M = input(title = "Number of M Bars", type = input.integer, defval = 6, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr_D = nPoints_D - 1
int nIntr_W = nPoints_W - 1
int nIntr_M = nPoints_M - 1
bool bDValveOpen = true
bool bWValveOpen = true
bool bMValveOpen = true
// 
// 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)
//
// Signals for the strategy.
//
float nPSignal_D = sma(fPSignal(change(ohlc4), nIntr_D), nIntr_D)
float ndPSignal_D = sign(nPSignal_D[0] - nPSignal_D[1])
//
float nPSignal_W = sma(security(syminfo.tickerid, "W",fPSignal(change(ohlc4), nIntr_W)), nIntr_W)
float ndPSignal_W = sign(nPSignal_W[0] - nPSignal_W[1])
//
float nPSignal_M = sma(security(syminfo.tickerid, "M",fPSignal(change(ohlc4), nIntr_M)), nIntr_M)
float ndPSignal_M = sign(nPSignal_M[0] - nPSignal_M[1])
//
// P-Signal 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_D, color = color.blue, style = plot.style_line)
//
// Multi Frame Strategy 
// ... Day
if(nPSignal_D < 0 and ndPSignal_D > 0 and bDValveOpen)
    strategy.entry("long_D", strategy.long, 1) 
    bDValveOpen := false
if(nPSignal_D > 0 and ndPSignal_D < 0)
    strategy.close("long_D")
    bDValveOpen := true
// ... Week
if(nPSignal_W < 0 and ndPSignal_W > 0 and bWValveOpen)
    strategy.entry("long_W", strategy.long, 1) 
    bWValveOpen := false
if(nPSignal_W > 0 and ndPSignal_W < 0)
    strategy.close("long_W")
    bWValveOpen := true
// ... Month
if(nPSignal_M < 0 and ndPSignal_M > 0 and bMValveOpen)
    strategy.entry("long_M", strategy.long, 1) 
    bMValveOpen := false
if(nPSignal_M > 0 and ndPSignal_M < 0)
    strategy.close("long_M")
    bMValveOpen := true
// The end.

もっと