이항분포를 기반으로 한 가격 극치값 회귀 전략


생성 날짜: 2023-09-13 16:47:22 마지막으로 수정됨: 2023-09-13 16:47:22
복사: 0 클릭수: 620
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이 전략은 두 가지 분포를 기반으로 한 가격 극대 회귀 전략이라고 불린다. 이 전략은 두 가지 분포 함수를 사용하여 가격의 역전 발생 가능성을 판단하고 쌍 EMA 평행 전략이 거래 신호를 생성하도록 설정한다.

정책의 계산 논리는 다음과 같습니다.

  1. 최근 20개의 K선에서 종결 가격 상승의 수를 계산하고, 지난 100개의 K선에서 상승 주기 비율을 통계로 한다.

  2. 마취주기의 수와 확률 p를 2차 분포 함수로 가져와서, 누적 분포 함수 ((CDF)) 를 계산한다.

  3. CDF에 대해 각각 10일과 20일 EMA 평균선을 계산한다. 빠른 선에서 느린 선을 통과할 때, 가격 극치값이 돌아오는 확률이 높다고 생각되어 구매 신호를 발생시킨다.

  4. 빠른 선이 느린 선을 통과할 때, 가격은 단기 최고점에 있을 수 있으며, 이 때 판매 신호가 발생한다.

이 전략의 장점은 확률 방법을 통해 가격의 극한 반환 시간을 판단하는 것이다. 그러나 파라미터는 시장에 따라 조정해야 하며, 과도한 가짜 신호를 발생시키지 않는다.

전체적으로, 통계적 방법은 물가행동의 법칙을 객관적으로 발견하는데 도움이 된다. 그러나 결국에는 거래자가 시장에 대한 날카로운 판단력을 유지하고, 기술 지표를 보조 도구로 적절하게 사용해야 한다.

전략 소스 코드
/*backtest
start: 2022-09-06 00:00:00
end: 2023-05-01 00:00:00
period: 1d
basePeriod: 1h
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/
// © pieroliviermarquis

//@version=4
strategy("Binomial Strategy", overlay=false, default_qty_type= strategy.percent_of_equity, default_qty_value= 100, slippage=1, initial_capital= 10000, calc_on_every_tick=true)


factorial(length) =>
    n = 1
    if length != 0
        for i = 1 to length
            n := n * i
    n


binomial_pdf(success, trials, p) =>
    q = 1-p
    coef = factorial(trials) / (factorial(trials-success) * factorial(success))
    pdf = coef * pow(p, success) * pow(q, trials-success)
        
        
binomial_cdf(success, trials, p) =>
    q = 1-p
    cdf = 0.0
    for i = 0 to success
        cdf := cdf + binomial_pdf(i, trials, p)
        

up = close[0] > close[1] ? 1 : 0


//long-term probabilities
lt_lookback = 100
lt_up_bars = sum(up, lt_lookback)
prob = lt_up_bars/lt_lookback


//lookback for cdf
lookback = 20
up_bars = sum(up, lookback)
cdf = binomial_cdf(up_bars, lookback, prob)


//ema on cdf
ema1 = ema(cdf, 10)
ema2 = ema(cdf, 20)


plot(cdf*100)
plot(ema1*100, color=color.red)
plot(ema2*100, color=color.orange)


buy = ema1 > ema2
sell = ema1 < ema2


//////////////////////Bar Colors//////////////////

var color buy_or_sell = na

if buy == true
    buy_or_sell := #3BB3E4
else if sell == true
    buy_or_sell := #FF006E
    
barcolor(buy_or_sell)

///////////////////////////Orders////////////////

if buy
    strategy.entry("Long", strategy.long, comment="")

if sell
    strategy.close("Long", comment="Sell")