エーラス・フィッシャー相対活力指数戦略


作成日: 2023-12-22 12:04:23 最終変更日: 2023-12-22 12:04:23
コピー: 0 クリック数: 721
1
フォロー
1623
フォロワー

エーラス・フィッシャー相対活力指数戦略

概要

この戦略は,ジョン・エルレスが彼の書帳の株式と期貨の制御分析で提唱したエルレス-フィッシャーランダム相対活力指数指標に基づいて策定された. この戦略は,株式の相対的強さを判断するためにエルレス-フィッシャー指数を使用し,カスタマイズされた取引ルールと組み合わせて買い出します.

戦略原則

この戦略はまず,closing price - opening price,すなわち株の実体部分を計算する.次に,high price - low price,すなわち株の影線部分を計算する.それぞれこの2つの部分の平均を掛け合わせることで,株の動力を計算する.そして,この動力の値を使用して,株の変動を除いて,相対活力指数を得る.

次に,RVIに対するエルス-フィッシャー指数の計算式を適用して,信号値を得る.信号値の上を突破する際は多し,下を突破する際は空にする.さらに,リスク管理のために固定ストップと追跡ストップを設定する.

優位分析

この戦略は,株式の動的特性とランダムな指標を総合的に利用して,市場の相対的な強さを効果的に判断することができる.エルス・フィッシャー指標の設計は,騒音の影響を軽減し,より信頼性の高い取引信号を生成することができる.活力指数は,株式自身の傾向性と変動性を反映し,ダイナミックインジケーターである.

動的指標またはランダムな指標を単独で使用するよりも,この戦略は指標とモデルを有機的に組み合わせることで,信号の質を向上させることができる.厳格な止損規則によって,この戦略は,収益性を保証する前提でリスクを制御することもできる.

リスク分析

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

また,戦略自体にも一定程度の曲線適合リスクがある.テストおよび実体市場の環境が大きく変化した場合,戦略のパフォーマンスは大きな偏差を生じることがあります.このとき,戦略のパラメータを調整したり,新しい市場状況に適応するために取引ルールを最適化したりする必要があります.

最適化の方向

この戦略は,以下の点でさらに最適化できます.

  1. エラーズ-フィッシャー指数のパラメータを最適化して,より敏感にしたり,騒音をフィルターしたりする.

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

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

  4. 複数の要因モデルへのサポートを追加し,他の技術指標と基本指標を統合して信号の質を向上させる.

  5. ポジション開設ロジックを最適化し,ダイナミックな出場条件を設定する.自主的な止損と停止技術を導入する.

要約する

この戦略は,市場動向と強弱を判断するために,アレス・フィッシャーランダム相対活力指数指標を使用し,合理的なストップメカニズム制御リスクを設定する.単一の指標と比較して,この戦略は,複数の指標とモデルの有機的な組み合わせが行われ,ノイズをフィルタリングして高品質の信号を提供する.パラメータ最適化,モデル融合,自主調整などの手段によって,戦略のパフォーマンスをさらに向上させる余地がある.

ストラテジーソースコード
/*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)