エーラーズ確率サイクル定量取引戦略


作成日: 2024-01-17 16:03:30 最終変更日: 2024-01-17 16:03:30
コピー: 0 クリック数: 793
1
フォロー
1617
フォロワー

エーラーズ確率サイクル定量取引戦略

概要

エラーズのランダムサイクル戦略は,エラーズのランダムサイクル指標を活用して取引信号を生成する量化取引戦略である.この戦略は,ランダム指標と周期指標の優位性を組み合わせて,市場における周期的な機会を捉えることを目的としている.

戦略原則

この戦略は,まず,スムージドサイクルインジケーターを構成し,そのインジケーターに基づいてランダムなインジケーター値を構成する.取引シグナルの生成は,このランダムなインジケーター値の移動平均の交差によって決定される.

具体的には,smoothed周期指標の計算方法は以下の通りである.

smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6

srcは,閉店価格など,入力された価格データである. この指標は,現在の価格と前3時間の価格を組み合わせて,スムーズな周期信号を構成する.

このスムージーされた指標に基づいて,ランダムな指標のサイクルを計算できます.

cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * 
           (smooth - 2 * smooth[1] + smooth[2]) + 
           2 * (1 - alpha) * cycle[1] - 
           (1 - alpha) * (1 - alpha) * cycle[2]

この計算式には,平滑後の周期信号の二次差分数と,前2周期の値が含まれている。αは平滑因子で,新旧周期値の重さを調整している。

最後に,このサイクル指数から0-100のランダム値のvalue1を計算し,value1の10日移動平均に基づいて信号値 signalを構成する.信号の移動平均の上または下を通るとき,取引信号を発する.

戦略的優位性

この戦略は,ランダムな指標と周期的な指標を組み合わせて,その両者の優位性を統合している.この戦略は,単純な移動平均などのトレンド戦略に比べて,周期的な機会をよりうまく捉え,その結果,より優れた効果を得ることができる.

主要な優位性は以下の通りです.

  1. 周期指数は循環パターンを識別し,ランダム指数はxFBの取引タイミングを提供します.
  2. 偽信号を効率的にフィルターする二重指数設計
  3. 異なる市場環境に対応するカスタマイズ可能なパラメータ

戦略リスク

この戦略には以下のリスクがあります.

  1. パラメータの不適切な設定は,取引の頻度,取引手数料,滑り場コストを増加させる可能性があります.
  2. 価格の急激な変動を効果的に処理できず,大きな損失を招く可能性があります.
  3. 周期指標は曲線適合に強い依存性があり,不適切な適合は誤信号を生じさせる可能性がある

リスクは,最適化パラメータ設定,ストップポイント設定,その他のフィルタリング指標との組み合わせなどの方法によって制御できます.

戦略最適化の方向性

この戦略は以下の方向から最適化できます.

  1. ブリン帯,RSIなど,他の技術指標と組み合わせた信号フィルタリングにより,誤った信号を減らす
  2. 市場変動に応じてストップポイントを動的に調整する適応退出メカニズムへの加入
  3. マシン・ラーニングによる自動最適化により,市場に動的に適応できます.
  4. 資金利用率の最適化,利害,利回りなどの手段により資金使用効率の向上

要約する

エレスのランダムサイクル戦略は,ランダム指標と周期指標の総合的な使用の優位性を利用し,二重信号設計によってリスクを効果的に制御し,周期性のある市場においてよりよい収益を得ることができる.さらなる最適化により,この戦略は,推奨される量化取引戦略になる可能性がある.

ストラテジーソースコード
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Stochastic Cyber Cycle 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)
src = input(hl2, title = "Source") 
alpha = input(.07, title = "Alpha")
lag = input(9, title = "Lag")
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
len = input(8, title = "Stochastic len")
cycle = na
if na(cycle[7])
    cycle := (src - 2 * src[1] + src[2]) / 4
else
    cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2]

value1 = stoch(cycle, cycle, cycle, len) / 100
value2 = 2 * ((4 * value1 + 3 * value1[1] + 2 * value1[2] + value1[3]) / 10 - 0.5)

signal = value2
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
    barsSinceEntry := 0
if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1]))
    strategy.entry("Long", strategy.long)
    barsSinceEntry := 0
if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1]))
    strategy.entry("Short", strategy.short)
    barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
    strategy.close_all()
    barsSinceEntry := 0
    
    
plot(0, title="ZeroLine", color=gray) 
plotSrc = signal
cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue)
triggerPlot = plot(plotSrc[1], title = "Trigger", color = green)
fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)