資源の読み込みに... 荷物...

FNGUのボリンジャー帯とRSIに基づく量的な取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-29 14:53:47
タグ:

img

概要

この戦略は,ボリンジャーバンドとRSIをベースにしたFNGU定量取引戦略と呼ばれる.これは,FNGU株のために特別に設計された長期戦略である.この戦略は,主にボリンジャーバンドとRSI指標を使用して,株の買い過ぎと売り過ぎの条件を特定し,買い売りシグナルを生成する.

戦略の論理

この戦略の基本的な論理は,ボリンジャーバンドとRSI指標の組み合わせに基づいています.

まず,ボリンジャー帯には三つの線があります.中間線,上線,下線.中間線はn日間の単純な移動平均線で,上線と下線は中間線上下の標準偏差のk倍です.価格が上線または下線に達または触ると,それは株式が過買いまたは過売り状態であることを示します.

この戦略では,ボリンジャーバンドの中央線の期間長さは235日であり,パラメータk値は2である.価格はボリンジャー下線を下回り,または中間線を超えると購入信号を生成し,価格がボリンジャー上線を超えると販売信号を生成する.

RSIは,株の過剰購入/過剰販売レベルを反映する指標である.RSIが70を超えると過剰購入状態を示し,30を下回ると過剰販売状態を示している.この戦略におけるRSIのパラメータ期間長さは2である.

この戦略では,ボリンジャーバンドとRSIインジケーターが一緒に使用されます.RSIがオーバーセールレベルを突破し,価格がボリンジャー下線に触れたり下落したとき,購入信号が生成されます.RSIがオーバーセールレベルから突破し,価格がボリンジャー上線を超えると販売信号が生成されます.

戦略 の 利点

この戦略には以下の利点があります.

  1. ボリンジャー・バンドとRSIを組み合わせることで,買い/売るシグナルがより正確で信頼性が高まります.
  2. ボリンガー帯は過買い/過売価格ゾーンを識別し,RSIは偽信号をフィルターします.両者は互いを補完します.
  3. ショートリスクは考慮する必要はありません
  4. 最適化されたパラメータにより,非常に不安定なFNGUストックに特に適しています.
  5. 自動ストップ損失を導入して 損失リスクを低減します
  6. プログラミングの実現は シンプルで明快で 分かりやすく 変更も容易です

リスク と 解決策

この戦略にはいくつかのリスクもあります.

  1. ボリンガー帯とRSIの両方が偽信号を生成し,簡単にオーバーフィットにつながる可能性があります.パラメータを調整したり,より多くのフィルターを追加することができます.
  2. FNGU自体には高い波動性があります.不適切なストップ損失設定は損失を増やす可能性があります.ストップ損失範囲は拡大する必要があります.
  3. この戦略は,FNGUのような非常に不安定な株のみに適用されます.他の株に対してパラメータを調整する必要があります.
  4. 最適化されているものの,パラメータは市場の変化に伴い時代遅れになり,継続的なモニターと最適化が必要です.

戦略の最適化のための方向性

この戦略をさらに最適化するには,いくつかの方向性があります.

  1. KDJやMACDなどの他の技術指標を追加して より正確な信号を生成します
  2. ボリンジャー帯とRSIのパラメータを最適化し,より多くの株種に対応します.
  3. 機械学習モデルを組み込み より多くのデータで意思決定を支援します
  4. 長期間の取引を導入し,より長い時間枠のデータを利用する.
  5. ソーシャルメディアのデータを活用して 取引シグナルを生成します
  6. 異なるパラメータ設定を迅速にテストするための定量バックテストシステムを開発する.

結論

これは,FNGUなどの非常に不安定な株に特に適した長期戦略である.ボリンジャーバンドとRSIを組み合わせることで,価格逆転の機会を掴むことを目的として,過剰購入/過剰販売価格レベル周辺の取引信号を生成する.その適用性を拡大しパフォーマンスを向上させるために,最適化する余地はまだ大きい.


/*backtest
start: 2023-12-29 00:00:00
end: 2024-01-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Bollinger + RSI + EMA, Double Strategy Long-Only (by EMKM)", shorttitle="1Min Killer", overlay=true)

///////////// RSI
RSIlength = input(2, title="RSI Period Length") // Adjusted RSI period length
RSIoverSold = 50
RSIoverBought = 50
price = close
vrsi = rsi(price, RSIlength)

///////////// Bollinger Bands
BBlength = input(235, minval=1, title="Bollinger Period Length") // Adjusted Bollinger period length
BBmult = 2
BBbasis = sma(price, BBlength)
BBdev = BBmult * stdev(price, BBlength)
BBupper = BBbasis + BBdev
BBlower = BBbasis - BBdev
BBtarget38 = BBbasis + 0.38 * BBdev  // Line at 38% of Bollinger Band width
BBtarget50 = BBbasis + 0.50 * BBdev  // Line at 50% of Bollinger Band width

///////////// EMA
emaLength = input(20, title="EMA Period Length")
ema = ema(close, emaLength)

source = close
buyEntry = crossover(source, BBlower) or (close < BBlower and close > BBbasis) or (low < BBlower and close > BBbasis) // Add condition for low touching Bollinger Band
sellEntry = crossunder(source, BBupper)

///////////// Plotting
plot(BBbasis, color=color.aqua, title="Bollinger Bands SMA Basis Line")
plot(BBupper, color=color.silver, title="Bollinger Bands Upper Line")
plot(BBlower, color=color.silver, title="Bollinger Bands Lower Line")
plot(BBtarget38, color=color.blue, linewidth=2, title="SMA at 38% of BB width")  // Line at 38%
plot(BBtarget50, color=color.green, linewidth=2, title="SMA at 50% of BB width")  // Line at 50%
plot(ema, color=color.orange, title="EMA")  // Plot EMA

///////////// RSI + Bollinger Bands Strategy
longCondition = crossover(vrsi, RSIoverSold) and buyEntry
sellCondition = crossunder(vrsi, RSIoverBought) and close > BBupper

close_long = close > BBbasis
close_short = close < BBbasis

if (not na(vrsi))
    if longCondition
        strategy.entry("Buy", strategy.long, qty=10, stop=BBlower, comment="Buy")
    else
        strategy.cancel(id="Buy")
        
    if close_long
        strategy.close("Buy")

if (sellCondition)
    strategy.entry("Sell", strategy.short, qty=10, stop=BBupper, comment="Sell")
else
    strategy.cancel(id="Sell")

if close_short
    strategy.close("Sell")


もっと