真の強度指数に基づくビットコイン短期取引戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月7日 15:12:08
タグ:

概要

この戦略は,ビットコインの真の強度指数 (TSI) を計算し,ビットコインのアルゴリズム取引を実施するために,RSI指標によってフィルタリングされたロング/ショートポジションを入力することによってビットコイン市場のトレンドを特定する.これは,ビットコインのティックデータをプログラム的に取引したい投資家に適しています.

戦略の論理

この戦略の核は,真の強度指数 (TSI) である.TSIは,価格変動の絶対幅と方向を2倍に均等化し,それによって価格上昇と下落の絶対強度を特定することによって測定する.具体的な計算は以下のとおりである:

  1. 価格変化の割合を計算する
  2. 長期EMAと短期EMAを使用して double_smoothed_pcを生成する.
  3. double_smoothed_abs_pc を生成するために,Pc の絶対値を二重滑らかにします.
  4. TSI の値は double_smoothed_pc を double_smoothed_abs_pc で割って 100 に掛ける

TSIが信号線 tsi2を横切ると長信号が生成される. TSIが tsi2を下回ると短信号が生成される.また,戦略は TSI信号をRSIでフィルタリングする.RSIが50を超えると長信号と,RSIが50を下回ると短信号のみを取ることで,いくつかの誤った信号を避ける.

利点分析

この戦略の利点は以下の通りです.

  1. TSIは,価格動向の絶対強さと方向性を検出し,傾向を把握するのに敏感です.
  2. ダブルEMAは価格変動率を平滑させ 市場の騒音やピークに耐える力があります
  3. RSIフィルターは,騒音による間違った取引をさらに回避します.
  4. 短期取引は,市場における一時的な機会を把握することを可能にします.
  5. この戦略には EMA 期間,RSI パラメーターなど,最適化のための大きなパラメータ調整スペースがあります.

リスク分析

この戦略のリスクは以下のとおりです.

  1. トレンドフォローインジケーターとして,TSIは遅延し,価格転換点を欠く可能性があります.
  2. RSIのフィルタ条件は厳しすぎるので 取引機会を逃す可能性があります
  3. EMAフィルターも有効な信号をフィルタリングします.
  4. 短期取引の取引頻度が高いことは,取引コストとスリップリスクが高くなります.

RSIのフィルタールールを緩和し,EMA期間を短縮することで,遅延エミッションとフィルター効果を減らすことができます.適切なストップロスの戦略を使用して,取引リスクを厳格に制御する必要があります.

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

戦略は以下の側面で最適化できます.

  1. 最適な組み合わせを見つけるために TSI と RSI パラメータを最適化します. 長/短 EMA 期間, RSI パラメーター等を調整します.

  2. マルチファクターモデルを構築するためにより多くの技術指標を導入します.MA,KDなどを追加して各指標の利点を得ることができます.

  3. 低トレンドで長,上昇トレンドで短を避けるためにエントリールールを最適化します.より長い時間枠のトレンドに基づいて方向性を判断します.

  4. ストップ・ロスのストラテジーを最適化します. トレイリング・ストップ・ロス,タイム・ベース・ストップ・ロス,ブレイクアウト・ストップ・ロスなど.

  5. 退場規則を最適化して,早過ぎたり遅すぎたりする退場を避ける.不安定性指標は適切な退出点を決定するのに役立ちます.

  6. 最適な商品に 焦点を当てます

結論

この戦略は,ビットコインの短期トレンドをTrue Strength Indexで識別し,アルゴリズム的なビットコイン取引のためのRSIでシグナルをフィルターする.トレンドを敏感に捉え,ノイズをフィルターする利点もありますが,いくつかの遅れの問題と取引リスクもあります.多面的な最適化は,信頼できるビットコイン取引の専門家アドバイザーを開発するために戦略のパフォーマンスをさらに改善することができます.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


// strategy("True Strength Indicator BTCUSD 15p", shorttitle="TSI BTCUSD 15p",initial_capital=1000, commission_value=0.15, commission_type =strategy.commission.percent, default_qty_value=100 , overlay = false, pyramiding=10, default_qty_type=strategy.percent_of_equity)

//BASED ON True Strength Indicator MTF
resCustom = input(title="Timeframe",  defval="15" )
long = input(title="Long Length",  defval=25)
short = input(title="Short Length",  defval=13)
signal = input(title="Signal Length",  defval=13)
price = request.security(syminfo.tickerid,resCustom,close)


double_smooth(src, long, short) =>
    fist_smooth = ta.ema(src, long)
    ta.ema(fist_smooth, short)
pc = ta.change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(math.abs(pc), long, short)
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
tsi2=ta.ema(tsi_value, signal)
plot(tsi_value, color=color.lime,linewidth=2)
plot(tsi2, color=color.red,linewidth=2)




rsiserie = ta.rsi(price,7)
cciserie = ta.cci(price,14)
stochserie = ta.stoch(price,14,3,3)

plot(rsiserie,color=color.purple)



hline(30, title="Zero")
hline(50, title="Zero",linestyle=hline.style_solid, linewidth=2)
hline(70, title="Zero")

buy = ta.crossover(tsi_value, tsi2) //and rsiserie[1]<25 //and cciserie<-100 and stochserie<20
sell = ta.crossunder(tsi_value, tsi2) //and rsiserie[1]>85 //and cciserie>100 and stochserie>80


alertcondition(buy, title='TSI system', message='Buy signal at!' )
alertcondition(sell, title='TSI system', message='Sell signal at!' )

strategy.entry("BUY", strategy.long, 1, when = buy)
strategy.entry("SELL", strategy.short, 1, when = sell ) 

greentsi =tsi_value
redtsi = tsi2

bgcolor( greentsi>redtsi and rsiserie > 50 ? color.lime : na, transp=90)
bgcolor( greentsi<redtsi and rsiserie < 50 ? color.red : na, transp=90)

yellow1= redtsi > greentsi and rsiserie > 50 
yellow2 = redtsi < greentsi and rsiserie < 50 
bgcolor( yellow1 ? yellow : na, transp=80)
bgcolor( yellow2  ? yellow : na, transp=50)

bgcolor( yellow1 and yellow1[1] ? yellow : na, transp=70)
bgcolor( yellow2  and yellow2[2] ? yellow : na, transp=70)

bgcolor( rsiserie > 70 ? color.lime : na, transp=60)
bgcolor( rsiserie < 30  ? color.red : na, transp=60)


もっと