双方向のEMAクロス量子取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-24 17:31:41
タグ:

img

概要

この戦略は,市場の主なトレンド方向を決定するために二方向EMA指標を使用し,RSI指標をエントリー選択のタイミングとして組み合わせ,これはトレンドフォローアルゴリズム取引戦略に属します.

戦略原則

  1. 異なるサイクルを持つ複数のEMAグループを計算し,短期,中期,長期の3次元で市場の主要トレンド方向を特定する.
  2. 短期EMAが中長期EMAを超えると,上昇傾向が形成されたと判断されます.
  3. 短期EMAが中長期EMAを下回ると,下落傾向が形成されていると判断されます.
  4. 適当なエントリータイミングを見つけるためにRSIインジケータを組み合わせます.RSIインジケータは,過剰購入と過剰販売ゾーンを決定するために使用できます.
  5. 上昇傾向では,RSIインジケーターが低いレベルにあるとき,ロングに行く.下降傾向では,RSIインジケーターが高いレベルにあるとき,ショートに行く.

上記の戦略は主に二方向 EMA インディケーターを使用して主要なトレンド方向を決定し,RSI インディケーターをエントリー信号選択として使用し,これはアルゴリズム取引戦略に従う典型的なトレンドに属します.

利点分析

この戦略の最大の利点は,市場の主要なトレンド方向を明確に決定し,RSI指標に基づいてより良いエントリータイミングを選択できるということです.具体的利点は以下の通りです.

  1. 複数の時間次元で市場の主要トレンド方向を特定するために複数のセットのEMAを使用する
  2. EMA指標の計算は,低騒音でシンプルで,市場の主要な傾向を正確かつ信頼できる方法で決定します.
  3. RSIインジケーターは,収益率を大幅に最適化するために,有効にエントリーとストップ損失点を決定することができます
  4. アルゴリズムの構造は明確で,理解し,修正するのが簡単です.これは戦略をフォローする典型的な傾向です
  5. 戦略の業績をさらに向上させるために,他の技術指標と柔軟に組み合わせることができます.

リスク分析

この戦略には,主に次の側面において,いくつかのリスクがあります.

  1. トレンドが逆転すると,ストップ・ロスのポイントはあまりにも理想化され,損失が増加する可能性があります
  2. 傾向の逆転点を効果的に決定できず,損失を間に合うようにする機会を逃す可能性があります.
  3. EMA パラメータと RSI パラメータは,繰り返しテストと最適化が必要で,そうでなければ不安定を引き起こす可能性があります.
  4. すべてのエントリが完璧なタイミングであることを保証することはできません,不必要な複数の繰り返しがある可能性があります
  5. 突発的な出来事の影響下では,大きなギャップを効果的に回避することは困難です

上記のリスクに対処するために,以下の分野での最適化が可能である.

  1. 過剰な損失を防ぐために合理的に停止損失を設定する
  2. 他の指標を増加させ,トレンド逆転を決定し,時宜のストップ損失を確保する.
  3. より広範な市場状況に適応するためにパラメータの組み合わせを最適化
  4. 繰り返しの数を減らすためにエントリーとストップ損失ロジックを変更
  5. 市場格差の悪影響を避けるため,例外判断を増やす

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

この戦略の利点とリスクから,次の最適化可能な方向性を得ることができます.

  1. 既存の二方向EMAフレームワーク上で,トレンド逆転点を判断するためのMACDとBOLLのような指標を導入し,それによって利益とストップ損失戦略を最適化します.
  2. 傾向の逆転の可能性を予測し,戦略のパフォーマンスをさらに改善するために機械学習モデルを導入する
  3. 先進的なフィルターを適用して,異常な市場状況を自動的に特定し,損失を効果的に防止する
  4. 遺伝子アルゴリズム,深層強化学習,その他の方法を使用して,パラメータを自動的に最適化し,戦略がより多くの市場タイプに適応できるようにします.
  5. 自動ストップ損失モジュールを追加,動的に実際の状況に応じてストップ損失点を調整することができます

