BEAM 밴드를 기반으로 한 BTC달러 비용 평균화 전략


생성 날짜: 2024-02-18 15:40:42 마지막으로 수정됨: 2024-02-18 15:40:42
복사: 4 클릭수: 670
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

BEAM 밴드를 기반으로 한 BTC달러 비용 평균화 전략

개요

이 전략은 벤 코웬의 위험 레벨 이론에 기반을 두고 있으며, BEAM 파장의 레벨을 사용하여 유사한 방법을 구현하는 것을 목표로 한다. BEAM 파장의 상한은 대칭을 따온 200주 이동 평균이고, 하한은 200주 이동 평균이다. 이것은 우리에게 0에서 1의 범위를 준다. 가격이 0.5 파장의 아래에 있을 때, 구매 지시가 발령되고, 가격이 0.5 파장의 위에 있을 때, 판매 지시가 발령된다.

전략 원칙

이 전략은 주로 벤 코웬 (Ben Cowen) 이 제시한 BEAM 파동 이론에 의존한다. BTC의 가격 변화에 따라 가격을 0에서 1 사이의 10개의 영역으로 나눌 수 있으며, 이 10개의 영역은 10개의 다른 위험 레벨을 나타낸다. 0 레벨은 200주 이동 평균에 가까운 가격을 나타내고, 위험은 최소이다.

가격이 하락할 때, 이 전략은 점진적으로 구매 포지션을 증가시킨다. 구체적으로, 가격이 0에서 0.5의 파동에 있다면, 전략 설정된 매월의 특정 날에 구매 지시가 발령되며, 구매 금액은 파동 번호가 줄어들면서 점진적으로 증가한다. 예를 들어, 파동 5시에는 구매 금액이 월 DCA 총액의 20%이며, 파동 1시에는 구매 금액이 월 DCA 총액의 100%로 증가한다.

가격이 높은 지점으로 올라갈 때, 이 전략은 점진적으로 포지션을 줄인다. 구체적으로, 가격이 0.5 파도를 넘으면, 비율로 판매 지시가 발령되며, 판매 포지션은 파도 번호가 증가함에 따라 점진적으로 증가한다. 예를 들어, 파도 6 때, 6.67%를 판매; 파도 10 때, 모든 포지션을 판매한다.

우위 분석

이 BEAM 파동 DCA 비용 평균 전략의 가장 큰 장점은 BTC의 파동 거래의 특성을 최대한 활용하고 BTC 가격이 하락할 때 상쇄하고 가격이 상승할 때 수익을 창출한다는 것입니다. 이 방법은 구매하거나 판매 할 수있는 기회를 놓치지 않습니다. 구체적인 장점은 다음과 같습니다.

  1. BEAM 이론을 이용해서 자산의 과소평가 정도를 판단하고, 과학적인 위험을 회피하는 방법
  2. BTC의 변동성을 최대한 활용하여 가장 정확한 구매와 판매 기회를 잡을 수 있습니다.
  3. 비용평균을 적용하여 투자비용을 효율적으로 통제하고 장기적으로 안정적인 수익을 얻습니다.
  4. 자동으로 거래하고, 인적 개입이 필요없고, 운영의 위험을 줄여줍니다.
  5. 사용자 정의 가능한 매개 변수, 시장 변화에 적응할 수 있는 유연한 조정 전략.

종합적으로, 이것은 BTC의 불안정한 상황에서 장기적으로 안정적인 수익을 얻을 수 있는 정교한 변수 조절 전략입니다.

위험 분석

BEAM 대역 DCA 전략은 여러 장점이 있지만, 몇 가지 잠재적인 위험도 있습니다. 주요 위험점은 다음과 같이 요약할 수 있습니다.

  1. BEAM 이론과 파라미터 설정은 주관적인 판단에 의존하고 있으며, 잘못된 판단이 발생할 가능성이 있습니다.
  2. BTC의 추세는 예측하기 어렵고, 손실과 손실의 위험이 있습니다.
  3. 자동 거래는 시스템 장애와 파라미터 해킹에 취약합니다.
  4. 과도한 변동은 손실을 확대할 수 있습니다.

위험을 줄이기 위해 다음과 같은 조치를 취할 수 있습니다.

  1. BEAM 이론의 판단 정확성을 높이기 위해 최적화 파라미터 설정;
  2. 적당히 포지션 규모를 축소하여 단편적 손실을 줄여주기
  3. 자동화 거래의 위험성을 줄이기 위해 과잉과 오류 용도를 높여줍니다.
  4. 단독 손실이 너무 커지는 것을 방지하기 위해 스톱포인트를 설정하십시오.

최적화 방향

위와 같은 위험 요소를 고려하여, 이 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. BEAM 이론의 매개 변수를 최적화: 로그법 매개 변수, 재측정 주기 등을 조정하여 모델 판단의 정확도를 향상시킨다.
  2. 포지션 통제를 최적화: 월간 DCA 총액, 매매 비율 등을 조정하여 일회성 손실 위험을 제어합니다.
  3. 자동 거래 보안 모듈을 추가: 과잉 서버, 로컬 처리 등으로 설정하고, 오류 수용력을 향상시킵니다.
  4. 추가된 스톱로스 모듈: 역사적인 변동에 따라 합리적인 스톱로스를 설정하여 손실을 효과적으로 제어한다.

