エラーズ・フィッシャーストカスティック相対活力指数戦略

作者: リン・ハーンチャオチャン開催日:2023年12月22日 12:04:23
タグ:

img

概要

この戦略は,ジョン・エーラーズが本"株式と先物に対するサイバー分析"で提案したエーラーズ・フィッシャーストカスティック相対活力指数指数に基づいている.この戦略は,株式の相対的強さを判断するためにエーラーズ・フィッシャー指数を活用し,入口と出口のためのカスタム取引規則と組み合わせる.

戦略の論理

ストラテジーは,まず,キャンドルスティックの体である閉じる価格 - オープニング価格を計算する.その後,キャンドルスティックの影である高い価格 - 低い価格を計算する.この2つの部分の合計と平均をそれぞれ取ることで,株の勢いを得ます.その後,株の変動率で勢いを割ることで,相対活力指数 (RVI) を得ます.

次に,Ehlers Fisher 式はRVIに適用され,信号値が得られる.信号がトリガーを超えると長くなって,信号がトリガーを下回ると短くなってしまう.また,リスク制御のために固定ストップ損失とトライリングストップ損失が実装される.

利点分析

この戦略は,市場における相対的な強さを効果的に決定する株式のモメンタム特性とストーカスティック指標を統合する. エーラーズ・フィッシャー指標の設計はノイズの影響を軽減し,比較的信頼できる取引信号を生成することができる.活力指標は,株式そのもののトレンド品質と不安定性を反映し,動的指標となっています.

この戦略は,単一のモメントインジケーターまたはストカストティックインジケーターを使用するのと比べて,インジケーターとモデルを有機的に組み合わせ,シグナルの質を改善することができます. 厳格なストップロスのルールにより,戦略は収益性を確保しながらリスクを制御することができます.

リスク分析

この戦略は主にエーラーズ・フィッシャー指標に依存している.市場で急激な変化があるとき,新しい環境に適応するために指標のパラメータを最適化する必要があります.パラメータが正しく設定されていない場合,誤った信号または遅延信号を生成することがあります.

また,戦略そのものに固有の曲線フィットメントリスクはある程度ある.バックテストおよびライブ取引における市場環境が大きく変化した場合,戦略のパフォーマンスは大きく偏り得る.この場合,戦略パラメータは調整され,新しい市場条件に適合するために最適化が必要である.

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

この戦略は,次の側面でさらに最適化できます.

  1. エラーズ・フィッシャー指標のパラメータを最適化して,より高い感度やノイズフィルタリングを行う.

  2. LSTMのような機械学習アルゴリズムで指標をモデル化して より信頼性の高い取引信号を生成します

  3. ATRのような市場変動指標を組み込み,ストップ・ロスの距離を動的に調整する.

  4. 信号の質を改善するために,他の技術的指標と基本指標を組み合わせた多要素モデルへのサポートを追加します.

  5. ダイナミックなエントリー/エグジット基準でオープン/閉鎖ポジションのロジックを最適化.適応型ストップ損失と利益のテクニックを導入する.

結論

この戦略は,市場動向と強さを決定するためにエラーズ・フィッシャーストカスティックRVI指標を利用し,リスクを制御するための合理的なストップ・ロスのメカニズムを設定する.単一指標と比較して,この戦略は複数の指標とモデルを有機的に組み合わせ,ノイズをフィルターし,高品質の信号を提供することができる.パラメータ最適化,モデル融合,適応調整,その他の手段を通じて戦略パフォーマンスをさらに改善する余地があります.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
p = input(10, title = "Length")
FisherStoch(src, len) =>
    val1 = stoch(src, src, src, len) / 100
    val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10
    FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64

CO = close - open
HL = high - low

value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6

num = sum(value1, p)
denom = sum(value2, p)

RVI = denom != 0 ? num / denom : 0

signal = FisherStoch(RVI, p)
trigger = signal[1]
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
    barsSinceEntry := 0
if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Long", strategy.long)
    barsSinceEntry := 0
if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Short", strategy.short)
    barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
    strategy.close_all()
    barsSinceEntry := 0
    
hline(0, title="ZeroLine", color=gray) 
signalPlot = plot(signal, title = "Signal", color = blue)
triggerPlot = plot(trigger, title = "Trigger", color = green)
fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)

もっと