실제 강도 지수에 기반한 비트코인 단기 거래 전략

저자:차오장, 날짜: 2023-10-07 15:12:08
태그:

전반적인 설명

이 전략은 트루 스트리트 인덱스 (TSI) 를 계산하여 비트코인 시장 트렌드를 식별하고 비트코인의 알고리즘 거래를 구현하기 위해 RSI 지표에 의해 필터링된 긴/단기 포지션을 입력합니다. 비트코인 틱 데이터를 프로그래밍 방식으로 거래하려는 투자자에게 적합합니다.

전략 논리

이 전략의 핵심은 진정한 강도 지수 (TSI) 이다. TSI는 가격 변화의 절대적 규모와 방향을 두 배의 비율 가격 변화를 평평화함으로써 측정하여 가격 상승과 하락의 절대적 강도를 식별합니다. 구체적인 계산은 다음과 같습니다.

  1. % 가격 변화 Pc를 계산합니다
  2. 이중 매끄러운 Pc는 이중 매끄러운 Pc를 생성하기 위해 장기 EMA와 단기 EMA를 사용합니다.
  3. 이중 평평화 Pc의 절대값을 생성하기 위해 double_smoothed_abs_pc
  4. TSI 값은 double_smoothed_pc를 double_smoothed_abs_pc로 나누고 100로 곱한 값입니다.

TSI가 신호선 tsi2를 넘을 때 긴 신호가 생성됩니다. TSI가 tsi2를 넘을 때 짧은 신호가 생성됩니다. 또한 전략은 RSI로 TSI 신호를 필터링합니다. 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)


더 많은