이러한 수단으로 전략의 안정성과 안전성을 크게 향상시킬 수 있습니다.

요약하다

BEAM 파동 DCA 비용 평균 전략은 매우 실전 가치가있는 양적 전략이다. BEAM 이론을 사용하여 거래 결정을 안내하는 데 성공하고, 비용 평균 모델에 의해 구매 비용을 제어한다. 동시에, 위험 관리에 주의를 기울이며, 손실을 방지하기 위해 스톱 스포트를 설정한다. 변수 최적화 및 모듈 추가로, 이 전략은 양적 거래의 중요한 도구가 될 수 있으며, BTC 시장의 장기적인 안정적인 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-02-11 00:00:00
end: 2024-02-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © gjfsdrtytru - BEAM DCA Strategy {
// Based on Ben Cowen's risk level strategy, this aims to copy that method but with BEAM band levels.
// Upper BEAM level is derived from ln(price/200W MA)/2.5, while the 200W MA is the floor price. This is our 0-1 range. 
// Buy limit orders are set at the < 0.5 levels and sell orders are set at the > 0.5 level.
//@version=5
strategy(
  title                 = "BEAM DCA Strategy Monthly", 
  shorttitle            = "BEAM DCA M",
  overlay               = true,
  pyramiding            = 500,
  default_qty_type      = strategy.percent_of_equity,
  default_qty_value     = 0,
  initial_capital       = 0) //}

// Inputs { ————————————————————————————————————————————————————————————————————
T_ceiling   = input.string("Off", "Diminishing Returns", ["Off","Linear","Parabolic"], "Account for diminishing returns as time increases")
day         = input.int(1, "DCA Day of Month",1,28,1,"Select day of month for buy orders.")
DCAamount   = input.int(1000,"DCA Amount",400,tooltip="Enter the maximum amount you'd be willing to DCA for any given month.")
T_buy       = input(true,"Buy Orders","Toggle buy orders.")
T_sell      = input(true,"Sell Orders","Toggle sell orders.")

// Time period
testStartYear   = input.int(2018,   title="Backtest Start Year",    minval=2010,maxval=2100,group="Backtest Period")
testStartMonth  = input.int(1,      title="Backtest Start Month",   minval=1,   maxval=12,  group="Backtest Period")
testStartDay    = input.int(1,      title="Backtest Start Day",     minval=1,   maxval=31,  group="Backtest Period")
testPeriodLen   = input.int(9999,   title="Backtest Period (days)", minval=1,               group="Backtest Period",tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testPeriodStop  = testPeriodStart + testPeriodLen
testPeriod() => true
// ——————————————————————————————————————————————————————————————————————————— }
// Diminishing Returns { ———————————————————————————————————————————————————————
x = bar_index + 1
assetDivisor= 2.5
switch
    T_ceiling == "Linear"   => assetDivisor:= 3.50542 - 0.000277696 * x
    T_ceiling == "Parabolic"=> assetDivisor:= -0.0000001058992338 * math.pow(x,2) + 0.000120729 * x + 3.1982
// ——————————————————————————————————————————————————————————————————————————— }
// Risk Levels { ———————————————————————————————————————————————————————————————
cycleLen = 1400
getMaLen() =>
    if bar_index < cycleLen
        bar_index + 1
    else
        cycleLen

// Define Risk Bands
price       = close
riskLow     = ta.sma(price,getMaLen())
risk1       = riskLow * math.exp((assetDivisor)*0.1)
risk2       = riskLow * math.exp((assetDivisor)*0.2)
risk3       = riskLow * math.exp((assetDivisor)*0.3)
risk4       = riskLow * math.exp((assetDivisor)*0.4)
risk5       = riskLow * math.exp((assetDivisor)*0.5)
risk6       = riskLow * math.exp((assetDivisor)*0.6)
risk7       = riskLow * math.exp((assetDivisor)*0.7)
risk8       = riskLow * math.exp((assetDivisor)*0.8)
risk9       = riskLow * math.exp((assetDivisor)*0.9)
riskHigh    = riskLow * math.exp((assetDivisor))

// Plot Risk Bands
p_low       = plot(riskLow,   "Beam Risk 0.0",color.new(#0042F0,50),3,editable=false)
p_band1     = plot(risk1,     "Beam Risk 0.1",color.new(#0090F5,20),1,editable=false)
p_band2     = plot(risk2,     "Beam Risk 0.2",color.new(#00C6DB,20),1,editable=false)
p_band3     = plot(risk3,     "Beam Risk 0.3",color.new(#00F5BD,20),1,editable=false)
p_band4     = plot(risk4,     "Beam Risk 0.4",color.new(#00F069,20),1,editable=false)
p_band5     = plot(risk5,     "Beam Risk 0.5",color.new(#00DB08,50),3,editable=false)
p_band6     = plot(risk6,     "Beam Risk 0.6",color.new(#E8D20C,20),1,editable=false)
p_band7     = plot(risk7,     "Beam Risk 0.7",color.new(#F2B40C,20),1,editable=false)
p_band8     = plot(risk8,     "Beam Risk 0.8",color.new(#DC7A00,20),1,editable=false)
p_band9     = plot(risk9,     "Beam Risk 0.9",color.new(#F2520C,20),1,editable=false)
p_band10    = plot(riskHigh,  "Beam Risk 1.0",color.new(#F01102,50),3,editable=false)
// ——————————————————————————————————————————————————————————————————————————— }
// Order Execution { ———————————————————————————————————————————————————————————
band5   = price<risk5 and price>risk4
band4   = price<risk4 and price>risk3
band3   = price<risk3 and price>risk2
band2   = price<risk2 and price>risk1
band1   = price<risk1

// DCA buy order weights
y       = DCAamount / 5
switch
    band5 => y:= y * 1
    band4 => y:= y * 2
    band3 => y:= y * 3
    band2 => y:= y * 4
    band1 => y:= y * 5

// Contracts per order
contracts =(y/price)

if testPeriod()
// Buy orders
    if T_buy == true
        if dayofmonth == day
            strategy.entry("Risk Band 5",strategy.long,qty=contracts,when=band5)
            strategy.entry("Risk Band 4",strategy.long,qty=contracts,when=band4)
            strategy.entry("Risk Band 3",strategy.long,qty=contracts,when=band3)
            strategy.entry("Risk Band 2",strategy.long,qty=contracts,when=band2)
            strategy.entry("Risk Band 1",strategy.long,qty=contracts,when=band1)
// Sell orders 
    if T_sell == true
        if strategy.opentrades > 5
            strategy.exit("Risk Band 6",qty_percent=6.67,limit=risk6) 
            strategy.exit("Risk Band 7",qty_percent=14.28,limit=risk7)
            strategy.exit("Risk Band 8",qty_percent=25.00,limit=risk8)
            strategy.exit("Risk Band 9",qty_percent=44.44,limit=risk9)
            strategy.exit("Risk Band 10",qty_percent=100,limit=riskHigh)
// ——————————————————————————————————————————————————————————————————————————— }
// Info { ——————————————————————————————————————————————————————————————————————

// Line plot of avg. entry price
plot(strategy.position_size > 0 ? strategy.position_avg_price : na,"Average Entry",color.red,trackprice=true,editable=false)

// Unrealised PNL
uPNL = price/strategy.position_avg_price

// Realised PNL
realPNL = 0.
for i = 0 to strategy.closedtrades-1
    realPNL += strategy.closedtrades.profit(i)

// Size of open position in ($)
openPosSize = 0.
for i = 0 to strategy.opentrades-1
    openPosSize += strategy.opentrades.size(i) * strategy.position_avg_price

// Size of closed position in ($)
closePosSize = 0.
if strategy.closedtrades > 0
    for i = 0 to strategy.closedtrades-1
        closePosSize += strategy.closedtrades.size(i) * strategy.closedtrades.entry_price(i)

invested    = openPosSize+closePosSize                              // Total capital ($) put into strategy
equity      = openPosSize+closePosSize+strategy.openprofit+realPNL  // Total current equity ($) in strategy (counting realised PNL)
ROI         = (equity-invested) / invested * 100                    // ROI of strategy (compare capital invested to excess return)

// // Info Table
// var table table1 = table.new(position.bottom_right,2,9,color.black,color.gray,1,color.gray,2)

// table.cell(table1,0,0,"Capital Invested",   text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,1,"Open Position",      text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,2,"Average Entry",      text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,3,"Last Price",         text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,4,"Open PNL (%)",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,5,"Open PNL ($)",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,6,"Realised PNL ($)",   text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,7,"Total Equity",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,8,"Strategy ROI",       text_color=color.white,text_halign=text.align_right)

// table.cell(table1,1,0,"$" + str.tostring(invested,                      "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,1,"$" + str.tostring(openPosSize,                   "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,2,"$" + str.tostring(strategy.position_avg_price,   "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,3,"$" + str.tostring(price,                         "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,4,      str.tostring((uPNL-1)*100,                  "#,###.00") + "%",text_halign=text.align_right,text_color = uPNL > 1 ? color.lime : color.red)
// table.cell(table1,1,5,"$" + str.tostring(strategy.openprofit,           "#,###.00"),      text_halign=text.align_right,text_color = uPNL > 1 ? color.lime : color.red)
// table.cell(table1,1,6,"$" + str.tostring(realPNL,                       "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,7,"$" + str.tostring(equity,                        "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,8,      str.tostring(ROI,                           "#,###.00") + "%",text_halign=text.align_right,text_color = ROI > 1 ? color.lime : color.red)
// // ——————————————————————————————————————————————————————————————————————————— }