より多くの指標,予測モデル,パラメータ最適化,リスク管理モジュール,その他の手段を導入することで,この戦略はより複雑で不安定な市場状況に適応するためにさらに改善することができます.

結論

この記事では,二方向EMAクロス定量取引戦略の主な内容を詳細に紹介しました.まず,戦略の主要なアイデアと運用原則を概説しました.次に戦略の利点が完全に分析されました.同時に,戦略の主要な潜在的なリスクも分析しました.この根拠に基づいて,いくつかの主要な最適化可能な方向が提案されました.要約すると,この戦略は市場の主要な傾向を決定する利点があり,典型的な定量取引戦略である最適化にもいくつかの余地があります.継続的な改善と最適化によって,この戦略は投資者にとって重要な選択になり得ます.


/*backtest
start: 2023-01-23 00:00:00
end: 2024-01-23 00:00:00
period: 4h
basePeriod: 15m
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/
// © Investoz
// Indikatorn är byggd som ett utbildningsyfte och är därför ingen rekommendation för köp/sälj av aktier. Tanken är att skapa en visuell form i en graf
// som visar om det finns någon trend såväl positiv som negativ. En dialogruta med en varning talar om vilken trend som råder. I koden finns en möjlighet
// att ta position eller gå ur position om man vill skapa en startegi kring denna trendindikator. Rekommenderar dock starkt att inte enbart förlita sig på denna
// indikator som beslut för köp/sälj då resultaten blir negativa om man köper på psoitiv trend och säljer på negativ trend. Det måste kombineras med andra idéer
// och därför fungerar denna skript mer som ett komplement till sin egen strategi.
// Det är fritt fram för vem som helst att använda sig av denna indikator.  
//@version=4
//Skapar en strategiskript med 5 % av eget kapital som ett exempel. Detta går att ändra i skriptets inställningar, välj egenskaper och sedan ändra orderstorlek
//till ett annat värde av % på eget kapital.
strategy("© Investoz trendvarningar", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
//Lägger till inmatningar till skriptindikatorn. Användaren kan se och redigera inmatningar i objektdialogen efter eget val.
ema1 = input(21, minval=1, maxval=500, title="Lila linje")
valema1=input(true, title="Visa lila linje")
ema2 = input(34, minval=1, maxval=500, title="Blå linje")
valema2=input(true, title="Visa blå linje")
ema3 = input(55, minval=1, maxval=500, title="Grön linje")
valema3=input(true, title="Visa grön linje")
ema4 = input(89, minval=1, maxval=500, title="Gul linje")
valema4=input(true, title="Visa gul linje")
ema5 = input(141, minval=1, maxval=500, title="Orange linje")
valema5=input(true, title="Visa orange linje")
ema6 = input(230, minval=1, maxval=500, title="Röd linje")
valema6=input(true, title="Visa röd linje")
ema7 = input(371, minval=1, maxval=500, title="Röd linje")
valema7=input(true, title="Visa röd linje")
//Inmatningar för antal staplar
startbar = input(1, minval=1, maxval=1, title="Första stapeln")
Endbar = bar_index
//Källa input, stängning. Användaren kan själv byta till vilken källa som önskas.
src = input(close, title="Source")
//Antal staplar sedan den längsta ema började och framåt. 
tid=Endbar + startbar - 371
//EMA loop
aema1 = ema(src, ema1)
bema2 = ema(src, ema2)
cema3 = ema(src, ema3)
dema4 = ema(src, ema4)
eema5 = ema(src, ema5)
fema6 = ema(src, ema6)
gema7 = ema(src, ema7)
//Skriver ut linjer i diagrammet om förhållandet är sant, annars falskt.
h=plot(valema1 ? aema1 : na, title="Lila linje", style=plot.style_line, linewidth=1, color=color.purple)
i=plot(valema2 ? bema2 : na, title="Blå linje", style=plot.style_line, linewidth=1, color=color.blue)
j=plot(valema3 ? cema3 : na, title="Grön linje", style=plot.style_line, linewidth=1, color=color.green)
k=plot(valema4 ? dema4 : na, title="Gul linje", style=plot.style_line, linewidth=1, color=color.yellow)
l=plot(valema5 ? eema5 : na, title="Orange linje", style=plot.style_line, linewidth=1, color=color.orange)
m=plot(valema6 ? fema6 : na, title="Röd linje", style=plot.style_line, linewidth=1, color=color.red)
n=plot(valema7 ? gema7 : na, title="Brun linje", style=plot.style_line, linewidth=1, color=color.maroon)
//Fyller bakgrunden mellan två linjer med en viss färg.
fill(h, i, color = color.purple,transp=34)
fill(i, j, color = color.blue,transp=34)
fill(j, k, color = color.green,transp=34)
fill(k, l, color = color.yellow,transp=34)
fill(l, m, color = color.orange,transp=34)
fill(m, n, color = color.red,transp=34)
//Skapa en algoritm för positiv trend
PositivTrend = crossover(aema1,gema7)?1:0
TrendPositiv = ema(close,1) > aema1 and aema1 > bema2?1:0
//Skapa en algoritm för negativ trend
NegativTrend = crossunder(aema1,gema7)?1:0
TrendNegativ = ema(close,1) < aema1 and aema1 < bema2?1:0
//Skapar en textruta med varningstext för positiv trend
varningtextpositiv = "Varning för positiv trend."+"\n" + "Leta efter att ta position!"
// if PositivTrend
//     varningpositiv=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.green,
//      text=varningtextpositiv,
//      style=label.style_label_down,
//      textalign=text.align_left)
//Skapar en textruta med varningstext för negativ trend
varningtextnegativ = "Varning för negativ trend."+"\n" + "Leta efter utgången!"
// if NegativTrend
//     varningnegativ=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.red,
//      text=varningtextnegativ,
//      style=label.style_label_up,
//      textalign=text.align_left)
//Köp om positiv trend
if (PositivTrend) 
    strategy.entry("Ta position", strategy.long, when = PositivTrend)
//Sälj om negativ trend
if (NegativTrend)
    strategy.close("Ta position", when = NegativTrend, comment="Gå ur position")
//Beräkning av positiv trend
vspositiv(positiv)=>valuewhen(Endbar==startbar,positiv,0)
vepositiv(positiv)=>valuewhen(Endbar==Endbar,positiv,0)
positivmean(TrendPositiv)=>
    csumpositiv = cum(TrendPositiv)
//Slut//   
    a = vepositiv(csumpositiv)
//Start//
    b = vspositiv(csumpositiv)
//Slut - Start// 
    (a - b)/(tid)
positivmeanpositiv = positivmean(TrendPositiv) 
//Beräkning av negativ trend
vsnegativ(negativ)=>valuewhen(Endbar==startbar,negativ,0)
venegativ(negativ)=>valuewhen(Endbar==Endbar,negativ,0)
negativmean(TrendNegativ)=>
    csumnegativ = cum(TrendNegativ)
//Slut//   
    a = venegativ(csumnegativ)
//Start//
    b = vsnegativ(csumnegativ)
//Slut - Start// 
    (a - b)/(tid)
negativmeannegativ = negativmean(TrendNegativ) 
//Inmatning av text som ska in i texruta som visar antal staplar i trend
logga = "© Investoz: Trend i tid"+ "\n"
streck = "--------------------------------------------------------"
totalastaplar = "\n" + "Dagar totalt: " + tostring(tid)+ " dagar "+"\n"+ streck + "\n"
totalpositiv = "Dagar totalt i positiv trend "+" 📈 : "  +tostring(positivmeanpositiv*tid, "##.##") +" dagar " + "\n"
totalnegativ = "\n" + "Dagar totalt i negativ trend" + " 📉 : "  +tostring(negativmeannegativ*tid, "##.##") +" dagar " 
//Textruta för antal staplar i trend
// if barstate.ishistory
//     barcountlbl=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.yellow,
//      text=logga+streck+totalastaplar+totalpositiv+streck+totalnegativ,
//      style=label.style_label_lower_left,
//      textalign=text.align_left)
//     label.delete(barcountlbl[1])
////////////////////////////////// 

もっと